推薦-BtrFS學習總結

一、原理介紹
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.可擴展性

0.08496195287443697.png

主要表現在兩個方面: 
  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,其物理存儲位置是動態分配的,所以沒有對文件個數的限制。 
btrfs btree0.06710084876976907.png

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個操作當成一個事務整體來處理,只要其中一個操作失敗,文件便不能創建成功。過程如下: 
推薦-BtrFS學習總結 ed85aadd-9262-4152-9280-07edcddfd260.jpg

A是FS樹的根節點,新的inode信息將被插入節點C。首先,btrfs使用COW將inode插入一個新分配的C‘中,并修改上層節點B,使其指向新的C’,從而B也產生COW節點B‘,以此類推一直連鎖反應到根節點A’,此時因為事務還沒有完成,superblock依然指向A 
推薦-BtrFS學習總結 f5f609c6-faff-4212-a188-bbb9777cb3bb.jpg

修改目錄項E,引發相同的過程 
推薦-BtrFS學習總結85e27a81-a9a8-4366-bc4d-1231d20735e9.jpg

最后commit事務,superblock指向新塊 

55bcdfb5-bb32-41be-af29-cbbaaf00489b.jpg推薦-BtrFS學習總結 
假設上面某個過程操作失敗或中途斷電也不會影響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

(3)
gateraygateray
上一篇 2016-06-03
下一篇 2016-06-03

相關推薦

  • lvs-DR模型構建高性能集群

    構建環境:centos7.1     Diretor server:172.16.15.131  (  VIP:172.16.15.138 )     Real server:172.16.15.132/133      配置163源 拓撲…

    Linux干貨 2016-08-22
  • 學習宣言

    好好學習,天天向上。

    Linux干貨 2016-10-24
  • 第二周作業

    一、文件管理類命令     1、cp:復制文件        單文件復制cp source dest,如果dest存在且dest不是目錄,則覆蓋目標文件。如果dest不存在,則自行創建dest文件;如果source是目錄,則cp命令不會執行。如果source是鏈接文件,則復制的是鏈接文件指向的文件內…

    Linux干貨 2016-12-11
  • 淺談bash shell 變量

    一、簡述 變量是指內存空間的命名,指向內存中一個或一組地址。bash shell中的變量屬于弱類型變量,使用變量無需聲明、不需要指定類型,默認為字符型變量。 二、變量命名、賦值、引用 (1)命名規則:     1.只能使用字母,數字,下劃線;并且不能使用數字開頭。     2.不…

    Linux干貨 2016-08-15
  • ?redis cluster 安裝指南

    公司的很多項目在使用redis主從。由于coder的各種毀滅性操作,迫切需要一個能帶故障恢復的架構。因此新版的cluster,開始了測試。 一、Cluster 理論基礎 Cluster介紹 Redis集群是一個提供在多個Redis間節點間共享數據的程序集。 Redis集群并不支持處理多個keys的命令,因為這需要在不同的節點間移動數據,從而達不到像Redis…

    Linux干貨 2016-02-14
  • Linux文件屬性及如何修改文件屬性

    ls -al:顯示文件的文件名與相關屬性并列出所有文件詳細的權限與屬性   dr-xr-x—.   7       root     root       4…

    2017-04-03

評論列表(2條)

欧美性久久久久