![如何在 LUKS2 + LVM2 分区内使用 kexec 链式加载另一个内核?](https://linux22.com/image/206618/%E5%A6%82%E4%BD%95%E5%9C%A8%20LUKS2%20%2B%20LVM2%20%E5%88%86%E5%8C%BA%E5%86%85%E4%BD%BF%E7%94%A8%20kexec%20%E9%93%BE%E5%BC%8F%E5%8A%A0%E8%BD%BD%E5%8F%A6%E4%B8%80%E4%B8%AA%E5%86%85%E6%A0%B8%EF%BC%9F.png)
我安装了 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) |
对于/boot
Ubuntu, 位于其根文件系统 ( /dev/mapper/vg_main-lv_ubuntu
) 内。我想在启动位于未加密/boot
分区中的 Debian 内核(该分区解锁该LUKS2
分区)后 kexec Ubuntu 内核。
有没有办法将任何特定的内核参数传递给 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
来指定所有必要的详细信息。