LUKS2 + LVM2パーティション内でkexecを使用して別のカーネルをチェーンロードする方法は?

LUKS2 + LVM2パーティション内でkexecを使用して別のカーネルをチェーンロードする方法は?

次のパーティションレイアウトでDebian 11をインストールしました。

滞在 マウントポイント
/dev/nvme0n1p7 ext4(暗号化なし) /boot(Debian 11)
/dev/nvme0n1p8 dm-crypt LUKS2 LVM2(名前vg_main
/dev/mapper/vg_main-lv_swap swap -
/dev/mapper/vg_main-lv_debian ext4 /(Debian 11)
/dev/mapper/vg_main-lv_ubuntu ext4 /(Ubuntu 22.04)

Ubuntuの場合は、/bootルートファイルシステム(/dev/mapper/vg_main-lv_ubuntu)内にあります。パーティションの/bootロックを解除する暗号化されていないパーティションにあるDebianカーネルを起動した後、Ubuntuカーネルをkexecしたいと思いますLUKS2

使いたいsystemd kexec戦略はここに説明されています。

特定のカーネルパラメータをDebian 11に渡して(このタスク用GRUB2に特別に書かれた項目でこれを行います)、systemdにUbuntu 22.04カーネルを単純にkexecするように指示する方法はありますか?


解決策:

に従って働く@Telcom推奨事項は次のとおりです。

/etc/systemd/system/ubuntu-kexec.target

[Unit]
Description=Ubuntu kexec target
Requires=sysinit.target ubuntu-kexec.service
After=sysinit.target ubuntu-kexec.service
AllowIsolate=yes

/etc/systemd/system/ubuntu-kexec.service

[Unit]
Description=Ubuntu kexec service
DefaultDependencies=no
Requires=sysinit.target
After=sysinit.target
Before=shutdown.target umount.target final.target

[Service]
Type=oneshot
ExecStart=/usr/bin/mount -o defaults,ro /dev/mapper/vg_main-lv_ubuntu /mnt
ExecStart=/usr/sbin/kexec -l /mnt/boot/vmlinuz --initrd=/mnt/boot/initrd.img --command-line="root=/dev/mapper/vg_main-lv_ubuntu resume=UUID=[MY-UUID-HERE] ro quiet splash"
ExecStart=/usr/bin/systemctl kexec

[Install]
WantedBy=ubuntu-kexec.target

答え1

ubuntu-kexec.target基本的に、次の簡単なバージョンを設定したい場合がありますmulti-user.target

[Unit]
Description=Kexec an Ubuntu kernel from within an encrypted partition
Requires=basic.target    #You might get by with just sysinit.target here
Conflicts=rescue.service rescue.target
Wants=ubuntu-kexec.service
After=basic.target rescue.service rescue.target ubuntu-kexec.service
AllowIsolate=yes

ubuntu-kexec.serviceこれにより、kexecコマンドを実行するために生成するエントリが呼び出されます。

カーネルパラメータはsystemd.unit=ubuntu-kexec.target、呼び出し方法と似ているか必要な場合ですrescue.targetemergency.target

アイデアは、ファイルシステムをマウントするためにubuntu-kexec.targetドラッグするbasic.targetか、単にドラッグすることです。その後、ファイルシステムをドラッグして実際のコマンドラインを実行します。sysinit.targetubuntu-kexec.servicekexec

私が知っている限り、オプションは1つだけ指定でき、「通常どおりに/から起動してからプルする」を指定する必要があるsystemd.unit=ため、必要なすべての詳細を指定するにはタイプ単位が必要です。sysinit.targetbasic.targetubuntu-kexec.service*.target

関連情報