2013年11月27日 星期三

Linux新一代的檔案系統btrfs:多儲存裝置間的協同

    Btrfs檔案系統除了單一磁碟或磁區能獨立運作之外,也能多個磁碟或磁區協同運作,例如像RAID『備援磁碟陣列』的儲存方式,但和RAID不同,btrfs則是以軟體來建構。可以將多個小磁碟組合成一個大磁碟來用(RAID0),或是提供備援儲存(RAID1),資料會有兩個副本分別存放在不同的磁碟上,其中一個磁碟壞了也沒關係,資料還是能完整存取,不怕丟失。多個磁碟組合(RAID0)理論上效率會提升一些,因為一個檔案能分散在多個磁碟中同時存取,能更快的存取到整個檔案。當然,也支援兩種方式組合起來用(RAID10),同時兼顧效能及資料保全。

實驗性質的試用一下btrfs在多儲存裝置間的協同運作,我是用Chakra Linux作業系統(安裝過程請參閱另外一篇文章:Chakra Linux使用新一代btrfs檔案系統實作

Chakra系統設定好後記得要先安裝btrfs-progs工具

# pacman -S btrfs-progs


多個磁碟或磁區組成RAID

先將您需要的磁區分割好(例如:/dev/sda1、/dev/sdb2、/dev/sdc3、……),或者不用分割也行,用整顆硬碟當作儲存空間(例如:/dev/sda、/dev/sdb、/dev/sdc、……),磁區大小不相同也沒關係,這是btrfs的另外一個特點,btrfs會自動依照需求調整最後能利用的儲存空間,細節請參閱這篇"The Btrfs Q&A",RAID0及RAID1至少要兩個磁區,RAID10則至少要四個磁區,指令格式如下:

格式化

# mkfs.btrfs /dev/sda1 /dev/sdb2 /dev/sdc3 ……

btrfs格式化的內定參數metadata為raid1(DUP/重複),data為raid0(single/單一),在btrfs檔案系統中,會有所謂的system、metadata及data三種資料,system大概是存放btrfs的系統資料,當data中的資料無法讀取時,btrfs可以試著從metadata中把資料找出來,當檔案系統掛載後可以用btrfs filesystem df指令來查詢,下面會再細述。格式化時也可以分別另外指定metadata與data為raid0、raid1或raid10,"-m"代表metadata,"-d"代表data,例如:

# mkfs.btrfs -m raid0 -d raid0 /dev/sda1 /dev/sdb2 /dev/sdc3 ……

指定metadata為raid0,data為raid0


# mkfs.btrfs -m raid1 -d raid0 /dev/sda1 /dev/sdb2 /dev/sdc3 ……

指定metadata為raid1,data為raid0


# mkfs.btrfs -m raid0 -d raid1 /dev/sda1 /dev/sdb2 /dev/sdc3 ……

指定metadata為raid0,data為raid1


# mkfs.btrfs -m raid0 -d raid0 /dev/sda1 /dev/sdb2 /dev/sdc3 ……

指定metadata為raid1,data為raid1

目前可以用的參數為raid0、raid1及raid10,請依需求自行決定,使用raid10需至少四個磁區,而raid5尚未支援。


修改/etc/fstab

若格式化完成時,用GParted或KDE Partition Manager來看這些磁區時,這些磁區的UUID會相同,因此要指定這個RAID儲存空間的btrfs參數時,就需要將這個UUID登錄在/etc/fstab中,btrfs的參數請自行參閱其他文件,若少掉這個動作則在掛載時會出現磁區檔案格式不明的錯誤,沒辦法掛載。

# nano /etc/fstab

UUID=90s6r8T67T....f7d   btrfs defaults,compress=zlib,autodefrag 0 0

掛載/卸載

掛載時只要掛載其中一個磁區即可,例如將RAID掛載到/mnt:

# mount /dev/sda1 /mnt

掛載後可用指令查詢

# btrfs filesystem show

Label: btrfs-home  uuid: 8bd1f966-25d5-4ed7-8548-62fbdcb911f1
        Total devices 3 FS bytes used 28.00KB
        devid    3 size 5.00GB used 1.01GB path /dev/sda1
        devid    2 size 5.00GB used 1.01GB path /dev/sdb2
        devid    1 size 5.00GB used 2.02GB path /dev/sdc3

Btrfs v0.20-rc1-566-gd1570a0




# btrfs filesystem df /mnt

Data, single: total=147.00GiB, used=144.81GiB
System, DUP: total=32.00MiB, used=24.00KiB
System, single: total=4.00MiB, used=0.00
Metadata, DUP: total=512.00MiB, used=329.93MiB


df指令顯示btrfs檔案系統中system、metadata及data的使用情形,其中single就表示是以單一(RAID0/non-redundant)的儲存方式,DUP表示重複儲存(RAID1/redundant)。


卸載時

# umount /mnt



# umount /dev/sda1

一顆硬碟分割成多個磁區,協同組成一個RAID0的檔案系統不會比將整顆硬碟分割成一個磁區來得更有效率,本人有做過一個小實驗,將我的筆記型電腦同樣使用Chakra作業系統,使用同一顆的硬碟,同樣的硬體架構,但用檔案系統使用Reiser、Btrfs、多磁區組成的Btrfs及Ext4等四種檔案系統,將一個約6GB大小的資料夾拷備到另外的目錄中,這資料夾內有大檔案也有小檔案,來源和目的資料夾都是相同的檔案系統,所花的時間如下:

Reiser              9:51
Btrfs               6:11  (單一磁區)
Btrfs               8:18 (單硬碟多磁區RAID0)
Ext4                6:07

由上看起RAID0如果是在同一個硬碟內並不會比較有效率,反而更差,對於一個檔案分散存放在不同的磁區內實際上就代表碎片化,效能當然較差囉。在效能上btrfs和ext4差異不大,當然,這並不是很客觀,僅供參考,效率和資料的組成型態會有很大的關係,但這個很難客觀呈現。

新增加或移除一個磁區

# btrfs device add /dev/sdd1 /mnt

上述指令將/dev/sdf1加到/mnt所掛載的btrfs檔案系統中,再利用下列指令確認一下是否/dev/sdf1已經列入檔案系統中

# btrfs filesystem show

如要移除/dev/sdd1請執行:

# btrfs device delete /dev/sdd1 /mnt


儲存裝置間的平衡(balance)

btrfs在多裝置協同運作時會將資料平均分配在不同的裝置上,在多裝置的btrfs檔案系統新增或移除一個裝置時,會造成資料存放不均,可以用balance指令,將資料於多裝置間平衡,balance指令用於單一儲存裝置並沒有意義,就算在多裝置的檔案系統中也不需要特別執行這個指令,因為btrfs在平時運作就會自動保持資料量的平衡,除非是新增或移除裝置時才有需要執行這個指令,指令如下:

$ sudo btrfs filesystem balance start /mnt

針對"/mnt"所指的btrfs檔案系統開始balance,這時終端機會停止,btrfs會在背景進行balance維護,這個動作會跑過檔案系統中所有的資料,依照資料的量可能會需要一些時間,如要查詢balance的維護進度,請另再開一個終端機,執行下列指令:

$ sudo btrfs filesystem balance status /mnt

Balance on '/mnt' is running
5 out of about 106 chunks balanced (6 considered),  95% left

暫停及繼續balance維護:

$ sudo btrfs filesystem balance pause /mnt
$ sudo btrfs filesystem balance resume /mnt

停止balance維護:

$ sudo btrfs filesystem balance cancel /mnt


更改RAID Level

btrfs可以在線上更改metadata及data的RAID Level,例如以下的指令將metadata及data均改為raid1:

# btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt


參考資料:

1.A Beginner's Guide To btrfs
2.Arch Wiki:btrfs
3.新一代Linux文件系统btrfs简介

沒有留言: