🐧

「まだext4使ってるの?」Ubuntu Server 23.10をroot on ZFS、LUKS暗号化、TPM自動復号でインストールする

2024/03/26に公開

Ubuntu Server 23.10をroot on ZFS(/をZFS上に置くこと)、LUKS(ディスク暗号化)、TPMによる自動復号、という構成でインストールする方法についての記事です。

前置き

「Linuxのrootファイルシステムは簡素なext4であるべき」と、つい最近まで思っていました。

昨今の潤沢なリソースにおいてはルートファイルシステムでもCopy on Writeなファイルシステムの利便性を享受してもいいのでは?
Copy on Writeなファイルシステムなら、操作ミスによるファイル消失で時間を無駄にすることも少なくなるのでは?

…と思っていたら、なんとmacOSではいつの間にAPFSなるものを採用しており、ファイルシステムレベルでのスナップショットを気持ちよく使えるではありませんか……!
同じことが自由なLinuxで出来ないはずはないのでは?
そこでroot on ZFSです。

また、クライアント向けOSなWindowsやmacOSでは無意識のうちにフルディスク暗号化が為されるこの時代、
システムが平文保存で許されるでしょうか。
そこまでの機密データなんか持っていないと思うかもしれませんが、
ブラウザのCookie、クライアント証明書、SSH鍵、VPNプロファイル、等に対してもそう言えるでしょうか。保護されるべきデータは無意識のうちに存在するのではないでしょうか。
そこでLUKSです。ZFSそのものにも暗号化機能を備わっているのですが、TPMによる自動復号等を加味するとLUKSのほうが好都合なので、今回はLUKS+ZFSの構成を選びました。
Clevisの設定を行うことで、WindowsのBitLocker同様、起動途中にパスワードを求められることはなくシステムが起動します。

ということで、root on ZFSをするメリットを列挙していきます。

  • スナップショット機能がある
    • rmコマンド誤爆した際にextundeleteに祈る必要無し
    • Ubuntuならzsysにより自動スナップショットやガベージコレクションが可能
  • パーティションとディレクトリの間のような存在、「データセット」を気軽に切れる
    • /homeなどを/から分離する際、ext4だと事前に容量を指定する必要がありストレージ使用効率が悪くなるが、ZFSデータセットなら大丈夫
  • zfs send/recvによるバックアップ機能
  • LXDやDockerのストレージドライバとしてそのまま使用可能
  • 似たような機能を持っているbtrfsと比べて風向きが良さそう

ZFSといえば多大なリソースを持ちたくさんのディスクを備えたサーバーで使うファイルシステムというイメージがあるかもしれませんが、
単一ディスクで使用しても十分なメリットを感じています。
dedupや圧縮のような癖のある機能を使わなければ、Intel N100のような非力なマシンでも支障なく運用できています。

一応デメリットも示します。

  • ライセンスの関係上、Linux kernelにマージされることはない
    • btrfsに対してZFSの欠点ではあるがユーザーが意識することは基本的に無いかと
  • 高機能かつステートを持っているファイルシステムであり、シンプルさに欠ける
    • ファイルシステム側でmountpointを持っている等
    • プールの操作やデータセットの操作など、mountコマンドだけで済むext4と比べて複雑
    • 体感的にCPUやRAMをさほど食っている感じはしないが、最低でもRAM8GBくらいはあった方が良いかと
  • OpenZFS自体は成熟しているがroot on ZFSはまだ実験的
    • ZFS起因でデータ飛ぶことは多分無いが、ブート時にGRUBやinitramfsでコケることはあるかも
  • root on ZFSはインストーラーでサポートされておらず、インストールが全て手動になるので非常に面倒

特に最後の項目について、この記事で完結できるように説明していきます。

普通のUbuntuのインストールというとインストーラーに任せてほとんどEnterキーを押すだけで済むかと思いますが、
現状のroot on ZFSは手動でのインストールが必要なので、初めは数時間程度を覚悟して臨んでください。

また、この記事は以下のOpenZFS公式ドキュメントをほとんどなぞった内容なので、そちらも参照することを推奨します。
しかし、バージョンの違いからかそのまま実行したところ後に時限爆弾的に起動不可能になったので、この記事ではその点も記載します。

Ubuntu 22.04 Root on ZFS — OpenZFS documentation

ここまで読んだ方なら、きっとroot on ZFSを試したくなったと思います。

前置きが長くなりましたが、始めましょう。

大体コピペで出来るようには書いたつもりですが、内容をよく考えて操作してください。

