Linux 内核启动:无法执行 /init(错误 -2)

Linux 内核启动:无法执行 /init(错误 -2)

我正在尝试使用“编写自己的操作系统”的教程“在 1 小时内仅使用 Busybox 构建一个最小的 Linux”来创建一个最小的 Linux 发行版,当我启动它时,所有这些都有效,它给了我:

[    0.187524] Run /init as init process
[    0.187624] Failed to execute /init (error -2)
[    0.187674] Run /sbin/init as init process
[    0.187707] Run /etc/init as init process
[    0.187753] Run /bin/init as init process
[    0.187807] Run /bin/sh as init process
[    0.187872] Kernel panic - not syncing: No working init found.  Try passing init= option to kernel. See Linux Documentation/admin-guide/init.rst for guidance.
[    0.187973] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.18.9 #1
[    0.188032] Call trace:
[    0.188044]  dump_backtrace.part.0+0xcc/0xe0
[    0.188103]  show_stack+0x18/0x6c
[    0.188117]  dump_stack_lvl+0x68/0x84
[    0.188167]  dump_stack+0x18/0x34
[    0.188195]  panic+0x168/0x328
[    0.188215]  kernel_init+0x12c/0x13c
[    0.188262]  ret_from_fork+0x10/0x20
[    0.188279] SMP: stopping secondary CPUs
[    0.188340] Kernel Offset: disabled
[    0.188363] CPU features: 0x000,0000140a,59a49dc8
[    0.188409] Memory Limit: none
[    0.188426] ---[ end Kernel panic - not syncing: No working init found.  Try passing init= option to kernel. See Linux Documentation/admin-guide/init.rst for guidance. ]---

初始化文件:

#!/bin/sh
mount -t sysfs sysfs /sys
mount -t proc proc /proc
mount -t devtmpfs udev /dev
sysctl -w kernel.printk="2 4 1 7"
/bin/sh

答案1

  1. 设置 BINFMT_SCRIPT 以允许内核运行脚本...实际上允许像您一样运行非二进制 INIT。之后内核将出现“错误 8”而不是“错误 2”,因为内核应该允许运行二进制 ELF(例如 /bin/sh)。
  2. 所以现在你还需要设置 BINFMT_ELF。

答案2

对于下一个遇到此错误的人:我遇到了同样的问题,并注意到BINFMT_SCRIPTBINFMT_ELF选项都设置为y,但我仍然遇到此错误。

init请注意,文件的第一行#!/bin/bash指的是用于运行脚本的程序。在这种情况下,busy box没有为我们编译bash,而是我们只有/bin/sh,所以解决方案是替换bashshin init

#!/bin/sh

相关内容