一、原理介紹
1.可擴展性
2.數據一致性的相關特性
3.多設備管理及快照
二、命令介紹與實戰
1.命令介紹
2.命令實戰
1)環境準備,添加3塊磁盤/dev/sd{b,c,d}如下:
2)創建btrfs文件系統
3)查看已創建的btrfs文件系統
4)掛載btrfs文件系統,啟用壓縮功能
5)在線調整文件系統大小
6)往當前btrfs文件系統添加設備,以達到在線擴容擴容目的
7)執行chunk重新均衡
8)修改chunk的profile屬性
9)輸出btrfs文件系統簡要信息
10)拆除設備
11)創建子卷
12)單獨掛載子卷
13)創建快照
14)刪除子卷和快照
15)btrfs與ext4文件系統之間相互轉換
一、原理介紹
BtrFS(B-tree文件系統,又稱為Butter FS或Better FS),2007由oracle開源后,得到了IBM、intel等廠商的大力支持,其目標計劃是替代linux目前的ext3/4,成為下一代linux標準的文件系統。
支持寫時復制(CoW)、快照、在線擴容縮容、數據checksum、subvolume、磁盤陣列(raid)等,運行在linux上,并遵循GPL協議的強大文件系統。在2014年8月發布了穩定版。
其特性大致歸納為以下幾點:
1.可擴展性
主要表現在兩個方面:
1)ext系列文件系統使用塊位圖來保存每個塊空閑與否的信息(每個塊用一個位來表示是否空閑),當容量擴展時,塊位圖所占的空間會線性的增加,試想一下如果快位圖變得很大時,那么查找空閑塊就需要大量的時間;BtrFS管理磁盤空間的最小單位是extent,一個extent由一組連續的block組成,extent由extent樹進行管理,因此相比ext系列10個塊需要10個bit來表示,btrfs只需要一個extent就可以,因此減少了元數據的量。對于大文件,extent表現出更加優異的管理性能。
2)ext系統inode是預分配的且大小固定,比如,100G的分區中,inode table只能存放131072個inode,意味著不可能創建131072個文件;同時, inode分配過小,容易導致磁盤空間無法充分利用,過大,容易造成磁盤空間浪費;btrfs為了解決這個問題,使用了動態分配inode,如下圖,每個inode只是FS tree中的一個節點,用戶可以無限制地任意插入新的inode,其物理存儲位置是動態分配的,所以沒有對文件個數的限制。
FS Tree:管理文件相關的元數據,如inode、dir等
Chunk Tree:管理設備,每個磁盤設備都在Chunk Tree中有一個item
Extent Tree:管理磁盤空間的分配
checksum Tree:保存數據塊的校驗和
2.數據一致性的相關特性
btrfs的數據一致性是通過COW(Copy On Write)事務來保證的,所謂COW,即每次寫磁盤數據時,先當前塊數據復制到一個新塊,然后在新塊上進行更新寫入,當新塊寫入完成時,只需將原來指向舊塊的指針指向新塊。
所謂的事務就是要保證一個操作的原子性(假設一個操作由多個步驟組成,只有所有步驟都成功這個操作才算成功,否則只要其中一個步驟失敗,則整個操作失敗,那么整個數據都要回滾到操作前的相同狀態)
COW只能保證單一數據更新的原子性,但文件系統中很多操作需要更新多個不同的元數據,如何保證這些操作的原子性呢?下面以創建一個文件為例說明,創建一個文件需要設計到如下操作:
1) 修改extent數,分配一段磁盤空間
2) 創建一個新的inode,并插入到FS樹
3) 增加一個目錄項,插入到FS數
因此需要將上面的3個操作當成一個事務整體來處理,只要其中一個操作失敗,文件便不能創建成功。過程如下:
A是FS樹的根節點,新的inode信息將被插入節點C。首先,btrfs使用COW將inode插入一個新分配的C‘中,并修改上層節點B,使其指向新的C’,從而B也產生COW節點B‘,以此類推一直連鎖反應到根節點A’,此時因為事務還沒有完成,superblock依然指向A
修改目錄項E,引發相同的過程
最后commit事務,superblock指向新塊
假設上面某個過程操作失敗或中途斷電也不會影響superblock的原來指向,數據依然是操作前的狀態,從而保證了事務的完整性和文件系統的一致性。
btrfs的另一特點是使用checksum來保證數據的可靠性,假設從磁盤讀取一個塊數據,可以通過比較其checksum來判斷數據是否完整,其他文件系統在文件系統級別上是無法得知數據是否損壞的;同時由于checksum數據存儲在checksum樹的節點上,與塊數據是分開管理的,這樣的好處是能避免checksum和數據保存在同一個塊的時候,文件系統上層獲取了一個錯誤位置的塊時無從得知(因為checksum只計算塊數據是否完整而不是數據應該存在哪個塊,只要塊內數據并無損壞,checksum永遠都是正確的)。
3.多設備管理及快照
-
btrfs可以跨越多個物理磁盤設備,動態的增加/減少設備來達到擴容/縮容的目的,技術上還支持(raid0、raid1、raid5、raid10等特性)
-
可以利用COW技術創建卷級別和文件級別的快照
-
支持在一個文件系統(或邏輯卷)上創建子卷,并沒有層級限制,并且所有卷的空間大小都是可以動態調整的。其應用場景是可以為每個用戶分配一個單獨隔離的卷空間,來達到權限控制和配額管理的目的。
理論部分就介紹那么多,下面咱們開始實戰(操作基于centos7.2):
二、命令介紹與實戰
1.命令介紹
btrfs文件系統使用btrfs命令來管理,其使用格式如下: btrfs <command> [<args>] <command>: balance: 用于均衡單個或多個設備間的chunk;以及轉換其屬性 check:用于離線檢查 device:用于管理設備,包括設備的增加、刪除、掃描等 filesystem:管理文件系統,包含標簽設置/同步等 inspect-internal:給開發者用來調試的工具 property:獲取和設置btrfs對象的屬性 qgroup:管理配額組 quota:管理配額,如啟動配額、重新掃描配置等 receive:還原時,用于從標準輸入或file中接收子卷數據 replace:替換設備 rescue:嘗試修復損壞的文件系統 restore:在文件系統非掛載狀態下,嘗試還原損壞的btrfs文件系統 scrub:用來修復文件系統錯誤的,會讀取文件系統所有的數據以及其校驗和 send:備份時,用于發送子卷數據到文件或標準輸出 subvolume:創建、刪除、列出、管理子卷或快照
2.命令實戰
1)環境準備,添加3塊磁盤/dev/sd{b,c,d}如下:
[root@centos7-template ~]# parted -l | grep -i '^disk /dev/sd.' Disk /dev/sda: 129GB Disk /dev/sdb: 21.5GB Disk /dev/sdc: 21.5GB Disk /dev/sdd: 21.5GB
2)創建btrfs文件系統
[root@centos7-template ~]# mkfs.btrfs -L "mydata" -d raid0 /dev/sd{b,c} btrfs-progs v3.19.1 See http://btrfs.wiki.kernel.org for more information. Turning ON incompat feature 'extref': increased hardlink limit per file to 65536 Turning ON incompat feature 'skinny-metadata': reduced-size metadata extent refs adding device /dev/sdc id 2 fs created label mydata on /dev/sdb nodesize 16384 leafsize 16384 sectorsize 4096 size 40.00GiB
-L: 指定卷標
-d:指定data profile,可選的profile為:raid0/1/5/6/10,dup,single
3)查看已創建的btrfs文件系統
[root@centos7-template ~]# btrfs filesystem show Label: 'mydata' uuid: 7f0ca4e4-1823-4cf1-87d4-44a5190ed32a Total devices 2 FS bytes used 112.00KiB devid 1 size 20.00GiB used 2.03GiB path /dev/sdb devid 2 size 20.00GiB used 2.01GiB path /dev/sdc btrfs-progs v3.19.1 [root@centos7-template ~]# blkid /dev/sdb /dev/sdc /dev/sdb: LABEL="mydata" UUID="7f0ca4e4-1823-4cf1-87d4-44a5190ed32a" UUID_SUB="f616f8a1-7fc1-433b-8377-9d598328cd5b" TYPE="btrfs" /dev/sdc: LABEL="mydata" UUID="7f0ca4e4-1823-4cf1-87d4-44a5190ed32a" UUID_SUB="ba63683b-3443-4627-bfe3-7908ee910b0c" TYPE="btrfs"
4)掛載btrfs文件系統,啟用壓縮功能
[root@centos7-template ~]# mount -t btrfs -o compress=lzo /dev/sdb /mnt [root@centos7-template ~]# df -Th 文件系統 類型 容量 已用 可用 已用% 掛載點 /dev/mapper/centos_centos7--template-root xfs 50G 2.0G 48G 4% / devtmpfs devtmpfs 480M 0 480M 0% /dev tmpfs tmpfs 489M 0 489M 0% /dev/shm tmpfs tmpfs 489M 6.7M 483M 2% /run tmpfs tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/mapper/centos_centos7--template-home xfs 68G 33M 68G 1% /home /dev/sda1 xfs 497M 123M 375M 25% /boot tmpfs tmpfs 98M 0 98M 0% /run/user/0 /dev/sdb btrfs 40G 17M 38G 1% /mnt
5)在線調整文件系統大小
[root@centos7-template ~]# btrfs filesystem resize -10G /mnt Resize '/mnt' of '-10G' [root@centos7-template ~]# df -Th 文件系統 類型 容量 已用 可用 已用% 掛載點 /dev/mapper/centos_centos7--template-root xfs 50G 2.0G 48G 4% / devtmpfs devtmpfs 480M 0 480M 0% /dev tmpfs tmpfs 489M 0 489M 0% /dev/shm tmpfs tmpfs 489M 6.7M 483M 2% /run tmpfs tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/mapper/centos_centos7--template-home xfs 68G 33M 68G 1% /home /dev/sda1 xfs 497M 123M 375M 25% /boot tmpfs tmpfs 98M 0 98M 0% /run/user/0 /dev/sdb btrfs 30G 17M 18G 1% /mnt [root@centos7-template ~]# btrfs filesystem resize +10G /mnt Resize '/mnt' of '+10G' [root@centos7-template ~]# df -Th 文件系統 類型 容量 已用 可用 已用% 掛載點 /dev/mapper/centos_centos7--template-root xfs 50G 2.0G 48G 4% / devtmpfs devtmpfs 480M 0 480M 0% /dev tmpfs tmpfs 489M 0 489M 0% /dev/shm tmpfs tmpfs 489M 6.7M 483M 2% /run tmpfs tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/mapper/centos_centos7--template-home xfs 68G 33M 68G 1% /home /dev/sda1 xfs 497M 123M 375M 25% /boot tmpfs tmpfs 98M 0 98M 0% /run/user/0 /dev/sdb btrfs 40G 17M 38G 1% /mnt
6)往當前btrfs文件系統添加設備,以達到在線擴容擴容目的
[root@centos7-template ~]# btrfs device add /dev/sdd /mnt #查看掛載點信息 [root@centos7-template ~]# btrfs device usage -h /mnt /dev/sdb, ID: 1 Device size: 20.00GiB Data,RAID0: 1.00GiB Metadata,single: 8.00MiB Metadata,RAID1: 1.00GiB System,single: 4.00MiB System,RAID1: 8.00MiB Unallocated: 17.98GiB /dev/sdc, ID: 2 Device size: 20.00GiB Data,RAID0: 1.00GiB Metadata,RAID1: 1.00GiB System,RAID1: 8.00MiB Unallocated: 17.99GiB /dev/sdd, ID: 3 Device size: 20.00GiB Unallocated: 20.00GiB
7)執行chunk重新均衡
[root@centos7-template ~]# btrfs balance start /mnt Done, had to relocate 5 out of 5 chunks
8)修改chunk的profile屬性
[root@centos7-template ~]# btrfs balance start -f -mconvert=raid1 /mnt Done, had to relocate 2 out of 3 chunks [root@centos7-template ~]# btrfs balance start -f -sconvert=raid1 /mnt Done, had to relocate 1 out of 3 chunks [root@centos7-template ~]# btrfs balance start -f -dconvert=raid1 /mnt Done, had to relocate 1 out of 3 chunks
9)輸出btrfs文件系統簡要信息
[root@centos7-template ~]# btrfs filesystem df -h /mnt Data, RAID1: total=1.00GiB, used=512.00KiB System, RAID1: total=32.00MiB, used=16.00KiB Metadata, RAID1: total=1.00GiB, used=112.00KiB GlobalReserve, single: total=16.00MiB, used=0.00B
10)拆除設備
[root@centos7-template ~]# btrfs device delete /dev/sdd /mnt [root@centos7-template ~]# btrfs filesystem show /mnt Label: 'mydata' uuid: 7f0ca4e4-1823-4cf1-87d4-44a5190ed32a Total devices 2 FS bytes used 448.00KiB devid 1 size 20.00GiB used 1.28GiB path /dev/sdb devid 2 size 20.00GiB used 1.28GiB path /dev/sdc btrfs-progs v3.19.1
11)創建子卷
[root@centos7-template ~]# btrfs subvolume create /mnt/tmp Create subvolume '/mnt/tmp' [root@centos7-template ~]# ls /mnt tmp [root@centos7-template ~]# btrfs filesystem show Label: 'mydata' uuid: 7f0ca4e4-1823-4cf1-87d4-44a5190ed32a Total devices 2 FS bytes used 464.00KiB devid 1 size 20.00GiB used 1.28GiB path /dev/sdb devid 2 size 20.00GiB used 1.28GiB path /dev/sdc btrfs-progs v3.19.1 #查看子卷的摘要信息,此時可看到子卷的初始容量為1G [root@centos7-template ~]# btrfs filesystem df -h /mnt/tmp Data, RAID1: total=1.00GiB, used=320.00KiB System, RAID1: total=32.00MiB, used=16.00KiB Metadata, RAID1: total=256.00MiB, used=128.00KiB GlobalReserve, single: total=16.00MiB, used=0.00B #查看子卷id及path [root@centos7-template ~]# btrfs subvolume list /mnt/tmp ID 263 gen 67 top level 5 path tmp #列出當前所有子卷的id及path [root@centos7-template ~]# btrfs subvolume list /mnt ID 263 gen 67 top level 5 path tmp #通過路徑查看卷信息 [root@centos7-template ~]# btrfs subvolume show /mnt /mnt is btrfs root [root@centos7-template ~]# btrfs subvolume show /mnt/tmp /mnt/tmp Name: tmp uuid: 0e6af78b-849f-a84e-9529-3280ec096201 Parent uuid: - Creation time: 2016-06-02 20:42:09 Object ID: 263 Generation (Gen): 67 Gen at creation: 67 Parent: 5 Top Level: 5 Flags: - Snapshot(s): #往子卷中創建一個2G大小的文件(超過初始分配的1G容量) [root@centos7-template /]# cd /mnt/tmp [root@centos7-template tmp]# dd if=/dev/zero of=./data bs=1M count=2048 記錄了2048+0 的讀入 記錄了2048+0 的寫出 2147483648字節(2.1 GB)已復制,1.16797 秒,1.8 GB/秒 #此時發現子卷的容量自動擴展為3G [root@centos7-template tmp]# btrfs filesystem df -h /mnt/tmp Data, RAID1: total=3.00GiB, used=2.00GiB System, RAID1: total=32.00MiB, used=16.00KiB Metadata, RAID1: total=256.00MiB, used=2.22MiB GlobalReserve, single: total=16.00MiB, used=0.00B
12)單獨掛載子卷
[root@centos7-template tmp]# mkdir /root/tmp [root@centos7-template tmp]# mount -o subvol=tmp /dev/sdb /root/tmp [root@centos7-template tmp]# ll /root/tmp 總用量 2097152 -rw-r--r--. 1 root root 2147483648 6月 2 21:10 data
13)創建快照
命令語法如下:
snapshot [-r] |[/]
加上-r參數快照卷為只讀,否則為讀寫
[root@centos7-template tmp]# btrfs subvolume snapshot -r /mnt/tmp /mnt/tmp-snapshot Create a readonly snapshot of '/mnt/tmp' in '/mnt/tmp-snapshot' [root@centos7-template tmp]# ls /mnt/tmp-snapshot/ data #往原卷添加數據,快照卷的內容并未改變 [root@centos7-template tmp]# touch /mnt/tmp/test.txt [root@centos7-template tmp]# ls /mnt/tmp-snapshot/ data
14)刪除子卷和快照
[root@centos7-template mnt]# btrfs subvolume delete /mnt/tmp Delete subvolume (no-commit): '/mnt/tmp' [root@centos7-template mnt]# ll tmp-snapshot/ 總用量 2097152 -rw-r--r--. 1 root root 2147483648 6月 2 21:10 data [root@centos7-template mnt]# btrfs subvolume delete /mnt/tmp-snapshot/ Delete subvolume (no-commit): '/mnt/tmp-snapshot' [root@centos7-template mnt]# ls [root@centos7-template mnt]#
15)btrfs與ext4文件系統之間相互轉換
[root@centos7-template mnt]# mkfs.ext4 /dev/sdd [root@centos7-template mnt]# mount /dev/sdd /root/tmp [root@centos7-template mnt]# vim /root/tmp/test.txt first line. [root@centos7-template mnt]# umount /dev/sdd [root@centos7-template mnt]# btrfs-convert /dev/sdd creating btrfs metadata. copy inodes [o] [ 0/ 12] creating ext2fs image file. cleaning up system chunk. conversion complete. [root@centos7-template mnt]# mount /dev/sdd /root/tmp [root@centos7-template mnt]# cat /root/tmp/test.txt first line. [root@centos7-template mnt]# umount /dev/sdd [root@centos7-template mnt]# btrfs-convert -r /dev/sdd rollback complete. [root@centos7-template mnt]# mount /dev/sdd /root/tmp [root@centos7-template mnt]# cat /root/tmp/test.txt first line. [root@centos7-template mnt]# umount /root/tmp
原創文章,作者:gateray,如若轉載,請注明出處:http://www.www58058.com/17468
非常認真,贊。恭喜加入免檢家族
[…] 轉載自:http://www.www58058.com/17468 […]