Linux系统启动过程
Linux从加电自检后就要从硬盘上开始引导操作系统。
1.引导加载程序GRUB/LILO。
当机器引导操作系统时,首先读取硬盘主引导记录(MBR)中的信息,找到主引导加载程序,加载操作系统即可。在单一的MBR中只能存储一个操作系统的引导记录,因此同时安装多个操作系统时就必须要使用引导加载程序。Linux中的引导加载程序有两个,分别是GRUB和LILO,通过他们的引导,操作系统可以顺利地启动。
GRUB相对LILO而言有更多的优势,如支持网络引导、交互命令界面等。且GRUB不需要像LILO一样将引导操作系统位置的信息存储在MBR中,因而可以避免由于错误配置MBR导致系统无法引导的故障。现在的Linux系统一般都倾向于GRUB引导。
2.加载内核。
内核映射不是一个可执行的内核,而是一个经过压缩的内核映像。通常它是一个zImage或bzImage文件,将其加载到内存之后,内核就开始执行了。
3.执行init进程。
init进程作为系统的第一个进程,是所有进程的发起者和控制者。Init的进程ID(PID)为1。它完成系统的初始化工作并维护系统的各种运行级别,包括系统的初始化、系统结束、单用户运行模式和多用户运行模式。由于Init进程是系统所有进程的起点,内核在完成核内引导后就开始加载Init程序。
init进程有两个作用:第一个作用是终结父进程。因为init进程绝对不会被终止,所以系统总是使用Init并以它未参照。如果某个进程在它衍生出来的全部子进程就都会以init作为父进程;第二个作用是子啊进入某个特定的运行级别(Run level)时运行相应的程序,以此对各种运行级别进行管理。它的这个作用是由/etc/inittab定义的。
4.通过/etc/inittab文件进行初始化。
init的工作是根据/etc/inittab来执行相应的脚本,进行系统初始化。下面以redhat为例进行说明。
(1)执行/etc/rc.d/rc.sysinit
这是由init执行的第一个脚本,其主要功能是完成各个不同运行级别中相同部分的初始化工作,包括设置的$PATH变量、配置网络等。
(2)执行/etc/rc.d/rcX.d下的脚本
在系统目录/etc/rc.d/init.d下有许多服务器脚本程序,一般称为服务(service),在系统初始化启动会选择性地执行这些脚本程序的一部分。在/etc/rc.d下有7个名为rcx.d的目录,对应系统的7个运行级别,这里的x是不同运行级别数,实际中使用相应运行级别的数字代替,如运行级别3,则执行的是/etc/rc.d/rc3.d/下的脚本。
这些脚本实际上都是一些连接文件,而不是真正的rc启动脚本,存放在/etc/rc.d/init.d子目录中的、被符号连接上的命令脚本程序才是真正的程序,是它们完成了启动或者停止各种服务的操作过程。
这个脚本程序的连接文件命名规则为“K+xx+服务名”或“S+xx服务名”的形式,其中xx是一个两位数字,K(Kill)表示结束,S(Start)表示启动。
通常这些命令脚本程序的执行顺序很重要,基本规则是先终止K开头的服务,然后启动S开头的服务,再根据字母S或K后面这个两位数字的大小来决定执行顺序,数值小比数值大的先执行。以字母K开头的命令脚本程序会传递Stop参数,以字母S开头的命令脚本程序会传递Start参数,同时也能接受如Restart、Staus等参数。
root用户可以用init x命令改变当前运行级别,如可以将init0作为关机指令、inti 6用作重启系统的指令。
(3)执行/etc/rc.d/rc.local
redhat中的运行模式2、3、4、5都会将/etc/rc.d/rc.local作为最后一个运行的初始化脚本,所以用户可以在这个文件中添加脚本指令,以实现在系统开机后,自动运行某个程序或者执行某项常规操作的功能。如要在系统开机启动后自动执行pptpd服务,则可以在/etc/rc.d/rc.local中增加一行启动pptptd的指令。
(4)执行/bin/login
login程序检验用户的输入账号和密码,若获得通过,则为使用者进行初始化环境,并将控制权交给shell,即等待用户登录,启动过程完成。
5.GRUB和LILO配置
(1)配置LILO可以通过编辑/etc/lilo.conf文件实现,其具体内容如下:
[root@localhost etc]#vi /etc/lilo.conf
prompt
timeout=50
default=linux
boot/dev/hda
map=boot/map
install=/boot/boot.b
message=/boot/message
linear
image=/boot/vmlinuz-2.620-8
label=linux
initrd=/boot/initrd-2.6.20-8.img
read-only
append="root=LABEL=/"
other=/dev/hda1
optional
label=DOS
启动加载文件配置的说明如下:
prompt
timeout=50
default=linux
这三行表示系统启动时将会显示一个LILO提示信息并等待5秒钟。注意,timeout的单位是0.1秒。如果5秒钟之内没有输入系统的名字,那么将使用默认引导default=linux,引导标号为linux的系统。
LILO配置文件解析:
boot=/dev/hda表示启动盘使用第一个IDE硬盘,也就是hda。
install=/boot/boot.b表示要将/boot/boot.b文件内容写到引导记录中,该文件在安装linux时已经创建。
image=/boot/vmlinuz-2.6.20-8表示启动时使用的内核映像是boot/vmlinuz-2.6.20-8。
label=Linux表示这个启动选择项的名称是Linux,然后是其他引导系统,这种配置适合同时安装了linux和windows两个系统的计算机。
更改后,为了使配置生效,还需要执行/sbin/lilo命令。
(2)配置GRUB可以通过编辑/boot/grub/grub.conf文件实现,具体内容如下:
[root@localhost grub]#vi /boot/grub/grub.conf
default=0
timeout=10
splashimage=(had1,2)/boot/grub/splash.xpm.gz
title Windows2K3
rootnoverify(had0,0)
chainloader+1
title Ubuntu
root(had1,2)
kernel /boot/vmlinuz-2.620-9 ro root=LABEL=/
initrd /boot/initrd-2.6.20-8.img
title Mandrake10
kernel(had1,4)/boot/vmliuz root=/dev/hda5 quiet devfs=mountacpi=off vga=788
initrd(had,4)/boot/initrd.img
GRUB配置文件解析:
default=表示默认启动的系统,0为排在第一个的系统,依次类推。
timeout=X为GRUB菜单停留的时间,单位为秒。
title XXX:XXX为标题,就是要引导的操作系统的名字。
root(hdX,Y)X和Y都代表一个数值,X是Linux的根分区所在的硬盘。如只有一个硬盘,则就是hda0。Y是代表Linux安装所在的分区,这个数字有点特殊。如配置文件中将Mandrake安装到第二块硬盘的第二个分区,也就是hdb5。则root(hdX,Y)就应该写为root(hda1,4),也就是说Y=hdaZ或者hdbZ中的Z减去1.
kernel(hdX,Y)/boot/vmlinuz root=/dev/hdaZ和initrd (hdX,Y)/boot/initrd.img就是要引导硬盘分区的映像和initrd文件,一定要写正确X和Y的值,不然无法引导系统。