下一页 前一页 目录


6. Init

我只在这里描述linux系统中常见的“System V”风格的init。你也有其他选择,事实上,你可以在/sbin/init目录中加入任何程序,内核会在启动时运行他们。

init的任务就是初始化所有东西。它检测文件系统是否完好并安装文件系统。它会启动一些“deamons”(一种小程序)来记录系统信息,运行网络,提供网页服务,监听你的鼠标等等。它也会启动一个终端进程并在虚拟终端上面显示提示符。

关于“run-levels”(运行级)的内容是非常复杂的。我会跳过大部分内容,只谈有关启动的部分。

Init会读取/etc/inittab,这个文件告诉它该干什么,通常来说,第一件干的事是运行初始化脚本。bash会运行(或解释)这些脚本,也是bash提供给你命令行提示符。在Debian系统中,初始化脚本是/etc/init.d/rcS,在Rad Hat中是/etc/rc.d/rc.sysinit。这里面包含了装入文件系统,设置时间,打开交换分区,得到主机名等等内容。

接下来,另外一个脚本会被调用,带领我们进入默认的运行级。这意味着一个子系统集被启动。这里有一些列目录/etc/rc.d/rc0.d, /etc/rc.d/rc1.d, .../etc/rc.d/rc6.d 在 Red Hat, or /etc/rc0.d, /etc/rc1.d, ..., /etc/rc6.d 在Debian。这些目录对应运行级,如果你打算在Debian上设置运行级为3,那么脚本会运行/etc/re3.d下面所有以S开头的脚本。这些脚本又连接到init.d下面的其他脚本。

因为运行级的脚本是由init调用的,它会在目录里面寻找以S开头的脚本,S10syslog可能被最先发现,数字告诉运行级脚本以什么顺序来运行它们。由于没有S00syslog……S09syslog,所以在这里S10syslog最先。而S10syslog又指向用于启动和停止系统登陆者的/etc/init.d/syslog。因为这个连接以s开头,运行级脚本会用“start”参数来运行它。对应的,如果以K开头就表明在离开这个运行级时关闭的顺序。

如果想改变这些子系统的默认启动顺序,你必须设置在rcN.d目录中链接的顺序,在你的inittab中N代表默认的运行级。

init最后的工作是打开一些getty,他们是“respawned”的,这意味着如果他们被关闭,init会马上又打开他们。大部分发行版提供六个终端,你可以减少他们以节约内存,也可以增加以运行更多内容并快速切换。你也可能想在gatty上运行文本终端,或用猫拨号。这样的话你需要编辑inittab文件。

6.1 配制

/etc/inittab 是init最高级别的配制文件。

rcN.d目录,N=0,1,……6决定了启动什么子系统。T

在由init调用的某些脚本中,mount命令会被提及,这意味着转载所有支持的文件系统,文件/etc/fstab定义了将要安装的内容。如果你想改变在启动时装载的文件系统,你需要编辑它,fstab有个帮助页。

6.2 练习

找到装有默认运行级的rcN.d目录,运行ls -l看看那些文件被链接进来。

改变系统中getty的数目。

从你的默认运行级中删除不需要的子系统。

看看在最小情况下你需要多少内容。

建立一个软盘包含Lilo,内核,静态连接“hello world”程序,用/sbin/init调用,并显示hello world。

仔细观察系统的启动,记录它告你的事,或者打印/var/log/messages启动过程中的记录,然后在inittab中浏览,观察所有脚本,看看那些代码在干什么事。你也可以加入启动信息,例如:

        echo "Hello, I am rc.sysinit"

这是学习Bash脚本编辑的好办法,有些脚本是非常复杂。你需要一本bash参考书在手头。

6.3 更多信息


下一页 前一页 目录