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

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

我设法创建了一个小型且功能齐全的 live Linux CD,其中仅包含内核(使用默认选项编译)和 BusyBox(使用默认选项+静态编译,所有小程序都存在,包括/sbin/init)。我的创建initrd和填充没有任何问题/dev/proc而且/sys我的 shell 脚本也没有任何问题/init

最近我读到 BusyBox 支持/etc/inittab配置(至少在某种程度上),我非常想做以下任一操作:

  • 忘记我的/initshell 脚本并完全依赖/etc/inittab配置。
  • 同时使用/initshell 脚本和/etc/inittab配置。

/etc/inittab现在实际的问题 -当我的发行版启动时,似乎完全被忽略了。症状是:

  • 当我/init只删除并离开时/etc/inittab,我最终会陷入内核恐慌。我的假设是内核/sbin/init根本不执行,或者/sbin/init找不到(或读取)/etc/inittab
  • 我读到即使没有 .BusyBox 也应该可以正常工作/etc/inittab。所以,我删除了两者/init/etc/inittab你猜怎么着——内核再次恐慌。
  • 我尝试从我的 shell 执行/sbin/init,经过多次猜测(包括 )exec /sbin/initsetsid /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将受到高度赞赏!

更新:

  • 只是为了说清楚 - 我不要我当前的/initshell 脚本无论有没有/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,仅此而已。

相关内容