Iva*_*dov 12 linux init-script busybox init sysvinit
我设法创建了一个小型且功能齐全的实时 Linux CD,其中仅包含内核(使用默认选项编译)和 BusyBox(使用默认选项 + 静态编译,所有小程序都存在,包括/sbin/init)。我没有问题,建立initrd和填充/dev,/proc并且/sys也是我在所有与我没有任何问题/initshell脚本。
最近我读到 BusyBox 支持/etc/inittab配置(至少在某种程度上),我非常想执行以下任一操作:
/initshell 脚本,完全依赖于/etc/inittab配置。/initshell 脚本和/etc/inittab配置。现在是实际问题 -/etc/inittab当我的发行版启动时,这似乎完全被忽略了。症状是:
/init并离开时,/etc/inittab我最终会遇到内核恐慌。我的假设是内核根本不执行/sbin/init,或者/sbin/init没有 find (or read) /etc/inittab。/etc/inittab. 所以,我删除了/initand/etc/inittab并猜猜是什么 - 内核再次恐慌。/sbin/init从我的外壳经过几次猜测,其中包括exec /sbin/init,setsid /sbin/init和exec setsid /sbin/init我结束了内核崩溃。文件系统上存在和不存在 /etc/inittab 的情况。这是我的/initshell脚本的内容:
#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
setsid cttyhack /bin/sh
Run Code Online (Sandbox Code Playgroud)
在这一点上,我不在乎 的内容是什么/etc/inittab,只要我有办法知道那里的配置确实有效。我尝试了几种/etc/inittab配置,所有配置都基于我在此处找到的信息。
作为最低限度,我的 /etc/inittab 只包含这一行:
::sysinit:/bin/sh
Run Code Online (Sandbox Code Playgroud)
再次 - 我最终遇到内核恐慌,似乎/etc/inittab被忽略了。
任何关于如何强制我的小型实时发行版与 BusyBox 一起正常工作的建议/etc/inittab都非常感谢!
更新:
/init既没有shell脚本/etc/inittab。一切正常,我的/bin/ash控制台运行良好,我没有遇到任何意外问题。唯一的问题是/etc/inittab完全忽略了,正如我上面所描述的。/init,没有一个有/etc/inittab。此外,这篇 Wiki 文章总结了我/sbin/init根本没有引用的怀疑。Iva*_*dov 11
好吧,我做了很多广泛的研究,我发现了哪里出了问题。让我们一一开始:
initramfs引导方案时,内核调用的第一个进程是/init脚本。内核永远不会尝试/sbin/init直接执行。/init 被分配进程标识符1。这很重要!/sbin/init只能以 as 启动,PID 1但我们已经/init作为 PID 1运行。exec /sbin/init在我们还在里面的时候执行命令行/init。通过这种方式,新进程(即/sbin/init)将从其父进程(/initPID 为 1)继承 PID ,这就是我们要做的全部。我在初始配置中遇到的问题(请参阅问题)是由于我的/init脚本所做的最后一件事是生成/bin/sh分配了全新 PID 的新进程。从这一点来看,/sbin/init直接从交互式控制台运行是不可能的,因为即使我们执行命令行exec /sbin/init,我们实现的最好的结果是分配已经分配给 shell 的相同 PID,而这个 PID 绝对不是 PID 1。
长话短说 -exec /sbin/init直接从命令行执行,仅此而已/init。