引导过程的步骤
Linux系统典型的引导过程由下面6个不同的阶段组成:
加载并初始化内核
检测和配置设备
创建内核线程
操作员干预
执行系统启动脚本
多用户模式运行
系统管理员对以上大多数步骤几乎没有什么控制权。我们通过编辑系统启动脚本来影响大多数的引导配置。
初始化内核
Linux内核本身就是一个程序,系统引导过程中的第一项任务就是把这个程序载入内存,以便执行它。内核的路径名通常是/vmlinuz或者/boot/vmlinuz。
Linux系统实现了一种有两个阶段的加载过程。在第一阶段中,系统ROM把一个小的引导程序从磁盘载入到内存中。然后,这个程序再安排载入内核。
内核执行内存检测来确定有多少RAM可用。内核的一些内部数据结构按静态方式分配其内存量,因此,当内核启动时,它就为自己划分出一块固定大小的
实存空间。这块空间保留给内核使用,用户级进程不能使用。内核在控制台上打印一条消息,报告物理内存的总量以及用户进程可用的内存量。
配置硬件
内核执行的第一批任务之一包括检查机器的环境以确定机器有什么硬件。当您为自己的系统构建内核时,要好俗内核,它会找到哪些硬件设备。当内核开始执行时,它
试图找到并初始化已经告诉它的每一个设备。大多数内核为它们所找到的每个设备打印一行专门信息。现在的发行版本所包含的内核能够在绝大都Sohu机器配置上运行。
只要做最少量的定制。
在内核配置期间提供的设备信息经常不够明确。在这样的情况下,内核通过检测设备总线和向适当的驱动程序寻求信息来尝试它所需要的其他信息。那些没有检测到设备
的驱动程序或者那些没有响应探测的驱动程序将被禁用。如果某个设备后来被连接到系统上,那么还是有可能随时加载或者启动它的驱动程序的。
内核线程
一旦完成了基本的初始化任务,内核就在用户空间创建几个“自发”的进程。它们之所以被称作是自发进程,是因为这些进程不是通过系统正规的fork
机制所创建的。
自发进程的数量和特性随系统的不同而不同。在Linux上,看不到有PID 0进程。和进程init一起的是几个内存和内核处理进程,这些进程的PID都比较小
在ps命令的输出中它们的名字都被中括号括了起来。有时候这些进程的名字以一个斜线加一个数字结尾。这个数字表明该线程在哪个处理器上运行,在
多处理器的系统上会出现这种有意思的情况。
在所有的这些进程中,只有init是真证完整的用户进程。其他进程实际上都是内核的组成部分,为了调度或者结构上的原因而进行了装扮,使它们看上去
像是进程罢了。
一旦创建完毕自发进程,内核在引导阶段的任务就完成了。不过,处理基本操作的进程还一个都没有创建,而且大多数Linux守护进程也没有启动。这个
任务都是由init来负责的。
操作员干预
如果系统以单用户模式进行引导,那么在init启动时,内核所给出的命令行标志(single)会通知init实际要引导的是单用户模式。进程init最后会把控制权
交给sulogin,后者是login的一个“中间但不可控”的特殊版本,它提示用户输入root口令。如果输入的口令正确,系统将产生一个root shell。
在单用户shell中执行命令的方式和登录到已完全引导的系统上执行命令的方式类似。不过在SUSE、Debian、还有Ubantu系统上,这时通常只安装了root
分区。为了使用不在/bin、/sbin、或/etc下的程序,用户必须手动安装其他文件系统。
在许多但用户环境下,文件系统的根目录是按只读方式安装的。如果/tmp是根文件系统的一部分,那么许多要使用临时文件的命令都不能执行。为了解决
这个问题,必须先把根文件系统以读写方式重新安装,再开始但用户模式的交互操作。下面这条命令通常就能实现这个技巧。
mount -o remount,rw /
执行启动脚本
到了系统准备运行其启动脚本的时候,我们就能看出它是Linux系统了。尽管它看起来还不很像全部启动完毕的系统,但在接下来的启动过程中已经没有什么
“奇妙”步骤了。启动脚本就是普通的shell脚本,由init根据移动的算法选择并运行它们,尽管算法有时候有些复杂,但还是箱单容易理解的。
启动脚本的处理、馈送和分类有其自己的专门一节来介绍。
多用户运行
在初始化脚本运行过以后,系统就是完全运行的系统了,不过现在用户还不能登录进来。为了在某个特定终端上接受用户登录,必须有一个getty进程监听终端
或者控制台。init直接生成这些getty进程,完成引导过程。init还负责生成图形登录系统,例如xdm或gdm。