我设法创建了一个小型且功能齐全的 live Linux CD,其中仅包含内核(使用默认选项编译)和 BusyBox(使用默认选项+静态编译,所有小程序都存在,包括/sbin/init
)。我的创建initrd
和填充没有任何问题/dev
,/proc
而且/sys
我的 shell 脚本也没有任何问题/init
。
最近我读到 BusyBox 支持/etc/inittab
配置(至少在某种程度上),我非常想做以下任一操作:
- 忘记我的
/init
shell 脚本并完全依赖/etc/inittab
配置。 - 同时使用
/init
shell 脚本和/etc/inittab
配置。
/etc/inittab
现在实际的问题 -当我的发行版启动时,似乎完全被忽略了。症状是:
- 当我
/init
只删除并离开时/etc/inittab
,我最终会陷入内核恐慌。我的假设是内核/sbin/init
根本不执行,或者/sbin/init
找不到(或读取)/etc/inittab
。 - 我读到即使没有 .BusyBox 也应该可以正常工作
/etc/inittab
。所以,我删除了两者/init
,/etc/inittab
你猜怎么着——内核再次恐慌。 - 我尝试从我的 shell 执行
/sbin/init
,经过多次猜测(包括 )exec /sbin/init
,setsid /sbin/init
最终exec setsid /sbin/init
出现了内核恐慌。文件系统上存在或不存在 /etc/inittab 均可。
/init
这是我的shell 脚本的内容:
#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
setsid cttyhack /bin/sh
此时我不在乎内容是什么/etc/inittab
,只要我有办法知道那里的配置确实有效即可。我尝试了几种/etc/inittab
配置,都是基于我找到的信息这里。
我的 /etc/inittab 至少只包含这一行:
::sysinit:/bin/sh
再次 - 我最终遇到了内核恐慌,而且似乎/etc/inittab
被忽略了。
任何有关如何强制我的小型实时发行版与 BusyBox 正常工作的建议都/etc/inittab
将受到高度赞赏!
更新:
- 只是为了说清楚 - 我不要我当前的
/init
shell 脚本无论有没有/etc/inittab
.一切正常,我的/bin/ash
控制台运行良好,我没有遇到任何意外的麻烦。唯一的问题是/etc/inittab
,正如我上面所描述的,它被完全忽略了。 - 我研究了 3 个不同的实时 Linux 发行版:Slax、Finnix 和 SysResCD。他们都有
/init
,又没有/etc/inittab
。此外这篇维基文章我的怀疑/sbin/init
根本没有被援引。
答案1
好的,我做了很多广泛的研究,我发现了问题所在。让我们一一开始:
- 当我们使用
initramfs
引导方案时,内核调用的第一个进程是/init
脚本。内核永远不会尝试/sbin/init
直接执行。 /init
被分配了进程标识符1。这非常重要!- 现在的问题是
/sbin/init
只能以 PID 1 的身份启动,PID 1
但我们已经/init
以 PID 1 的身份运行。 exec /sbin/init
解决方案是在我们还在里面时执行命令行/init
。这样,新进程(即/sbin/init
)将从其父进程(PID 1)继承 PID/init
,这就是我们所要做的。
我在初始配置中遇到的问题(请参阅问题)是由于我的/init
脚本所做的最后一件事是生成/bin/sh
分配了全新 PID 的新进程。从这一点来说,直接从交互式控制台运行是不可能的,/sbin/init
因为即使我们执行命令行exec /sbin/init
,我们实现的最好的结果就是分配已经分配给 shell 的相同 PID,并且这个 PID 绝对不是 PID 1。
长话短说 -exec /sbin/init
直接执行命令行/init
,仅此而已。