日期:2014-05-16  浏览次数:20630 次

Linux系统启动过程详解

1)BIOS自检
2)启动Grub/Lilo
3)加载内核
4)执行init进程
5)通过/etc/inittab文件进行初始化
6)登陆Linux

1)BIOS自检
a)POST(Power On Self Test),对硬件进行检测
计算机在通电后首先由BIOS进行自检,即所谓的POST(Power On Self Test),对硬件进行检测
依据BIOS内设置的引导顺序从硬盘、软盘或CDROM中读入"引导块"
????? 在PC中,Linux是从BIOS中的地址0xFFFF0处开始的
BIOS的第一个步骤是加电自检(POST),对硬件进行检测
??????? 第二个步骤是进行本地设备的枚举和初始化
BIOS由两部分组成: POST代码和运行时服务
当POST完成后,它从内存中清理出来,但BIOS运行时服务依然保留在内存中,目标操作系统可以使用这些服务
要引导一个操作系统,BIOS运行时会按照CMOS的设置的顺序来搜索处于活动状态并可引导的设备:软盘、CD-ROM、硬盘上的分区、网络上的某个设备、USB(通常Linux是从硬盘引导的
主引导记录MBR中包含主引导加载程序。MBR是一个512字节大小的扇区,位于磁盘上的第一个扇区中(0道0柱面1扇区))当MBR被加载到RAM中之后,BIOS会把控制权交给MBR

b)提取MBR的信息
要看MBR的内容,请使用下面的命令
#从/dev/sda上读取前512个字节的内容,并将其写入mbr.bin文件中
[root@localhost pam.d]# dd if=/dev/sda of=mbr.bin bs=512 count=1

#以十六进制和ASCII码格式打印这个二进制文件的内容
[root@localhost pam.d]# od -xa mbr.bin
0000000 48eb 0090 d08e 00bc fb7c d88e b9fc 0080
????????? k?? H dle nul so?? P?? < nul?? |?? { so?? X?? |?? 9 nul nul
0000020 f48b 00bf 8e06 f3c0 a566 2fea 0006 1000
???????? vt?? t?? ? nul ack so?? @?? s?? f?? %?? j?? / ack nul nul dle


2)启动GRUB/Lilo
GRUB和LILO都是引导加载程序,它们会引导操作系统。当机器引导它的操作系统时,BIOS会读取引导介质上最前面的512字节(即MBR: master boot record)

3)加载内核
当内核映像被加载到内存后,内核阶段就加开始了
内核映像并不是一个可执行的内核,而是一个压缩过的内核映像。通常它是一个zImage(压缩映像,小于512KB)或bzImage(较大的压缩映像,大于512KB),它是提前使用zlib进行压缩的
在这个内核映像前面是一个例程,它实现少量硬件设置,并对内核映像中包含的内核进行解压,然后将其放入高端内存中,如果有初始RAM磁盘映像,就会将它移动到内存中,并标明以后使用,然后此例程会调用内核,并开始启动内核引导的过程
在GRUB命令中,我们可以使用initrd映像引导一个特定的内核,方法如下:
grub> kernel /bzImage-2.6.14.2
[Linux-bzImage, setup=0x1400, size=0x29672e]

grub>initrd /initrd-2.6.14.2.img
[Linux-initrd @ 0x5f13000, 0xcc199 bytes]

grub> boot
Uncompressing Linux... Ok, booting the kernel.

如果不知道要引导的内核的名称,只需使用/然后按下Tab键,就会显示内核和initrd映像列表

对grub命令行进行加密
a)使用命令/sbin/grub-md5-crypt来产生grub使用的密码
[root@localhost pam.d]# /sbin/grub-md5-crypt
?? Password:
?? Retype password:
?? $1$3YbPF$zFVRY6J8VxNR9Ok4fXRkr1

b)修改/etc/grub.conf加入password --md5 $1$3YbPF$zFVRY6J8VxNR9Ok4fXRkr1 一定要放在title之前
这样重启系统时在grub的启动grub菜单时,想再按e命令进行编辑时,必须先按p键后输入密码才成

4)执行init进程
init进程是所有进程的起点,内核在完成内核引导后,即在本线程(进程)空间内加载init程序,它的进程号为1
init进程是所有进程的发起者和控制者
init进程有两个作用:
??? 扮演终结父进程的角色:所有的孤儿进程都会被init进程接管
??? 进入某个特定的运行级别时运行相应的程序,以此对各种运行级别进行管理,这个作用由/etc/inittab文件定义的

5)通过/etc/inittab文件进行初始化
init进程的工作是根据/etc/inittab来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设置网络等,对于RedHat来说,按以下顺序执行
a)执行/etc/rc.d/rc.sysinit(由init执行的第一个脚本)
??? 此步可进行的工作有:
??? 设置$PATH变量
??? 配置网络
??? 为虚拟内存启动交换
??? 设置系统的主机名
??? 检查root文件系统,以进行必要的修复
??? 检查root文件系统的配额
??? 为root文件系统打开用户和组的配额
??? 以读/写的方式重新装载root文件系统
??? 清除被装载的文件系统表/etc/matb
??? 把root文件系统输入到mtab
??? 使用系统为装入模块做准备
??? 查找模块的相关文件
??? 检查文件系统,以进行必要的修复
??? 加载所有其他文件系统
??? 清除几个/etc文件,如/etc/mtab、/etc/fastboot和/etc/nologin
??? 删除UUCP的lock文件
??? 删除过时的子系统文件
??? 删除过时的pid文件
??? 设置系统时钟
??? 打开交换
??? 初始化串行端口
??? 装入模块

?? b)执行/etc/rc.d/rcX.d[KS]
??? 首先终止K开头的服务(用来关闭一个服务),然后启动S开头的服务(用来启动一个服务)
??? 对每一个运行级别来说,在/etc/rc.d子目录中都有一个对应的下级目录。
??? 这些运行级别的下级子目录的命名方法上rcX.d, 其中X就是代表运行级别的数字
??? 在各个运行级别的子目录中,都建立有到/etc/rc.d/init.d子目录中命令脚本程序的符号链接
??? 链接的名称在K与S后有一个数字,表示执行顺序,数字小的先执行如K01tog-pegasus 、 S00microcode_ctl
??? 对以K开头的脚本执行时系统会传递stop参数,而S开头的脚本系统会传递start参数

?? c)执行/etc/rc.d/rc.local
??? Redhat中运行模式2,3,5都把/etc/r