Arch Linuxでext4のrootfsをLUKSで暗号化する

既存のファイルシステムを暗号化もできるらしい。 とりあえず使い捨ての環境でやってみたのでメモしておく。使ってる環境でやるならバックアップ取ってからやった方がいいと思う。

まず、Arch のインストールメディアで起動する。

ここでは /dev/nvme0n1p2 に rootfs があって、それ以上は分割されていないものとする。 複数のパーティションを 1 つの暗号化パーティションに入れることができるかは分からない。

LUKS のヘッダ分のスペースを空けないといけないので、まず ext4 のファイルシステムを縮小する。 僕はデータが入り切る最小サイズまで縮小した。計算が得意な人はギリギリのサイズに縮小してもいいと思うけど、 ext4 だとデータはあんまりバラけてないはず(多分)なのでどのくらい意味があるのかは不明。 (あと、僕はどうせミスる)

# e2fsck -f /dev/nvme0n1p2      # e2fsck しないとリサイズさせてもらえない
# resize2fs -M /dev/nvme0n1p2

で、ファイルシステムのサイズがパーティションよりも 16 MiB 以上小さいことを確認する。 空きがなかったら後ろの方が切れてしまうので、データを消してやり直そう!

確認できたらパーティション全体を暗号化する。かなり時間がかかる。

# cryptsetup reencrypt --encrypt --reduce-device-size 16M /dev/nvme0n1p2

暗号化できたら復号されたボリュームを map する。

# cryptsetup open /dev/nvme0n1p2 arch_root

中に入っている ext4 のファイルシステムをパーティション全体まで拡大する。

# e2fsck -f /dev/mapper/arch_root
# resize2fs /dev/mapper/arch_root

いつも通り /mnt にマウントする。

# mount /dev/mapper/arch_root /mnt
# mount /dev/nvme0n1p1 /mnt/boot

必要なら //dev/mapper/arch_root を見るように fstab をいじる。 多分中に入っている ext4 の UUID になるのでここは多分変える必要はない。

mkinitcpio.confHOOKS に encrypt を加える(filesystems より前に)。

HOOKS=(base udev autodetect modconf kms keyboard keymap consolefont block encrypt filesystems fsck)

Linux のブートパラメータをいじる。僕は systemd-boot を使っているので /boot/loader/entries/arch.conf

title	Arch Linux
linux	/vmlinuz-linux
initrd	/initramfs-linux.img
options	cryptdevice=UUID=7e9aade5-b65a-4dac-9d1c-1eb7015374f1:arch_root root=/dev/mapper/arch_root rw

これで起動時にパスワードを入れると復号されるようになった。

起動時に自動で復号したい場合はこっちの記事を参考に。