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


5

我有一个运行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写这个有速度增益吗?

Answers:


9

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


没有单一的“Linux启动序列”。每个发行版都有自己的; 他们都没有共同点。它可以是C,Perl,Haskell,任何东西; 唯一的要求是名称的可执行文件/init存在于initramfs或/sbin/init根文件系统中。

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

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

一些发行版--Ubuntu,Chrome OS,Fedora直到第14版 - 已经切换到Upstart,它是用C语言编写的,并且是“基于事件的”,允许守护进程并行启动。另一个初始化系统systemd似乎在迅速普及 - 它在Fedora和OpenSuSE中默认使用。它也用C语言编写。(两个系统仍然读取文本配置文件以决定启动哪些守护进程。)

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

(免责声明:我自己是一名系统用户。)



我的设备上只有一个核心,所以并行的东西不会提高速度吗?除非我的创业公司阻止了很多......是吗?
user1190

@ user1190:等待IO是一个常见的块,因此即使在单个核心上,您也应该看到增益。
Daenyth

5

为什么它不在C中?

对于跨平台兼容性,因为它允许使用sh文件来描述引导过程。在C中维护启动脚本将是PITA。

用C写这个有速度增益吗?

不多。虽然某些部件会更快,但整体速度增益将是微不足道的。大多数启动过程都是严格顺序的,特别是init 1和2中的步骤。从init 3开始向上,启动过程可以使用像Runit这样的东西进行并行化,这样可以大大提高速度。


引导脚本不必是100%C代码; 他们仍然可以读取文本配置文件(例如fstab文件系统),例如,这
grawity

1
为什么GCC会成为可以作为二进制包分发的程序的依赖?请记住,sysvinit也是用C语言编写的。(另外,作为几个Arch包的维护者,我发现更容易确保5行单元文件的一致性,这些文件在任何地方都可以使用,而不是20行shell脚本,它们不同于发行版发行。)
grawity 2012年

1
init系统本身已经用C编写,并且编译器为Build-Dep。另一方面,每个服务的初始脚本根本不必是脚本; 它们可以是简单的文本配置文件,如我之前的示例所示。它们没有理由被编译。
grawity 2012年

2
@grawity:我们可以调用文本文件“scripts”和C代码“shell”然后 - 哦等等,这就是它现在的设置方式。说真的,你认为你会得到什么样的加速?请记住,shell已经被读入RAM,这个页面上提到的保持它的其他原因,以及很多管理员痛苦的非常小的性能提升...
mpez0

1
一个区别是sh脚本依赖于大量的外部程序; 即使它们被缓存在内存中,fork()它们的成本仍然比单个mount()系统调用的成本大(如在OP的例子中)。至于管理疼痛,到目前为止我唯一看到的变化是减少。(我觉得本周我参与了第三次
火焰战争

2

它花费的大部分时间都在等待事物,一个接一个:文件系统,网络等。

如果你想要一个非常快的启动序列,用init = / bin / sh启动 - 即时命令提示符!如果它是嵌入式系统,您可以将其直接启动到您的应用程序中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.