initramfs의 switch_root가 실패합니다.

initramfs의 switch_root가 실패합니다.

우리는 다음과 같은 목적으로 initramfs를 구현하려고 합니다.

LUKS 파티션 열기(TPM에 저장된 키 사용) 파티션 마운트 RO OverlayFS switch_root를 새 시스템에 마운트

스크립트의 첫 번째 부분은 제대로 작동하는 것 같습니다. 우리의 문제는 "switch_root" 부분에 있었고, 이로 인해 궁극적으로 커널 패닉이 발생했습니다.

암호화/덮어쓰기 부분이 없으면 동일한 문제가 발생합니다. 문제는 switch_root와 밀접한 관련이 있는 것 같습니다.

우리는 Yocto Sumo를 사용하고 initramfs 이미지는 커널과 함께 번들로 제공됩니다.

첨부된 커널 패닉 로그를 찾으십시오.

    bash-4.4# exec switch_root /newroot /sbin/init
BusyBox v1.27.2 (2020-05-20 09:00:12 UTC) multi-call binary.

Us[  593.127118] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000100
[  593.127118]
age: switch_root [-c [/ d e59v3/.137247] CPU: 1 PID: 1 Comm: init Tainted: G        W       4.14.98+g80655a2d3532 #1
[  593.147478] Hardware name: Engicam i.Core MX8MM module (DT)
onsole] N[E W _5R9O3O.T1 5N3E0W8_] Call trace:
[  593.157367] [<ffff000008089c30>] dump_backtrace+0x0/0x3c8
[  593.162798] [<ffff00000808a00c>] show_stack+0x14/0x20
INIT [ARGS]
[  593.167891] [<ffff000008d50040>] dump_stack+0x9c/0xbc
[  593.174075] [<ffff0000080ce5b0>] panic+0x11c/0x28c
[  593.178902] [<ffff0000080d27d8>] complete_and_exit+0x0/0x20
[  593.184495] [<ffff0000080d2840>] do_group_exit+0x38/0xa0
[  593.189828] [<ffff0000080d28b8>] __wake_up_parent+0x0/0x28
[  593.195338] Exception stack(0xffff00000805bec0 to 0xffff00000805c000)
[  593.201800] bec0: 0000000000000001 0000000000000001 0000000000000001 0000ffffa819b700
[  593.209644] bee0: 0000000000000020 0000ffffcb90abc8 0000000000010000 0000ffffa81a4a18
[  593.217490] bf00: 000000000000005e fffffffffffffff0 0101010101010101 0000000000000000
[  593.225336] bf20: 0101010101010101 00000000004f2f10 0000ffffa7fe92c8 0000ffffa7fdbde0
[  593.233184] bf40: 0000ffffa7fd7028 0000ffffa800cb68 00000000000005c2 0000000000000008
[  593.241030] bf60: 0000000000000008 0000ffffa8122bb8 0000000000000001 0000ffffa8125000
[  593.248874] bf80: 0000ffffa81265a0 0000ffffa81a3738 0000000000000001 0000000000000000
[  593.256719] bfa0: 0000ffffa812a000 0000ffffcb90ac70 0000ffffa800c7f0 0000ffffcb90ac70
[  593.264564] bfc0: 0000ffffa807946c 0000000060000000 0000000000000001 000000000000005e
[  593.272408] bfe0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
[  593.280259] [<ffff000008083ac0>] el0_svc_naked+0x34/0x38
[  593.285620] SMP: stopping secondary CPUs
[  593.290003] Kernel Offset: disabled
[  593.293520] CPU features: 0x080200c
[  593.297028] Memory Limit: none
[  593.300135] ---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000100
[  593.300135]

감사해요!

답변1

우리는 해결책을 찾았습니다. 기본적으로 테스트 목적으로 init 스크립트 끝에 열린 /bin/bash에서 exec switch_root를 실행합니다. 문제는 switch_root가 PID 1로 실행되어야 하지만 우리 설정에서는 이 PID가 init에 의해 점유되기 때문에 사용할 수 없다는 것입니다.

PID 1: /init PID x: /bin/bash => /bin/bash에서 switch_root를 실행하면 PID x가 switch_root에 할당됩니다. 그것은 선택 사항이 아닙니다. 따라서 테스트 환경의 경우 해결책은 init 끝에서 exec /bin/bash를 호출한 다음 평소대로 exec swtich_root를 호출하는 것입니다. 프로덕션을 위해 exec switch_root를 init의 끝으로 이동합니다(물론 /bin/bash에 대한 호출을 제거함).

관련 정보