準備

まず、Ubuntu Server 23.10のインストーラーisoをダウンロードしUSBメモリ等に焼きます。

Ubuntuを入手する | Ubuntu | Ubuntu

root on ZFSはインストール後のトラブルシューティングが必要になることもありますが、
インストーラーisoにzfsutils-linuxが含まれていなくていちいち面倒くさいので、以下の手順での永続化をおすすめします。

永続書き込み可能なUbuntuのインストーラーUSBメモリを標準ツールだけで作る

LiveUSBを作ったら起動しインストーラーを途中まで進めてネットワーク設定を行うことでインターネットに接続し、
済んだら右上のHelpのところからシェルに入ります。

この時点で/etc/ssh/sshd_configPermitRootLogin yesにしつつ
/root/.ssh/authorized_keysに公開鍵を追加するなどしてクライアント機からsshで入れるようにし、
コマンドのコピペをできるようにすることをおすすめします。
一時的とはいえ、くれぐれもセキュリティに気をつけてください。

まず、必要なパッケージをインストールします。記事中のvimは全てお好みのエディタに置き換えてください。

apt install --yes debootstrap gdisk zfsutils-linux vim
systemctl stop zed

インストール

パーティション作成

まず、インストール対象のディスクのIDを調べます。fdisk等も併用し、くれぐれも間違えないようにしてください。

ls -l /dev/disk/by-id/

判明したら$DISKにファイルパスを代入します。nvme-TEAM_TM8FP4004T_123456は自分の環境に置き換えてください。

DISK=/dev/disk/by-id/nvme-TEAM_TM8FP4004T_123456

パーティションテーブルを抹消し、EFI System Partitionbpool(/bootを収めるZFS Pool)とrpool(/を収めるZFS Pool)用のパーティションを切ります。

swapは作りませんが、ZFS上にswapを置くと非常に良くないらしいので必要と思うならばこの時点でswap用のパーティションを切るべきだと思います。(OpenZFS公式ドキュメントを参照)

wipefs -a $DISK
sgdisk -n1:1M:+512M -t1:EF00 $DISK
sgdisk -n2::+2G -t2:BE00 $DISK
sgdisk -n3:: -t3:8309 $DISK

bpoolを作ります。非常に大量のfeatureを明示的にdisabledにしていますが、OpenZFS公式ドキュメントに倣ってこれを怠ると後にzsysctl save stateをしたときなのか何なのか、何らかのfeatureが起こされることでGRUBから読めなくなり無事死亡します。(しました)

ちなみに、そうなった場合は一旦別のところにvmlinuzとinitrdを別のUSBメモリ等に置いてGRUBのプロンプトを操作したり起動オプションを弄ったりすれば起動できますので、そのように起動可能な状態を確保しつつLiveUSBからbpoolを正しく切り直すのが良いと思います。

また、そんな地雷を抱えるくらいなら/bootはext4でと思うかもしれませんが、/etc/grub.d/10_linux_zfsとしては対応していない構成なので、それはそれであまりおすすめできません。

compression=offは個人的な好みです。OpenZFS公式ドキュメントによればcompression=lz4と指示されていますが、
ディスクの読み書きでCPUパワーを使うことに賞賛できないため、offにしました。

zpool create \
    -o ashift=12 \
    -o autotrim=on \
    -o cachefile=/etc/zfs/zpool.cache \
    -o compatibility=grub2 \
    -o feature@extensible_dataset=disabled \
    -o feature@bookmarks=disabled \
    -o feature@filesystem_limits=disabled \
    -o feature@large_blocks=disabled \
    -o feature@large_dnode=disabled \
    -o feature@sha512=disabled \
    -o feature@skein=disabled \
    -o feature@edonr=disabled \
    -o feature@userobj_accounting=disabled \
    -o feature@encryption=disabled \
    -o feature@project_quota=disabled \
    -o feature@obsolete_counts=disabled \
    -o feature@bookmark_v2=disabled \
    -o feature@redaction_bookmarks=disabled \
    -o feature@redacted_datasets=disabled \
    -o feature@bookmark_written=disabled \
    -o feature@livelist=enabled \
    -o feature@zstd_compress=disabled \
    -o feature@zilsaxattr=disabled \
    -o feature@head_errlog=disabled \
    -o feature@blake3=disabled \
    -o feature@vdev_zaps_v2=disabled \
    -o feature@zpool_checkpoint=enabled \
    -O devices=off \
    -O acltype=posixacl -O xattr=sa \
    -O compression=off \
    -O normalization=formD \
    -O relatime=on \
    -O canmount=off -O mountpoint=/boot -R /mnt -f \
    bpool ${DISK}-part2

