Arch Linuxを暗号化したディスクにインストールする

Arch Linux を LVM on LUKS の root filesystem にインストールしたのでメモ。 LVM を使うこと自体は完全にオプションで、LUKS の上に ext4 のファイルシステムを作っても別に良い(はず)。

これがどういう構成かというと、物理パーティションの上に LUKS で暗号化したパーティションを作り、 その上の LVM2 の LV の上の ext4 のパーティションに rootfs を作るというもの(オフチョベットしたテフをマブガッドしてリットにしてそうな説明)。

(意外にもとハマらずにできたので情報としての価値は低めです。)

インストールガイド に従ってパーティションを切るところまでやる。

パーティションはこんな感じで切った。

ディレクトリ 範囲 説明
/boot 1 MiB–1 GiB ブートローダとか諸々用
/ 残り全部 残りのディレクトリ用。暗号化する。LVMを使うので後で分割も可能。

/boot 大きめっすね。

ファイルシステムを作る。/boot は普通。

# mkfs.vfat -F32 /dev/nvme0n1p1

もう一個のパーティションを LUKS でフォーマットしてマウントする。

# cryptsetup luksFormat /dev/nvme0n1p2
# cryptsetup open --type luks /dev/nvme0n1p2 arch_cryptroot

で、LVM の LV を作って ext4 に

# pvcreate /dev/mapper/arch_cryptroot
# vgcreate vgroot /dev/mapper/arch_cryptroot
# lvcreate -l 100%FREE vgroot -n root
# mkfs.ext4 /dev/mapper/vgroot-root

いつも通り(いつも通りって何だよって話ではあるが)マウントする。

# mount /dev/mapper/vgroot-root /mnt
# mkdir /mnt/boot
# mount /dev/nvme0n1p1 /mnt/boot

Arch のブートストラップとか。LVM がマウントできるように lvm2 パッケージも入れる。

# pacstrap -K /mnt base base-devel linux linux-firmware lvm2 vim
# genfstab -U /mnt >>/mnt/etc/fstab

genfstab が普通に動いてるっぽかったのでちょっとびっくりした。

chroot

# arch-chroot /mnt

タイムゾーンとかローカライズとかをいい感じにする。(省略)

起動時に LUKS と LVM のマウントができるように /etc/mkinitcpio.confHOOKSencryptlvm2 を追加する。 filesystems の前じゃないといけないらしい。

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

initcpio を再生成

# mkinitcpio -p linux

systemd-boot1 を使ってブートするようにする。

# bootctl install

systemd-boot の設定ファイルを作る。/boot/loader/entries の中なら何でもいいが、ここでは arch.conf という名前にした。

title	Arch Linux
linux	/vmlinuz-linux
initrd	/initramfs-linux.img
options	cryptdevice=UUID=439d2c50-2f60-499a-9819-fea0d2e1adb9:arch_cryptroot root=/dev/mapper/vgroot-root rw

UUID のところには blkid /dev/nvme0n1p2 とかで取ってきた実際の UUID、: 以降は /dev/mapper にできるファイル名(なんでもよい)をいれる2

これで起動時にパスワードを入れたら動く状態になる。他の設定はお好みで。

TPM2 を使って起動時に復号

Clevis3 を使う。

Clevis と mkinitcpio のフックを使って、起動時に復号する。 AUR から mkinitcpio-clevis-hook をインストールする。

mkinitcpio.conf の HOOKS の encrypt の前に clevis を追加する。

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

Clevis の bind というやつをする。

# clevis luks bind -d /dev/nvme0n1p2 tpm2 '{}'

追記:
{} の部分にオプションを指定した方がセキュアらしいが何を指定するのが良いのかよく分からん。 ArchWiki は {"pcr_ids":"1,7"} と言っているが、インストールメディアでロック解除できるか確認したりしていたら SSD に入れている方でも TPM2 でロック解除できなくなってしまった。 GentooWiki は {"pcr_ids": "0,2,3,5,6,7"} と言っているが、インストールメディアでロック解除できたので弱いような気も…。
まあそもそもインストールメディアでロック解除するのを防げるものではない説もあるので、侵害される可能性が高いならパスワードだけにしとけということかもしれない。

終了。

再起動して確認。 動かなかったらインストールメディアで起動して手動マウントして頑張る(適当)