如何在 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 /(乌班图22.04)

对于/bootUbuntu, 位于其根文件系统 ( /dev/mapper/vg_main-lv_ubuntu) 内。我想在启动位于未加密/boot分区中的 Debian 内核(该分区解锁该LUKS2分区)后 kexec Ubuntu 内核。

我想使用这里描述了 systemd kexec 策略

有没有办法将任何特定的内核参数传递给 Debian 11(我将在GRUB2为此专门创建的条目中执行此操作)以告诉 systemd 简单地 kexec Ubuntu 22.04 内核?


解决方案:

工作按照@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.target或。emergency.target

这个想法是,ubuntu-kexec.target将拉入basic.target(甚至只是拉入sysinit.target)以安装文件系统,然后拉入ubuntu-kexec.service运行实际kexec命令行的文件系统。

据我所知,您可以只指定一个systemd.unit=选项,并且由于您需要指定“照常启动到sysinit.target/ basic.target,然后拉入ubuntu-kexec.service,因此您需要一种类型单元*.target来指定所有必要的详细信息。

相关内容