2013年11月20日 星期三

Chakra Linux使用新一代btrfs檔案系統實作

    於2012年間就已接觸到新一代的檔案系統btrfs,也曾將原本使用的ext4檔案系統更換為btrfs,包含系統分割區/root及資料儲存分割區/home等全面更換,那時是使用Arch,最後的使用經驗是覺得還不夠穩定,所以在使用Linux發行版Chakra後,由於Chakra還沒支援btrfs,就換回ext4。經過一年多的等待,btrfs進版了好幾次,可見還是很多人在積極開發,想再次試試。

    前一次的使用經驗中,雖然他還不是很穩定,但作為新一代檔案系統的確有很多吸引人的特色,例如透明壓縮、自動除碎片(auto defragment),搜索速度快(真的很快),子卷快照(subvolumne/snapshot)、COW(Copy On Write)……,以上是較吸引我的地方,一般使用上不太需要特別去管理,自已就會運作得不錯,當然還有其他的特色,有興趣請自行Google一下。另外btrfs對小檔案有很好的管理效率,但對大檔案就較差,像是VirtualBox所使用的虛擬硬碟,常常上看幾十GB,如果是放在btrfs的分割區裡,真的效率很差,所以我會針對這些超大檔案另外放在ext4的分割區裡。

    開始進入今天的主題,如何實作Chakra Linux在btrfs檔案系統中,請先做好資料備份並準備好Chakra的Live DVD,這個光碟映像檔可以到Chakra的開發者網站下載(http://www.chakra-project.org/),我使用的版本是Chakra Fritz(2013.09),利用Chakra Live DVD開機,啟動Live Chakra:


先開啟一個終端機視窗,取得root權限,安裝btrfs-progs,指令如下:

$ su
Password: 《請輸入root密碼:"root"》

# pacman -Sy btrfs-progs

(說明:#提示字元表示該指令需要root權限,一般指令以$為提示字元)


接著準備好硬碟分割,我習慣用圖形介面的KDE Partition Manager,分割一個10GB的root(/dev/sda1)、一個2GB的swap(/dev/sda2)、一個4GB的home(/dev/sda3)及一個200MB的boot(/dev/sda4),root及home分割區先暫設定為ext4的檔案格式,因為目前Partition Editor還不能格式化btrfs的分割區,需要用mkfs.btrfs指令來格式化,分割區的大小可依需求自行調整,將/boot獨立給一個ext4的分割區能避開一些問題(/boot放在btrfs檔案系統中一樣能執行,只是在開機時GRUB會出現"Sparse file not allowed"的報錯訊息,不知道是不是GRUB尚不完全的支援btrfs,將暫存檔案寫入/boot時會出錯?):

# mkfs.btrfs -f -L btrfs-root /dev/sda1
# mkfs.btrfs -f -L btrfs-home /dev/sda3
# mkfs.ext4 -L boot /dev/sda4




    再來要針對btrfs的分割區進行子卷(subvolumne)的規劃,當然也可以不做子卷的規劃,btrfs還是能運作,如不進行規劃可跳過此段,事實上btrfs檔案系統被建立時就有一個ID為5的"FS_TREE"子卷,這個子卷應該是不能被刪除的,因此這個子卷上的檔案所佔用的空間也不能被釋放,所以趁分割區是空的時候另外建立一個預設的子卷"__active",再將檔案放在這個子卷上,未來當"__active"子卷不再需要時可以將子卷刪除,把空間釋放出來。目前先規劃一個預設子卷"__active",以後有需要還可以透過"btrfs subvol snapshot / create"指令來增加:

先掛載分割區:

# mount /dev/sda1 /mnt
# mkdir /mnt_home
# mount /dev/sda3 /mnt_home

規劃root:

# cd /mnt
# btrfs subvol create __active
# btrfs subvol list -p /mnt/

ID 257 gen 8 parent 5 top level 5 path __active


規劃home:

# cd /mnt_home
# btrfs subvol create __active
# btrfs subvol list -p /mnt_home

ID 256 gen 6 parent 5 top level 5 path __active

設定預設的子卷(default subvloumne)為"__active",要依實際上面列的"__active"子卷的ID,通常第一個生成的子卷ID可能是256,但不一定都是256,像我這次root分割區"__active"子卷的ID就是257,得注意一下哦:

# btrfs subvol set-default 257 /mnt/
# btrfs subvol set-default 256 /mnt_home/

卸載分割區:

# cd /
# umount /dev/sda1
# umount /dev/sda3

接下來這一步並不是必須,可以跳過,那就是編輯/etc/fstab,指定btrfs分割區掛載的參數,這是希望在安裝過程寫入的檔案及程式就能依照指定參數來管理分割區,例如我想要的透明壓縮及除碎片化,而且壓縮格式我選擇有較大壓縮率的compress=zlib(另外可選擇compress=lzo)

# nano /etc/fstab

/dev/sda1 /mnt      btrfs defaults,compress=zlib,autodefrag 0 0
/dev/sda3 /mnt/home btrfs defaults,compress=zlib,autodefrag 0 0


由於btrfs還沒有fsck.btrfs,所以在安裝Chakra於安裝initial ramdisk時會報錯,造成Chakra無法安裝,所以先在root分割區中先放一個假的/sbin/fsck.btrfs,指令如下:

# mount /dev/sda1 /mnt
# mkdir /mnt/sbin
# cp /sbin/fsck /mnt/sbin/fsck.btrfs
# umount /dev/sda1


接下來就能執行Live DVD上的安裝程式,進行安裝,記得分割區規劃時依之前的設定將root分割區掛載到"/"、home分割區掛載到"/home"及boot分割區掛載到"/boot",但千萬不要格式化分割區,安裝完成後,再開啟終端機修改root分割區裡的/etc/fstab設定,這時root、home分割區參數的最後一個數字要由"1"改為"0",這樣開機時就不會用fsck檢查這個分割區:


(掛載分割區)

(這個時候要回答Yes)


(安裝完成)

# mount /dev/sda1 /mnt
# nano /mnt/etc/fstab

/dev/sda1 /     btrfs defaults,compress=zlib,autodefrag 0 0
/dev/sda3 /home btrfs defaults,compress=zlib,autodefrag 0 0


# umount /dev/sda1


接著就能重新開機,進入Chakra Linux,基本上Chakra已經安裝好了,可以自行後續的調校及軟體的安裝。再來針對幾個btrfs常用的管理指令給大家分享,這部分是我個人的使用經驗,在網路上還沒看到較詳細的使用說明,許多文章的作法很複雜,令人難以理解,事實上使用起來沒那麼複雜,我相信未來也一定會有圖形化的管理程式,更方便管理。


安裝btrfs-progs管理工具

$ sudo pacman -S btrfs-progs

建立系統還原點(snapshot)

進入安裝好的Chakra Linux後可以增加一個快照,做為系統還原點,指令如下:

$ cd /                   《切換到根目錄,"root"分割區掛載的位置》
$ btrfs subvol snapshot / snapshot20131121-install

在執行snapshot前一定要將目錄切換至該分割區掛載的目錄上,之後就會產生一個自定義名稱的snapshot20131121-install快照,也會在"/"下增加一個"/snapshot20131121-install"子目錄,這個目錄底下就會有保存的檔案,也可以去開啟或編輯這些檔案。只要不更動檔案內容,新增的快照使用相同的實體磁碟位置,因此增加一個快照幾乎沒有增加磁碟使用空間。未來系統如要還原到這個快照的狀態時,只要將預設子卷設為snapshot20131121-install整個系統就能還原,指令如下:

$ cd /
$ sudo btrfs subvol list -p /

ID 256 gen 69 parent 5 top level 5 path __active
ID 265 gen 52 parent 256 top level 256 path snapshot20131121-install

$ sudo btrfs subvol set-defaults 265 /

接著重新開機後就行了,是不是很方便又不佔空間。不要的子卷可透過"btrfs subvol delete"指令來刪除,以釋放被佔用的磁碟空間,相關btrfs指令的參數請參考"btrfs --help"。


手動除碎片化(defragment)

基本上如果btrfs掛載時有autodefrag參數,btrfs就會自動清除檔案碎片,通常不需要如此做,但也可以用指令手動強迫btrfs進行清除檔案碎片的動作,若進行離線維護,這時可以先將分割區卸載,如果是系統分割區無法卸載,請用Chakra Live DVD開機後,再對需要的分割區進行維護,指令如下:

$ sudo btrfs filesystem defragment /dev/sda1
$ sudo btrfs filesystem defragment /dev/sda3

也可以進行線上維護(掛載中)

$ sudo btrfs filesystem defragment /
$ sudo btrfs filesystem defragment /home

其中/dev/sda1(/)及/dev/sda3(/home)為需要維護的分割區,因為btrfs有自動除碎片化,通常defragment不會花很多時間。






沒有留言: