为什么 linux 启动顺序在 sh 中而不是在 c 中

为什么 linux 启动顺序在 sh 中而不是在 c 中

我有一个运行 Linux 的嵌入式设备。

我正在尝试加快启动顺序。用 C 语言重写大部分启动顺序是否会加快速度?

例如,我有很多脚本可以测试这个或那个,然后挂载这个或那个。这是 /etc/rcS.d/S03sysfs

#!/bin/sh

if [ -e /proc ] && ! [ -e /proc/mounts ]; then
  mount -t proc proc /proc
fi

if [ -e /sys ] && grep -q sysfs /proc/filesystems; then
  mount sysfs /sys -t sysfs
fi

exit 0

我猜测如果它是用 C 语言编写的,那么速度会快得多,对吗?

我的问题:

为什么它还没有用 C 语言编写?
用 C 语言编写会提高速度吗?

答案1

这将是有些在 C 中速度更快,但语言选择并不是影响性能的最大因素。并行执行各种任务通常比等待每个任务按顺序完成(如更简单的 init 系统那样)更有效。例如,sshdhttpd可以同时启动,因为它们都不需要对方已经运行。


没有单一的“Linux 启动顺序”。每个发行版都有自己的启动顺序;它们甚至没有一个共同点。它可以用 C、Perl、Haskell 或任何语言编写;唯一的要求是名为的可执行文件/init必须存在于 initramfs 或/sbin/init根文件系统中。

/etc/rc?.d方案只是 20 年前甚至 30 年前 Unix 启动过程的扩展。最早的 Unix 系统很少重新启动,因此它们会有一个简单的脚本/etc/rc或类似的东西,由在里面并依次启动各个守护进程。

即使在今天SysV 初始化用于启动所有此类脚本,尽管具体方法可能有所不同。最初,系统会按/etc/rc?.d顺序启动所有脚本;目前 Debian 使用 Makefile 样式的依赖关系。

一些发行版(Ubuntu、Chrome OS、Fedora v14 及以上版本)已切换到暴发户,它是用 C 编写的,并且是“基于事件的”,允许守护进程并行启动。另一个 init 系统,systemd,似乎正在迅速流行起来——它是 Fedora 和 OpenSuSE 的默认语言。它也是用 C 编写的。(这两个系统仍然读取文本配置文件来决定要启动哪些守护进程。)

那些仍然坚持使用 SysVinit 的发行版通常是为了“简单”;最常听到的[需要引用]论点似乎是关于 shell 脚本比等效的 C 代码更容易维护(尽管所述 shell 脚本 90% 都是复制粘贴的),以及对引入额外库依赖性的极度恐惧[主观]。你可以自己看看自 2012 年 5 月起,Debian 邮件列表上的讨论主题。

(免责声明:我是systemd用户自己。

答案2

为什么它还没有用 C 语言编写?

为了跨平台兼容性,也因为它允许使用 sh 文件来描述启动过程。用 C 维护启动脚本会很麻烦。

用 C 语言编写这个程序会提高速度吗?

不多。虽然有些部分会更快,但整体速度提升幅度很小。大多数启动过程都是严格顺序的,特别是 init 1 和 2 中的步骤。从 init 3 开始,可以使用类似以下方法并行化启动过程运行,这将为你带来巨大的速度提升。

答案3

它大部分的时间都在等待一个又一个的事情:文件系统、网络等等。

如果你想要真的快速启动顺序,使用 init=/bin/sh 启动 - 即时命令提示符!如果是嵌入式系统,您可以让它直接启动到您的应用程序中。

相关内容