BTRFS 心得

ext3/ext4 是傳統的檔案系統,
BTRFS 是 Linux 下新一代的檔案系統, 在除了檔案系統基本功能以外的操作都很不一樣.

BTRFS 主要增加了
可擴充性(scalability). B-tree 系列的效能很好. 看起來是號稱, 簡單的 Write 還不錯, 複雜性的操作的效能就沒有很好(Linux 4.7 – Btrfs vs. EXT4 vs. F2FS vs. XFS vs. NTFS Benchmarks).
數據一致性(Data integrity) 沒用到
快照管理(Snapshot/clone)

速度, 最近在開發的時候發現 BTRFS 在快照管理上頗好用.

首先在講快照之前, 先要提一下 BTRFS 的樹狀架構, 和傳統的檔案系統不太一樣.
BTRFS 比較像是, 建立了 File System 之後, 一個一個 subvolume 切出來使用. 而不是傳統的硬碟有多大就可以用多大. 想像成一個 pool , 可以隨時建立一個新的區塊, 這個區塊可以是 clone 或是全新的參數.

當一個 BTRFS 用 mkfs.btrfs 建立好之後, 像是一個 pool , 首先最頂級的 volume 目錄是 root, 符號 /, 第一個 subvolume 是 default, 符號 @ .
Ubuntu 預設安裝(我只用過 Ubuntu, 其他的不確定) 會產生二個預設的 subvolume @, @home

所以看起來就像是這樣
/dev/sda2
+- /
+- @
+- @home

@ 也就是 default subvolume, 第一個 subvolume

基本的命令, 列出目前 mount 的 btrfs 和相關的訊息
$ btrfs subvol list /
將 /dev/sda2 subvolume @ mount 在 /mnt/disk
$ mount -o subvol=@ /dev/sda2 /mnt/disk

這是一個範例, top level 5 都是 / 下來的第一層 subvolume

# btrfs subvol list /                                                                               
ID 257 gen 4383 top level 5 path @
ID 258 gen 4388 top level 5 path @home
ID 261 gen 4303 top level 5 path 1404
ID 289 gen 4297 top level 261 path 1404/1404working
ID 290 gen 4364 top level 257 path @/working
ID 291 gen 4434 top level 5 path working

而 1404/1404working 則是指 ID 261 的 clone(snapshot)
@/working 則是指 ID 257 的 clone(snapshot)

所以有些人問說為什麼不能刪除 top level 5 的 snapshot , 原因就是要 mount -o subvol=/ 之後再用 btrfs subvol delete

所以如果

$ mount -o subvol=/ /dev/sda2 /mnt/disk 
$ btrfs subvolume snapshot /mnt/disk/@ /mnt/disk/working => create snapshot

working 就會是開在 top level 5

如果

$ mount -o subvol=@ /dev/sda2 /mnt/disk 
$ btrfs subvolume snapshot /mnt/disk/@ /mnt/disk/working => create snapshot

working 就會是開在 top level 257 (@/working)

另外講一下 Ubuntu 16.04 可以針對 @ snapshot 之後將 root 開到另一個 subvolume.
首先修改 grub.d

 
vim /etc/grub.d/10_linux 

找到以下段落, 改成 cat /root/defaultsubvol , 檔名隨你高興
這一段會取出 /etc/defaultsubvol 內的內容做為 root 的 subvol .

case x"$GRUB_FS" in
    xbtrfs)
        rootsubvol="`cat /root/defaultsubvol`" 
        rootsubvol="${rootsubvol#/}"
        if [ "x${rootsubvol}" != x ]; then
            GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}"
        fi;;

所以這樣是切到 working

$ sudo bash -c "echo 'working' >> /root/defaultsubvol" 
$ sudo update-grub

現在可以編輯一下 /boot/grub/grub.conf 產級確認 subvol 都是指向 working

如果己經在 working 要切到 @ , 比較複雜一點

$ mount -o subvol=@ /mnt/disk
$ for i in dev dev/pts sys proc run; do sudo mount --bind /$i /mnt/disk/$i; done
$ sudo chroot /mnt/disk bash -c "echo '@' >> /root/defaultsubvol" 
$ sudo chroot /mnt/disk sudo update-grub
$ reboot 

這樣之後就可以切來切去了
對於要常常測測從系統重灌設定的人很好用.

On this day..

Share and Enjoy:
  • Print
  • Facebook
  • Yahoo! Buzz
  • Twitter
  • Google Bookmarks
  • Plurk
Related Posts

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>