Linux, 工作, 生活, 家人

Linux, Ubuntu

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 

working 就會是開在 top level 5 之下

如果執行了以下指令,第一行是 mount btrfs root,第二行是針對目前的 @ 做 snapshot

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

working 就會是開在 top level 257 (@/working) 之下
主要的差異是一個 mount / , 另一個 mount @

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

找到以下段落(約在 74 行的地方), 改成 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  

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

發佈留言