LUKS2 + LVM2 파티션 내에서 kexec를 사용하여 다른 커널을 체인로드하는 방법은 무엇입니까?

LUKS2 + LVM2 파티션 내에서 kexec를 사용하여 다른 커널을 체인로드하는 방법은 무엇입니까?

다음 파티션 레이아웃으로 Debian 11을 설치했습니다.

체재 마운트 포인트
/dev/nvme0n1p7 ext4(암호화 없음) /boot(데비안 11)
/dev/nvme0n1p8 dm-crypt LUKS2 LVM2(이름 vg_main)
/dev/mapper/vg_main-lv_swap swap -
/dev/mapper/vg_main-lv_debian ext4 /(데비안 11)
/dev/mapper/vg_main-lv_ubuntu ext4 /(우분투 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하도록 지시할 수 있는 방법이 있습니까?


해결책:

따라 일하다@텔콤권장 사항은 다음과 같습니다.

/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.targetubuntu-kexec.servicekexec

내가 아는 한 옵션은 하나만 지정할 수 있고 , "보통대로 / 로 부팅 한 다음 끌어오기 " systemd.unit=를 지정해야 하므로 필요한 모든 세부 사항을 지정하려면 유형 단위가 필요합니다 .sysinit.targetbasic.targetubuntu-kexec.service*.target

관련 정보