我正在尝试使用“编写自己的操作系统”的教程“在 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
- 设置 BINFMT_SCRIPT 以允许内核运行脚本...实际上允许像您一样运行非二进制 INIT。之后内核将出现“错误 8”而不是“错误 2”,因为内核应该允许运行二进制 ELF(例如 /bin/sh)。
- 所以现在你还需要设置 BINFMT_ELF。
答案2
对于下一个遇到此错误的人:我遇到了同样的问题,并注意到BINFMT_SCRIPT
和BINFMT_ELF
选项都设置为y
,但我仍然遇到此错误。
init
请注意,文件的第一行#!/bin/bash
指的是用于运行脚本的程序。在这种情况下,busy box没有为我们编译bash,而是我们只有/bin/sh
,所以解决方案是替换bash
为sh
in init
:
#!/bin/sh