實驗性質的試用一下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
修改/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简介
沒有留言:
張貼留言