次に、rpoolのためのLUKSパーティションを作ります。

cryptsetup luksFormat -c aes-xts-plain64 -s 512 -h sha256 ${DISK}-part3

YESと入力しEnterを押します。その後、設定したいパスワードを入力します。(もちろん長い方が良いものの、何度か入力させられるので長すぎるのも考えどころ)

cryptsetup luksOpen ${DISK}-part3 luks1

先ほど設定したパスワードを入力してLUKSを解錠します。

rpoolを作ります。bpool同様、compression=offは個人的な好みです。

zpool create \
    -o ashift=12 \
    -o autotrim=on \
    -O acltype=posixacl -O xattr=sa -O dnodesize=auto \
    -O compression=off \
    -O normalization=formD \
    -O relatime=on \
    -O canmount=off -O mountpoint=/ -R /mnt \
    rpool /dev/mapper/luks1

初めのデータセットを切ります。

zfs create -o canmount=off -o mountpoint=none rpool/ROOT
zfs create -o canmount=off -o mountpoint=none bpool/BOOT

/のデータセットを切ります。
OpenZFS公式ドキュメントに従うとrpool/ROOT/ubuntu_abc123みたいな感じで後ろにUUIDが付くのですが、
個人的には不要だと思うので入れません。

zfs create -o mountpoint=/ \
    -o com.ubuntu.zsys:bootfs=yes \
    -o com.ubuntu.zsys:last-used=$(date +%s) rpool/ROOT/ubuntu

/bootのデータセットを切ります。

zfs create -o mountpoint=/boot bpool/BOOT/ubuntu

/以下のいろいろなディレクトリのデータセットを切ります。

zfs create -o com.ubuntu.zsys:bootfs=no -o canmount=off \
    rpool/ROOT/ubuntu/usr
zfs create -o com.ubuntu.zsys:bootfs=no -o canmount=off \
    rpool/ROOT/ubuntu/var
zfs create rpool/ROOT/ubuntu/var/lib
zfs create rpool/ROOT/ubuntu/var/log
zfs create rpool/ROOT/ubuntu/var/spool

zfs create -o canmount=off -o mountpoint=/ \
    rpool/USERDATA
zfs create -o com.ubuntu.zsys:bootfs-datasets=rpool/ROOT/ubuntu \
    -o canmount=on -o mountpoint=/root \
    rpool/USERDATA/root
chmod 700 /mnt/root

zfs create rpool/ROOT/ubuntu/var/cache
zfs create rpool/ROOT/ubuntu/var/tmp
chmod 1777 /mnt/var/tmp

zfs create rpool/ROOT/ubuntu/var/lib/apt
zfs create rpool/ROOT/ubuntu/var/lib/dpkg

切りすぎると却って管理が煩雑になるとは思いますが、上記までは問答無用で切ることを強くおすすめします。

zfs create rpool/ROOT/ubuntu/usr/local
zfs create rpool/ROOT/ubuntu/var/lib/docker
zfs create rpool/ROOT/ubuntu/var/snap

上記もほとんどのユーザーは切った方が利便性が高いと思います。

tmpfs等を工面します。

mkdir /mnt/run
mount -t tmpfs tmpfs /mnt/run
mkdir /mnt/run/lock

切ったデータセットを確認します。

root@ubuntu-server:~# zfs list
NAME                               USED  AVAIL  REFER  MOUNTPOINT
bpool                              684K  1.75G    96K  /mnt/boot
bpool/BOOT                         192K  1.75G    96K  none
bpool/BOOT/ubuntu                   96K  1.75G    96K  /mnt/boot
rpool                             2.34M  3.60T    96K  /mnt
rpool/ROOT                        1.35M  3.60T    96K  none
rpool/ROOT/ubuntu                 1.26M  3.60T   128K  /mnt
rpool/ROOT/ubuntu/usr              192K  3.60T    96K  /mnt/usr
rpool/ROOT/ubuntu/usr/local         96K  3.60T    96K  /mnt/usr/local
rpool/ROOT/ubuntu/var              968K  3.60T    96K  /mnt/var
rpool/ROOT/ubuntu/var/cache         96K  3.60T    96K  /mnt/var/cache
rpool/ROOT/ubuntu/var/lib          392K  3.60T   104K  /mnt/var/lib
rpool/ROOT/ubuntu/var/lib/apt       96K  3.60T    96K  /mnt/var/lib/apt
rpool/ROOT/ubuntu/var/lib/docker    96K  3.60T    96K  /mnt/var/lib/docker
rpool/ROOT/ubuntu/var/lib/dpkg      96K  3.60T    96K  /mnt/var/lib/dpkg
rpool/ROOT/ubuntu/var/log           96K  3.60T    96K  /mnt/var/log
rpool/ROOT/ubuntu/var/snap          96K  3.60T    96K  /mnt/var/snap
rpool/ROOT/ubuntu/var/spool         96K  3.60T    96K  /mnt/var/spool
rpool/ROOT/ubuntu/var/tmp           96K  3.60T    96K  /mnt/var/tmp
rpool/USERDATA                     192K  3.60T    96K  /mnt
rpool/USERDATA/root                 96K  3.60T    96K  /mnt/root
root@ubuntu-server:~#

