带有内核和 BusyBox 的最小 Linux:忽略 /etc/inittab,只执行 /init

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
  • 我读到 BusyBox 即使没有/etc/inittab. 所以,我删除了/initand/etc/inittab并猜猜是什么 - 内核再次恐慌。
  • 我试图执行/sbin/init从我的外壳经过几次猜测,其中包括exec /sbin/initsetsid /sbin/initexec 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完全忽略了,正如我上面所描述的。
  • 我检查了 3 个不同的实时 Linux 发行版:Slax、Finnix 和 SysResCD。他们都有/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