Ubuntu 18.04以降の新しいインストーラはbtrfsなルートパーティションの扱いが変わっている。
ハマりたくなければおとなしくalt imageの旧インストーラを使ったほうがいい。
Ubuntu 旧インストーラでの挙動
旧インストーラ(名前はdebian installerで良いのだろうか?)でルートパーティションにbtrfsを指定すると、自動的にサブボリュームが作成され、ルート/
とホーム/home
にマウントされる。
たとえば、
/dev/mapper/vg-root / defaults,subvol=@ 0 0
/dev/mapper/vg-root /home defaults,subvol=@home 0 0
これはbtrfsでは順当な構成。(@homeは要らない人も多いだろうが)
Ubuntu 新インストーラでの挙動
サブボリュームが作成されず、そのままルートボリュームがマウントされる。
(ついでに/boot
を/
やLVMの中に置くことができず、/boot
は通常のパーティションにext4などで作ることを強制される)
何が問題か?
btrfsのルートボリュームはサブボリュームと扱いが異なり、削除や移動ができない。
特に、ルートボリュームのスナップショットをサブボリュームとして作成することはできても、作成したサブボリュームでルートボリュームを差し替えることができない。
つまり、ルートパーティションとしてbtrfsのルートボリュームをそのままマウントしてしまうと、ロールバックができない。
一方サブボリュームならリネームができるので、ルートパーティションやinitramfsを壊してしまっても最悪古いスナップショットをRWにして置き換えるだけで最低限の復旧ができる。(配下のサブボリュームは作り直すか、同形になるようにスナップショットを作り直す必要があるが)
他にも、作成したサブボリュームはすべてルートボリューム配下、つまり/
以下に見えてしまうのでapparmorなどのアクセス制御上の扱いが面倒になる。
修復
ルートパーティションの差し替えを行う。これはbtrfsに限らず通常の運用と同じ。
ルートボリュームのスナップショットは作れるので、
mkdir /mnt/chroot
sync
btrfs subvolume snapshot / /@
mount /dev/vda2 /mnt/chroot -o subvol=@
mount --bind /dev /mnt/chroot/dev
... 他sys/dev/procなど繰り返し
chroot /mnt/chroot
vi /etc/fstab (subvol=@を追加)
update-initramfs -u -k all
update-grub
で行けるはず。
あとは忘れずルートボリュームをマウントしてサブボリューム以外を削除。