Ubuntuインストール

debootstrapにてUbuntuの最小システムをインストールします。manticは23.10です。

sshで入っている場合、切れても大丈夫なようにtmux等を使うことをおすすめします。

debootstrap mantic /mnt

少々時間が掛かるので、食事か入浴か睡眠をしましょう。

終わったら進みます。

mkdir /mnt/etc/zfs
cp /etc/zfs/zpool.cache /mnt/etc/zfs/

好きなhostnameをつけてください。

hostname YOUR-HOSTNAME
hostname > /mnt/etc/hostname
echo -e "127.0.0.1\\tYOUR-HOSTNAME" >> /mnt/etc/hosts

netplanにてネットワーク設定を書きます。(割愛)

vim /mnt/etc/netplan/00-config.yaml

aptリポジトリの設定を書きます。OpenZFS公式ドキュメントは随分と簡素でしたが、ここでは通常のインストールに合わせた内容を記載します。

vim /mnt/etc/apt/sources.list
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://archive.ubuntu.com/ubuntu/ mantic main restricted
# deb-src http://archive.ubuntu.com/ubuntu/ mantic main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://archive.ubuntu.com/ubuntu/ mantic-updates main restricted
# deb-src http://archive.ubuntu.com/ubuntu/ mantic-updates main restricted

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://archive.ubuntu.com/ubuntu/ mantic universe
# deb-src http://archive.ubuntu.com/ubuntu/ mantic universe
deb http://archive.ubuntu.com/ubuntu/ mantic-updates universe
# deb-src http://archive.ubuntu.com/ubuntu/ mantic-updates universe

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://archive.ubuntu.com/ubuntu/ mantic multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ mantic multiverse
deb http://archive.ubuntu.com/ubuntu/ mantic-updates multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ mantic-updates multiverse

## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb http://archive.ubuntu.com/ubuntu/ mantic-backports main restricted universe multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ mantic-backports main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu/ mantic-security main restricted
# deb-src http://security.ubuntu.com/ubuntu/ mantic-security main restricted
deb http://security.ubuntu.com/ubuntu/ mantic-security universe
# deb-src http://security.ubuntu.com/ubuntu/ mantic-security universe
deb http://security.ubuntu.com/ubuntu/ mantic-security multiverse
# deb-src http://security.ubuntu.com/ubuntu/ mantic-security multiverse

いよいよ、まずはchrootで入ります。

mount --make-private --rbind /dev  /mnt/dev
mount --make-private --rbind /proc /mnt/proc
mount --make-private --rbind /sys  /mnt/sys
chroot /mnt /usr/bin/env DISK=$DISK bash --login

chroot環境内

無事chrootで入ることに成功しましたら、chrootの中で以下に進みます。

apt update
dpkg-reconfigure locales tzdata console-setup

ja_jp.UTF-8、Asia/Tokyo、UTF-8 に設定しましたが、各自の環境に合わせてください。

お好きなエディタを入れます

apt install vim

LUKSのための設定をします。

apt install cryptsetup

echo luks1 /dev/disk/by-uuid/$(blkid -s UUID -o value ${DISK}-part3) \
    none luks,discard,initramfs > /etc/crypttab

EFI System Partitionを作ります。

apt install dosfstools

mkdosfs -F 32 -s 1 -n EFI ${DISK}-part1
mkdir /boot/efi
echo /dev/disk/by-uuid/$(blkid -s UUID -o value ${DISK}-part1) \
    /boot/efi vfat defaults 0 0 >> /etc/fstab
mount /boot/efi

mkdir /boot/efi/grub /boot/grub
echo /boot/efi/grub /boot/grub none defaults,bind 0 0 >> /etc/fstab
mount /boot/grub

