Arch Linuxのパーティショニングをやり直した備忘録

3月くらいにArch Linuxを常用しはじめたんですが、完全に馬鹿なので、/, /var, /homeをパーティション用意していてかつすべてbtrfsにしていました。

通常Linuxをデスクトップ用途で使う場合パーティション分ける必要ないというのを知らなかった*1ので非常に厳しい感じにDockerがイメージを無駄遣いしている状態でした。

まあそういうわけでパーティショニングをやりなおすという作業をしました。環境自体はそのまま生き残っています。

そういうわけでいろいろちょっと前にTwitterで騒いでいたら老師おるみんさん@kotatsu_miからこんな感じのリプライを頂いた。

また、btrfsのプロからもこんなリプライをもらった

まあそういうわけでおるみんさんからHDDを借りてbtrfs sendを使ってグッとまとめてfstabとブートローダーだけ書き換えてなんとかしました*2

スナップショットの作成

とりあえずスナップショットを作成します。

$ btrfs subvolume snapshot -r / /root_backup
$ btrfs subvolume snapshot -r /home /home/home_backup
$ btrfs subvolume snapshot -r /var /var/var_backup

みたいな感じにします。-rをつけてるのはsendできるのはRead Onlyなスナップショットやサブボリュームだけだからですね。

Dockerが/var/lib/docker/btrfs/subvolumesにたくさんサブボリュームを作ってるんですが、色々やってたら/varの容量(10GBしかとってなかった)が無くなって破滅したので面倒になって全部消しました。

スナップショットは再帰的にとってもらえないので、そのへんをちゃんとやりたければ、

$ btrfs subvolume list (mount point) | cut -d' ' -f8 | xargs -I$ btrfs subvolume snapshot -r (mount point)$ (mount point)/$_backup

みたいな感じでスナップショットをとるか、(検証してないけど)

$ btrfs subvolume list (mount point) | cut -d' ' -f8 | xargs -I$ btrfs property set (mount point)$ ro true

とかすればサブボリュームがRead Onlyになるはずなのでおそらくbtrfs sendでおくれるはず

スナップショットを外のハードディスクに逃がす

逃します。とりあえずおるみんさんからかりたHDDをbtrfsでフォーマットしてマウントします。

$ mkfs.btrfs /dev/sdb1
$ mkdir /orumin
$ mount /dev/sdb1 /orumin

んでもってbtrfs sendします

$ btrfs send -v /root_backup | btrfs receive /orumin/

他のサブボリュームも同様にぶん投げます

パーティションを切り直してサブボリュームをリストアする

とりあえず順番にもどしていきます。このときroot_backupとかいう名前のままだとだるいのでリストア前なり後なりでサブボリュームの名称を変更しておきましょう。 切り直したパーティション/mntにマウントしておきます。この作業はArchのLive Imageでやっています。

$ btrfs send /orumin/root_backup | btrfs receive /mnt/
$ mv /mnt/root_backup /mnt/root

このまま/mnt/root/homeなどを戻していくんですが、先にスナップショットの名称を変更している場合は同一名称のディレクトリがあるとsend/receiveできないので、いろいろします。

$ btrfs property set /mnt/root ro false
$ rm -r /home
$ btrfs send /orumin/home | btrfs receive /mnt/root/
$ btrfs property set /mnt/root/home ro false

という感じでやります。/varの中身とかに既になんか入ってたらいい感じにしてください。何にしても最終的にはRead Onlyだとこまるので最後には全部Read Onlyを外します。

fstabの書き換え

一応全部移し終えてRead Only外せたらarch-chrootとかしてちゃんと動くかを確認しておきましょう。んで、fstabの書き換え。

どうせUUIDとか覚えられないので、

$ ls -l /dev/disk/by-uuid/ | vim -

とかしてバッファに一覧を表示した状態でfstabに書くUUIDを書き換えます。

このままだと/をマウントできないのでオプションでsubvol=/rootを追加しておきます。お好みでcompress=lzo

ブートローダの書き換え

ブートローダのオプションも書き換えます。

ブートローダのオプションにはroot=PARTUUID=<Partition UUID>みたいなのを書くのでさっきみたいにして

$ ls -l /dev/disk/by-partuuid | vim -

で見ながらブートローダを書き換えます。自分はSystemd-Bootを使ってるのでoptionsのパラメータを書き換えればOKでした。例によってこのときオプションにrootflags=subvol=/rootをくっつけないと起動失敗するので注意、ブートローダは生きてるので焦らずやっていきをすれば大丈夫。

おわりに

こんなことをしなくても良いようにみなさんはちゃんとArch Linux Wikiを読みましょう。

*1:ちゃんと読んでなかった

*2:UEFIなので割とかんたんにできた