我有一个运行 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 写这个会提高速度吗?
在 C 中它会更快一些,但语言选择并不是对性能影响最大的因素。并行执行各种任务通常更有效,而不是像更简单的 init 系统那样等待每个任务依次完成。例如,sshd和httpd可以同时启动,因为两者都不需要另一个已经在运行。
没有单一的“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,这将让你大速度上涨。