UEFI向けのGRUBパッケージをインストールします。

apt install \
    grub-efi-amd64 grub-efi-amd64-signed linux-image-generic \
    shim-signed zfs-initramfs zsys

まさかWindowsとのデュアルブートなどという曲芸はしていないと思うので消します。

apt purge os-prober

とりあえずrootログインが必要なのでパスワードを設定します。
インストール終了後に削除するので深く考えなくて大丈夫です。

passwd

/tmpを工面します。

cp /usr/share/systemd/tmp.mount /etc/systemd/system/
systemctl enable tmp.mount

よく分からないのですがやります。

addgroup --system lpadmin
addgroup --system lxd
addgroup --system sambashare

SSHサーバーを入れます。別に後でも大丈夫だと思います。

apt install openssh-server

bpoolの正常性を確認します。

grub-probe /boot

zfsと出ればOKです。ダメな場合はbpoolがおかしいので作り直してください。

OKな場合、initramfsを作ります。

update-initramfs -c -k all

お好きなエディタでGRUB編集します。

vim /etc/default/grub

ここら辺は個人的な好みですが、

GRUB_CMDLINE_LINUX_DEFAULTからquiet splashを消します。

GRUB_TIMEOUT_STYLEmenuにします。

GRUB_TIMEOUT2にします。

弄ったら忘れずに行います

update-grub

そしてgrub-installします。

grub-install --target=x86_64-efi --efi-directory=/boot/efi \
    --bootloader-id=ubuntu --recheck --no-floppy

よく分からないのですが、ZFS関連のファイルを作ります。

mkdir /etc/zfs/zfs-list.cache
touch /etc/zfs/zfs-list.cache/bpool
touch /etc/zfs/zfs-list.cache/rpool
zed -F &

少し経った後、

cat /etc/zfs/zfs-list.cache/bpool
cat /etc/zfs/zfs-list.cache/rpool

この2つが空っぽでなければOKです。

zedを止めたいのでシェルに取り戻します。

fg

Ctrl-Cを押してzed -Fを止めます。

よく分からないのですが、cacheのマウントポイントを修正します。

