介绍
init进程,是内核启动的第一个用户级进程。init有许多很重要的任务,比如象启动getty(用于用户登录)、实现运行级别、以及处理孤立进程。
对于Linux系统的运行来说,init程序是最基本的程序之一。但你仍可以大部分的忽略它。一个好的Linux发行版本通常随带有一个init的配置,这个配置适合于绝大多数系统的工作,在这样一些系统上不需要对init做任何事。通常,只有你在碰到诸如串行终端挂住了、拨入(不是拨出)调制解调器、或者你希望改变缺省的运行级别时你才需要关心init。
当内核启动了自己之后(已被装入内存、已经开始运行、已经初始化了所有的设备驱动程序和数据结构等等),通过启动用户级程序init来完成引导进程的内核部分。因此,init总是第一个进程(它的进程号总是1)。
内核在几个位置上来查寻init,这几个位置以前常用来放置init,但是init的最适当的位置(在Linux系统上)是/sbin/init。如果内核没有找到init,它就会试着运行/bin/sh,如果还是失败了,那么系统的启动就宣告失败了。
当init开始运行,它通过执行一些管理任务来结束引导进程,例如检查文件系统、清理/tmp、启动各种服务以及为每个终端和虚拟控制台启动getty,在这些地方用户将登录系统。
在系统完全起来之后,init为每个用户已退出的终端重启getty(这样下一个用户就可以登录)。init同样也收集孤立的进程:当一个进程启动了一个子进程并且在子进程之前终止了,这个子进程立刻成为init的子进程。对于各种技术方面的原因来说这是很重要的,知道这些也是有好处的,因为这便于理解进程列表和进程树图。init的变种很少。绝大多数Linux发行版本使用sysinit(由Miguel van Smoorenburg著),它是基于System V的init设计。UNIX的BSD版本有一个不同的init。最主要的不同在于运行级别:System V有而BSD没有(至少是传统上说)。
启动(引导)进入单用户模式
一个很重要的运行级别是单用户模式(single user mode)(运行级别1),在这个模式中只有系统管理员在使用机器并且只有很少的系统服务在运行,如登录服务。对于一些管理任务来说单用户模式是必须的,如在/usr分区上运行fsck,因为这需要该分区没被加载,除非几乎所有的系统服务都被终止了,否则不可能会有这种情况。通过telinit请求运行级别1,一个运行着的系统可以转换到单用户模式。在启动时,可以通过在内核的命令行上给出single或emergency来进入单用户模式:内核同样也将命令行给init,init会理解那个单词并且不会使用缺省的运行级别。(内核命令行输入的方法依赖于系统是如何引导的。)在加载文件系统之前,引导进入单用户模式有时是需要的,这样就可以手工运行fsck命令了,否则的话很可能损坏/usr分区(在一个有问题的文件系统上的任何操作会更进一步地损坏它,所以fsck要尽早地运行)。如果启动时fsck的自动检查失败了,启动描述文件init就会自动地进入单用户模式。这是试图避免系统使用一个文件系统,这个文件系统损坏的太严重以至于fsck都不能够自动地修复它。这样的毁坏情况是相当少的,通常是硬盘有问题或是在试验一个内核版本,但是有准备总比没有好。作为一个安全措施,一个正确配置的系统应该在运行单用户模式的shell之前要求口令。否则的话,只要给LILO输入适当的一行参数就很容易地以root身份进入系统。(当然,如果由于文件系统的问题而使/etc/passwd毁坏时,就不是这样了。如果是这样的话,你手头最好有张引导软盘。)
启动顺序
启动Init进程,其实质是执行/sbin/init程序,即Init进程可以启动其它子进程,或启动shell,本质上是因为内核执行了可执行序/sbin/init.因此,可以说Init进程的作用只不过是可执行程序/sbin/init的作用.可以这样来理解,当执行可执行程序/sbin/init时,该程序就是一进程,名字是Init.当然,用户也可以根据需要编写自己的/sbin/init程序,或者传入命令行参数"init=xxxx"指定某个程序作为Init进程运行.在嵌入式领域内,一般来说多使用Busybox集成的Init程序.
内核启动的最后一步就是启动Init进程.该Init进程中,它主要做了以下几项工作:
<1>读取系统初始化表格文件/etc/inittab.(BusyBox init及inittabl文件)
<2>建立getty进程,在终端上显示login提示符,以等待用户的登录.
<3>进程getty会调用exec以执行login程序.该程序将会核对用户账号和密码.
<4>login程序会调用exec以执行shell命令解释器,也可执行X-windows.
<5>shell命令解释器会读取系统环境配置脚本/etc/profile.