關於 Btrfs 就不再介紹了,早在入 SSD 時就想上了,只是一直擔心不穩定,昨天心血來潮找了些相關資料,看過之後果斷中毒,子卷和快照功能實在太吸引人了,雖然也看到一些血的教訓,不過現在都 2013 年了,網上一大票都是 2010 年時的敢死隊,現在比那時自然沒什麼壓力了,不過在 3.7 內核中 Btrfs 仍然被標記爲 Experimental,若嘗試請注意備份數據!
準備
雖然 Btrfs 提供了 btrfs-convert
工具來將現有分區轉換爲 Btrfs,不過爲了體驗 Btrfs 的衆多新特性,決定徹底改造分區,使用單個分區,然後將系統安裝到分區子卷中,這樣以後管理起來也更加靈活。
先爲當前系統安裝 btrfs-progs
yaourt -S btrfs-progs
我目前的分區情況
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 59.6G 0 disk
├─sda1 8:1 0 2M 0 part
├─sda2 8:2 0 15G 0 part /
├─sda3 8:3 0 1G 0 part [SWAP]
└─sda4 8:3 0 43.6G 0 part /home
計劃將 root 和 home 放到同一分區的不同子卷中,也就是說除去 BIOS boot 和 swap 只留一個分區 。
備份
選擇自己喜歡的方式備份系統,我直接在 Arch Linux Install medium 的 live CD 環境中用 tar 將系統備份到掛載在 /media
下的移動硬盤裏。
掛載1並備份 root,根據需要用 --exclude
排除不想備份的目錄或文件
mount -o defaults,noatime,discard /dev/sda2 /mnt
tar cvpzf /media/backup/arch-root.tgz /mnt --exclude=/mnt/var/cache --exclude=/mnt/var/tmp
掛載並備份 home
mount -o defaults,noatime,discard /dev/sda4 /mnt/home
tar cvpzf /media/backup/arch-home.tgz /mnt/home
遷移
卸載因爲備份而掛載的分區
umount /mnt/home /mnt
用 gdisk
重新分區,步驟略
gdisk /dev/sda
刷新分區表
partprobe /dev/sda
我的分區情況
Number Start (sector) End (sector) Size Code Name
1 2048 6143 2.0 MiB EF02 BIOS boot partition
2 6144 2103295 1024.0 MiB 8200 Linux swap
3 2103296 125045390 58.6 GiB 8300 Linux filesystem
格式化分區
mkfs.btrfs /dev/sda3
掛載分區
mount -o defaults,ssd,discard,noatime,compress=lzo,space_cache,autodefrag /dev/sda3 /mnt
創建子卷
cd /mnt
btrfs subvolume create arch
btrfs subvolume create home
卸載分區
umount /mnt
掛載剛創建的子卷
mount -o subvol=arch,defaults,ssd,discard,noatime,compress=lzo,space_cache,autodefrag /dev/sda3 /mnt
mount -o subvol=home,defaults,ssd,discard,noatime,compress=lzo,space_cache,autodefrag /dev/sda3 /mnt/home
恢復備份
cd /media/backup
tar xvpzf arch-root.tgz -C /
tar xvpzf arch-home.tgz -C /
修改配置
使用 genfstab
生成新的配置並添加到 fstab 文件末尾
genfstab -p /mnt >> /mnt/etc/fstab
chroot 到系統中
arch-chroot /mnt
修改 fstab,刪除其中過時的部分
vim /etc/fstab
修改 mkinitcpio.conf
vim /etc/mkinitcpio.conf
可以參考我的配置
MODULES="i915 ahci btrfs"
BINARIES="btrfsck"
HOOKS="base udev plymouth modconf block resume btrfs"
MODULES
中添加 btrfs
,BINARIE
行添加 btrfsck
將其打包進 initramfs 用於系統急救,HOOKS
刪除 fsck
並添加 btrfs
。
創建新的 initramfs
mkinitcpio -p linux
安裝 grub
grub-install --no-floppy /dev/sda
生成 grub 菜單
grub-mkconfig -o /boot/grub/grub.cfg
請檢查 /boot/grub/grub.cfg
中菜單的 linux 行中是否自動添加了 rootflags 選項,如果沒有請修改 /etc/default/grub
,添加 rootflags=subvol=arch
到 GRUB_CMDLINE_LINUX_DEFAULT 行中,然後用上面的命令再次生成菜單。
檢查無誤後 exit
退出 chroot 環境,卸載剛掛載的子卷
umount /mnt/home
umount /mnt
重啓
reboot
應用
先掛載根結點
mount -o subvolid=0 /dev/sda3 /mnt
列出所有子卷
btrfs subvolume list /mnt
得到如下輸出
ID 256 gen 1755 top level 5 path arch
ID 258 gen 1755 top level 5 path home
爲子卷 arch 創建一個名爲 arch-backup 的快照
cd /mnt
btrfs subvolume snapshot arch arch-backup
備份恢復
Btrfs 的快照本身就是一個子卷,可以掛載和讀寫,掛載後很容易就能從中恢復需要的文件。
災難恢復
掛載爲 root 創建的快照的子卷
mount -o subvol=arch-backup,defaults,ssd,discard,noatime,compress=lzo,space_cache,autodefrag /dev/sda3 /mnt
修改 fstab
中的 root 掛載選項中的子卷名爲快照名
cd /mnt
vim etc/fstab
然後在系統被破壞無法引導時,只要修改 grub 菜單中 linux 行的 rootflags 選項的子卷名爲快照名,比如改爲 rootflags=subvol=arch-backup
,啓動後 root 即爲 arch-backup 快照的子卷。
因爲 Btrfs 的寫時複製(copy-on-write)特性,快照剛建立時幾乎不佔用硬盤空間,隨着系統的使用才因爲快照和系統的差異增大而慢慢增大,對敢死隊來說非常有用的特性,在對系統大手術前創建的快照,幾乎可以說是最低成本的備份、恢復方案。
刪除快照
btrfs subvolume delete arch-backup
直接刪除相應子卷就好。
參考資料
-
關於掛載選項,
notime
用於禁用「最近訪問」時間戳,減少磁盤讀寫,discard
用於打開 SSD 的 Trim 功能。↩