sed -Ei "s|/mnt/?|/|" /etc/zfs/zfs-list.cache/*

chrootから抜けます。

exit

LiveUSBでの作業終了、再起動

sync;sync;sync
mount | grep zfs | tac | awk '/\/mnt/ {print $3}' | \
    xargs -i{} umount -lf {}
zpool export -a

3回syncしたのでzpool export失敗しても大丈夫なはずなので再起動します。

reboot

しばらくするとinitramfs内でLUKSのパスワードを求められるので入れると解錠されますが、
ファイルシステムをマウント出来ずinitramfsプロンプトが現れるので、

(initramfs) zpool import -f bpool
(initramfs) zpool import -f rpool
(initramfs) exit

これで起動してログインプロンプトが出るはずなので、rootログインします。

次に、ユーザーを作ります。OpenZFS公式ドキュメントではユーザーのデータセットにもUUIDを付けることになっていますが、
ユーザーにこそUUIDを付ける意義が全く分からないので、システム同様付けません。

username=YOUR_USERNAME
ROOT_DS='rpool/ROOT/ubuntu'
zfs create -o com.ubuntu.zsys:bootfs-datasets=$ROOT_DS \
    -o canmount=on -o mountpoint=/home/$username \
    rpool/USERDATA/${username}
adduser $username

adduserにてパスワードを求められたら入力し、あとは適当にEnter連打するなどしてユーザーを追加します。

次に、ホームディレクトリを作ります。

cp -a /etc/skel/. /home/$username
chown -R $username:$username /home/$username
usermod -a -G adm,cdrom,dip,lpadmin,lxd,plugdev,sambashare,sudo $username

まともなUbuntuシステムをインストールし、ログアウトします。

apt dist-upgrade
apt install ubuntu-standard

exit

先ほど作ったユーザーでログイン出来るか確認し、個人的にはここら辺のタイミングでSSH鍵を仕込みます。
curlのURLは自分のGitHubアカウントIDに置き換えてください。置き換えを怠った場合、私にsshログインを許可することになります。

mkdir .ssh
sudo apt install curl
curl https://github.com/kenh0u.keys > .ssh/authorized_keys

Ubuntuの流儀に従ってrootログインを無効化し、再起動します。

sudo usermod -p '*' root
sudo reboot

再起動後、ユーザーでログインしたらLUKSヘッダーをバックアップします。

sudo cryptsetup luksHeaderBackup /dev/disk/by-id/nvme-TEAM_TM8FP4004T_123456-part3 \
    --header-backup-file luks1-header.dat

これをDropboxとかにバックアップしておくと、LUKSの鍵を追加,削除する際にミスって吹っ飛ばしても復旧できるらしいです。

セキュアブート有効化

UEFI設定のセキュアブートの項目にて一旦StandardをCustomにしてリセット的なことをしてStandardに戻し、Ubuntuを起動します。
UEFI設定についてはマシン毎の差異があるため割愛します。

sudo dmesg | grep secure
[    0.000000] secureboot: Secure boot enabled
[    0.015544] secureboot: Secure boot enabled

こんなようなものが標準出力に出てきていればセキュアブートは有効になっているのですが、後のドライバインストールに備えてMOKを作ってUEFIに登録します。

sudo update-secureboot-policy --new-key
sudo mokutil --import /var/lib/shim-signed/mok/MOK.der

パスワードを求められるので、ほどほどなものを入力します。

sudo reboot

MOK Managerが立ち上がるのでスルーせずにMOKを登録します。

セキュアブートを煙たがる方が多いのですが、せっかく用意されているセキュリティ機能は有効にすべきと考えています。

Clevisの設定(TPMを利用してLUKS自動アンロック)

起動する度に途中でLUKSのパスワードを求められて面倒臭いと思うので、自動復号を設定します。

ただし、セキュリティレベルを下げる行為ではあるため、運用事情によっては自動復号せずdropbear-initramfsを使用すべきかもしれませんので、
その場合はこの項はスキップしてください。

sudo apt install clevis clevis-tpm2 clevis-initramfs
sudo tpm2_getcap pcrs

TPMのpcrバンクが表示されます。

selected-pcrs:
  - sha1: [ ]
  - sha256: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 ]
  - sha384: [ ]
  - sm3_256: [ ]

よく分からないのですが、程よく先頭すぎず真ん中寄りのpcrバンクを使っておけば良いのではと思いますので、7番を使います。

sudo clevis luks bind -d /dev/disk/by-id/nvme-TEAM_TM8FP4004T_123456-part3 tpm2 '{"pcr_bank":"sha256","pcr_ids":"7"}'

LUKSパスワードを求められますので、入力すると登録されます。

一応登録状況を確認します。

sudo clevis luks list -d /dev/disk/by-id/nvme-TEAM_TM8FP4004T_123456-part3

一応改めてupdate-initramfsしておきます。

sudo update-initramfs -u -k all

自動復号が出来るかどうか確認するため、再起動します。

sudo reboot

正しく設定出来ていればinitramfsでLUKSパスワードを入力せずに無事起動できるはずです。

Clevis設定は以上ですが、UEFIのファームウェアアップデート等でTPMのデータを吹っ飛ばした際の再登録方法を書いておきます。

まずはスロットを確認します。

sudo clevis luks list -d /dev/disk/by-id/nvme-TEAM_TM8FP4004T_123456-part3

1個しか無ければこのコマンドで消します。複数ある場合は-sをうまく指定しつつ全部消します。

sudo clevis luks unbind -d /dev/disk/by-id/nvme-TEAM_TM8FP4004T_123456-part3 -s 1

そして再登録します。

sudo clevis luks bind -d /dev/disk/by-id/nvme-TEAM_TM8FP4004T_123456-part3 tpm2 '{"pcr_bank":"sha256","pcr_ids":"7"}'

その他

セキュリティのため、unattended-upgradesは入れた方がいいかと思います。

sudo apt install unattended-upgrades

また、折角root on ZFSしたならばzsysによる自動スナップショットも設定すべきなのですが、
ひとまずこの記事はここまでとし、以降に別記事でzsysの設定について書けたらと思います。

おわりに

ここまで読んで実際にインストールした方は、まるでGentooかのように煩雑なインストール手順に感じたのではないでしょうか。

今後のUbuntuがサーバーOSとしてだけでなくクライアントOSとしてWindowsに勝つためには、macOSがAPFSで実現しているようにCopy on Writeなファイルシステムは絶対に必要だと個人的には思うので、
このroot on ZFSが将来もっと簡単に行えるようになるといいなと思っています。

また、Ubuntu 24.04 nobleのリリースも近づいていますので、リリースされたら真っ先にroot on ZFS周りについて確認します。

記事の感想や指摘についてのリプライなど歓迎ですので、気兼ねなく送ってください。

Discussion