試用 Btrfs

2013年01月16日 (Shadow Ma)

關於 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 中添加 btrfsBINARIE 行添加 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

直接刪除相應子卷就好。

參考資料

  1. 關於掛載選項,notime 用於禁用「最近訪問」時間戳,減少磁盤讀寫,discard 用於打開 SSD 的 Trim 功能。

Phase:爲 Hexo 和 Octopress 設計的華麗主題 CJKTTY:linux 控制台 CJK 字符顯示補丁
點擊查看評論
返回首頁 返回頂部