切腹のイラスト

既存のGentooのrootfsをLUKSで暗号化する

{
  date: "",
  category: "/unix-like"
}

既存のGentooシステムのディスクを暗号化したくなったのでゆるくやっていく。
この辺の話はディストロによって差が大きいので,脳死でArchWikiに従ってれば大丈夫という訳にはいかないのがアレなところ。 Gentoo Wiki・RHELのドキュメントも大いに参考になった。

今回やるパーティション構成は

nvme0n1
├─nvme0n1p1       2G part  /boot  # ESP
└─nvme0n1p2 11451.4G part  /      # btrfs

nvme0n1
├─nvme0n1p1       2G part  /boot  # ESP
└─nvme0n1p2 11451.4G part         # LUKSコンテナ
  └─linux   11451.4G crypt /      # btrfs

になるみたいな感じのやつで,LVMは使わない。

XBOOTLDRパーティションを作ってカーネル等をそこに置く手もあるが,いろいろ考えるのが面倒だったので,クソデカESPを/bootにマウントして全てをそこに突っ込んでいる。

また,TPMを使って自動で暗号化解除したく,そこではClevisを使う。

下準備

USE='dracut grub' emerge -n sys-kernel/installkernel
emerge app-crypt/clevis::guru

cd /usr/src/linux
make install  # clevisを含むinitramfsを生成・インストール

LUKSのheaderを格納するにあたり,パーティション上のファイルシステムを切り詰める必要がある。 ちなみにxfsはこれができないらしい。

btrfs files resize -32M /

32Mってのはcryptsetup-reencrypt(8)の受け売り。

やる

LiveCD等から起動して作業する。

まず,ディスク上のデータに暇乞いをする。 したら,暗号化をする。 幸運なことにエラー無しで暗号化が済んだら,マウントして生存確認をする。

cryptsetup reencrypt --new --reduce-device-size 32M /dev/nvme0n1p2
cryptsetup open --allow-discards --persistent /dev/nvme0n1p2 linux  # ついでにallow-discardsフラグを立てておく
mount /dev/mapper/linux /mnt/rootfs
btrfs files resize max /mnt/rootfs  # 念の為

ダメそうだったら復号してやり直す。

cryptsetup close linux
cryptsetup reencrypt --decrypt --header hoge_hdr /dev/nvme0n1p2
#                                       ↑このheaderってのは中断した復号を再開するときに必要になるらしい

できたらClevisでTPMの鍵をLUKSに登録する。 clevisはchrootして実行してもよい。

# arch-chroot /mnt/rootfs  # お好みで
clevis luks bind -d /dev/nvme0n1p2 tpm2 '{}'

以上。

総括

カーネル引数すら弄ってないのに,なんかこれだけで動いた。dracut万歳!

ただ,systemdじゃないのが悪いのかdracutが悪いのか知らんが,rd.luks.namerd.luks.allow-discardsのカーネル引数がなんか無視される。 が,動いてるのでまあヨシとする。

Gentooの前にArch+mkinitcpioでやった時はもうちょいややこしかった。