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

use*_*190 5 linux boot speed

我有一个运行 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
Run Code Online (Sandbox Code Playgroud)

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

我的问题:

为什么它不是已经在 C 中?
用 C 写这个会提高速度吗?

use*_*686 9

在 C 中它会更快一些,但语言选择并不是对性能影响最大的因素。并行执行各种任务通常更有效,而不是像更简单的 init 系统那样等待每个任务依次完成。例如,sshdhttpd可以同时启动,因为两者都不需要另一个已经在运行。


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

/etc/rc?.d方案只是 20 年前,甚至 30 年前的 Unix 引导过程的扩展。最早的 Unix 系统很少重启,所以它们会有一个简单的脚本/etc/rc或类似的脚本,由init启动并依次启动各种守护进程。

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

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

那些仍然坚持使用 SysVinit 的发行版通常是为了“简单”而这样做;最常听到的[需要引用] 的争论似乎是关于 shell 脚本比等效的 C 代码更容易维护(尽管所说的 shell 脚本由 90% 的 copypasta 组成),以及对引入额外库依赖项的致命恐惧[主观]。您可以在2012 年 5 月的 Debian 邮件列表上的这个这个这个这个讨论主题中亲眼看到。

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


小智 5

为什么它不是已经在 C 中?

为了跨平台兼容性,因为它允许使用 sh 文件来描述启动过程。用 C 维护启动脚本将是一个 PITA。

用 C 写这个会提高速度吗?

不多。虽然某些部分会更快,但整体速度增益将是微不足道的。大部分的启动过程的严格顺序的,特别是在初始化步骤1和2由init 3,向上,引导过程可以使用的东西等paralellized Runit,这将让你大速度上涨。

  • @grawity:我们可以将文本文件称为“脚本”,将 C 代码称为“外壳”,然后——哦等等,现在就是这样设置的。说真的,你认为你可能会得到什么样的加速?请记住,shell 已经被读入 RAM,本页提到的保留它的其他原因,以及非常小的性能提升和很多管理痛苦...... (2认同)