Luks
來自 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]
謝謝!
我們找到了解決方案。基本上,出於測試目的,我們從 init 腳本末尾打開的 /bin/bash 執行我們的 exec switch_root。問題是 switch_root 需要以 PID 1 執行,但在我們的設置中,該 PID 不可用,因為它被 init 佔用。
PID 1: /init PID x: /bin/bash => exec switch_root from /bin/bash 會將 PID x 分配給 switch_root。那不是一個選擇。因此,對於測試環境,解決方案是在 init 結束時呼叫 exec /bin/bash,然後像往常一樣呼叫 exec swtich_root。對於生產,我們在 init 末尾移動了 exec switch_root(當然刪除了對 /bin/bash 的呼叫)。