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.conf
の HOOKS
に encrypt
と lvm2
を追加する。
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"}
と言っているが、インストールメディアでロック解除できたので弱いような気も…。
まあそもそもインストールメディアでロック解除するのを防げるものではない説もあるので、侵害される可能性が高いならパスワードだけにしとけということかもしれない。
終了。
再起動して確認。 動かなかったらインストールメディアで起動して手動マウントして頑張る(適当)