当机器引导它的操作系统时,BIOS 会读取引导介质上最前面的 512 字节,也就是我们所说的主引导记
录 MBR(它是硬盘上的一个特别区域,会被 BIOS 自动装载),在单一的 MBR 中只能存储一个操作系统
的引导记录,所以当需要多个操作系统时就会出现问题。所以需要更灵活的引导加载程序( lilo 或
grub)。
上电时 BIOS 进行自检后读取 MBR 中的信息加载内核,装入内存并初始化每个设备驱动器,打印相
应信息内核在几个默认的路径里寻找 init,并运行它找到的第一个 init 进程(它负责运行启动时所需
的所有其他进程)依据/etc/inittab 文件设定运行等级。(控制 init 程序操作的规则存放在/etc/inittab 文
件中) init 运行/etc/rc.d/rc.sysinit(/etc/inittab 里有一句“si::sysinit:/etc/rc.d/rc.sysinit“,表示开始载入各
项系统服务之前,先对系统进行初始化,利用 /etc/rc.d/rc.sysinit 来设定好系统环境)在 rc.sysinit 执行
后,将返回 init 继续其它的动作,通常接下来会执行到/etc/rc.d/rc 程序。以运行级别 3 为例,init 将执
行 配 置 文 件 inittab 中 的 以 下 这 行 : L3:3:wait:/etc/rc.d/rc 3 这 一 行 表 示 以 3 为 参 数 运
行/etc/rc.d/rc,/etc/rc.d/rc 是一个 Shell 脚本,它接受 3 作为参数,去执行/etc/rc.d/rc3.d/目录下的所有的
rc 启动脚本init 进程载入模块/etc/rc.d/rcX.d 来关闭和运行各项系统服务。(对每一个运行级别来说,
在/etc/rc.d 子目录中都有一个对应的下级目录。这些运行级别的下级子目录的命名方法是 rcX.d,其中
的 X 就是代表运行级别的数字。比如说,运行级别 3 的全部命令脚本程序都保存在/etc/rc.d/rc3.d 子目
录中。在各个运行级别的子目录中,都建立有到/etc/rc.d/init.d 子目录中命令脚本程序的符号链接,但
是,这些符号链接并不使用命令脚本程序 /etc/rc.d/init.d 子目录中原来的名字。如果命令脚本程序是用
来启动一个服务的,其符号链接的名字就以字母 S 打头;如果命令脚本程序是用来关闭一个服务的,
其符号链接的名字就以字母 K 打头。许多情况下,这些命令脚本程序的执行顺序都很重要。如果没有
先配置网络接口,就没有办法使用 DNS 服务解析主机名!为了安排它们的执行顺序,在字母 S 或者 K
的后面紧跟着一个两位数字,数值小的在数值大的前面执行。比如:/etc/rc.d/rc3.d/S50inet 就会在
/etc/rc.d/rc3.d/S55named 之前执行。存放在/etc/rc.d/init.d 子目录中的、被符号链接上的命令脚本程序才
是真正的实干家,是它们完成了启动或者停止各种服务的操作过程。当 /etc/rc.d/rc 运行通过每个特定
的运行级别子目录的时候,它会根据数字的顺序依次调用各个命令脚本程序执行。它先运行以字母 K
打头的命令脚本程序,然后再运行以字母 S 打头的命令脚本程序。对以字母 K 打头的命令脚本程序来
说,会传递 Stop 参数;类似地对以字母 S 打头的命令脚本程序来说,会传递 Start 参数。)执
行/etc/ec.d/rc.local,rcX.d 中要执行的最后一个脚本一般名称为 S99local,它实际上是文件/etc/rc.d/
rc.local 的链接,在其中可以放入启动时要启动的任何定制程序。(Redhat Linux 中的运行模式 2、3、5
都把/etc/rc.d/rc.local 做为初始化脚本中的最后一个,所以用户可以自己在这个文件中添加一些需要在
其他初始化工作之后,登录之前执行的命令。在维护 Linux 系统运转的日子里,肯定会遇到需要系统
管理员对开机或者关机命令脚本进行修改的情况。如果所做的修改只在引导开机的时候起作用,并且
改动不大的话,可以考虑简单地编辑一下/etc/rc.d/rc.local 脚本。这个命令脚本程序是在引导过程的最
后一步被执行的。)执行/sbin/mingetty 程式,/etc/inittab 文件中最后一步是调用/sbin/mingetty,程序会
提示使用者输入账号及密码,加载 login 程序,以该用户名作为 login 的参数,编码并确认账号及密码
的正确性,若二者相合, 则为使用者进行初始化环境, 并将控制权交给 shell,即等待用户登录,到次为
止 Linux 启动过程全部结束。用于远程登录的提示信息位于/etc/issue.net 中。运行对应级别下的用户
login 以后,将启动一个用户指定的 shell,以下以/bin/bash 为例继续我们的启动过程。作为登录 shell,
它将首先寻找/etc/profile 脚本文件,并执行它;然后如果存在~/.bash_profile,则执行它,否则执行
~/.bash_login,如果该文件也不存在,则执行~/.profile 文件。然后 bash 将作为一个交互式 shell 执行
~/.bashrc 文件(如果存在的话),很多系统中,~/.bashrc 都将启动 /etc/bashrc 作为系统范围内的配置文件。
当显示出命令行提示符的时候,整个启动过程就结束了。此时的系统,运行着内核,运行着几个核心
线程,运行着 init 进程,运行着一批由 rc 启动脚本激活的守护进程(如 inetd 等),运行着一个 bash 作为
用户的命令解释器。
启动过程简述:当用户打开 PC 的电源,BIOS 开机自检,按 BIOS 中设置的启动设备(通常是硬盘)启动,
接着启动设备上安装的引导程序 lilo 或 grub 开始引导 Linux,Linux 首先进行内核的引导,接下来执行
init 程序,init 程序调用了 rc.sysinit 和 rc 等程序,rc.sysinit 和 rc 完成系统初始化和运行服务的任务后,
评论2