CentOS 6系统启动引导过程讲解
时间:2015-09-29 23:36 来源:linux.it.net.cn 作者:IT
POST --> BootSequence(BIOS) --> BootLoader --> Kernel (ramdisk) --> rootfs --> /sbin/init
第一步、加载BIOS
BIOS担负着初始化硬件,检测硬件功能,以及引导操作系统的责任。在早期,BIOS还提供一套运行时的服务程序给操作系统及应用程序使用。BIOS程序存放于一个断电后内容不会丢失的只读存储器中;系统过电或被重置(reset)时,处理器第一条指令的地址会被定位到BIOS的存储器中,让初始化程序开始运行。
第一阶段
自我检测(Power On Self Test):
按下电源以后,CPU第一条指令指向BIOS芯片(ROM只读存储器;一般情况为只读,BIOS程序可升级,中端高端服务器上有两个BISO芯片,防止BIOS升级失败后可回退)中的BIOS程序载入到内存运行,BIOS(Basic Input/Output System的缩写、中文:基本输入输出系统)程序运行起来后会识别检测各个硬件。
如果某些检测到硬件有问题时:
1.相关硬件指示灯会变颜色(红色或者橙色)
2.屏蔽有问题的硬件继续进行下一步;如果达到临界点下一步无法进行; (例如一些工业标准服务器有多路处理器,多根内存条... 将有问题硬件所在槽位设置成disabled)
第二阶段:Boot Sequence
bios程序自检完成后会加载CMOS芯片中(随机存储器RAM)的BIOS设置信息(时间,密码,启动项等);
Boot Sequence(BIOS)为用户设定启动顺序由哪个设备启动计算机,如光盘驱动器、硬盘、软盘、USB U盘等, 按照Boot Sequence设定启动顺序,遍历设备的第0柱面第0磁道第1个扇区(也叫MBR),如果发现这个扇区0xAA559结束,则BIOS认为它是一个可引导扇区,进入第三阶段;否则再找下个下一个启动项中设置的下一个设备,直到找到为止;如果都没有BIOS会提示没有找到操作系统。
第三阶段:Boot Loader(启动加载器)
当BIOS确定要启动哪个启动设备后,它会去加载设备第0柱面第0磁道第1个扇区中512字节内容程序到内存地址00000:7c00中,然后跳转到00000:7c00处将控制权交给这段代码,到此,计算机不再由BIOS中固有的程序来控制,变成了这一小段程序(446)执行掌控计算机进行下一步工作(参考:一个操作系统的实现 作者:于渊)
MBR:
位于硬盘的0柱面、0磁头、第1扇区称为主引导扇区(也叫主引导记录MBR),大小为512字节
第一部分主引导程序(boot loader)占446个字节
第二部分区表信息占64字节(一个分区占16个字节,所以只能分4个主分区)
第三部分是magic numb占两个字节,校验MBR信息
Boot Loader中的程序不属于哪个操作系统,它只是为了让计算机引导操作系统(内核),所以只要这个程序能引导对应的操作系统,其实用哪个都无所谓。Boot Loader作用找到内核后将其加载到内存中,计算机不再由Boot Loader来掌管,
linux上常见的Boot Loader:
1.LILO
2.GRUB
GRUB功能比较强大,很多linux都使用GRUB作为启动加载器,它既可以引导linux内核,也可以引导window
以下为grub的内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@www ~]# cat /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/mapper/VolGroup-lv_root
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0 #默认启动的内核第一个
timeout=5 #超时时间
splashimage=(hd0,0)/grub/splash.xpm.gz #背景图
hiddenmenu
title CentOS 6 (2.6.32-573.el6.x86_64) # 标题
root (hd0,0)
kernel /vmlinuz-2.6.32-573.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet #指定内核所在的目录 以只读方式 挂载根文件 设置语言为美国UTF-8 交换分区 ...
initrd /initramfs-2.6.32-573.el6.x86_64.img
详解请查看(http://blog.chinaunix.net/uid-24774106-id-3497929.html)
第四阶段:Kernel
当Kernel被加载到内存中后它会进行自解压,并且运行起来以只读方式挂载文件系统,检测以及掌控各个硬件。其中kernel从grub启动接收到传递到的参数initrd /initramfs-2.6.32-573.el6.x86_64.img有何作用? 当内核启动运行后,它需要访问根文件系统,要访问根文件系统必须要加载根文件系统所在的设备,而这时根文件系统又没有挂载,要挂载根文件系统首先需要根文件系统的驱动程序,这是一个典 型的先有鸡先有蛋的问题啊!为解决这个问题,GRUB在加载内核同时,也把initrd加载到内存中并运行,那么initr又起到了什么作用哪,其实initrd文件其实是一个虚拟的根文件系统,里面有bin、lib、lib64、sys、var、etc、sysroot、 dev、proc、tmp等根目录,它的功能就是内核与真正的根建立联系,内核通过它加载根文件系统的驱动程序,然后以读写方式挂载/etc/fstab中定义的内容,至此, 内核加载完成。
1
2
3
4
5
6
7
8
9
10
11
12
[root@www tmp]# pwd
/tmp
[root@www tmp]# ls
[root@www tmp]# cp /boot/initramfs-2.6.32-573.el6.x86_64.img ./ #拷贝到当前目录下
[root@www tmp]# zcat initramfs-2.6.32-573.el6.x86_64.img | cpio -id #解压
145377 blocks
[root@www tmp]# ls
bin emergency initqueue-finished lib pre-mount proc tmp
cmdline etc initqueue-settled lib64 pre-pivot sbin usr
dev init initqueue-timeout mount pre-trigger sys var
dracut-004-388.el6 initqueue initramfs-2.6.32-573.el6.x86_64.img netroot pre-udev sysroot
[root@www tmp]#
第五阶段:运行/sbin/init
当系统内核启动完成以后,启动的第一个用户进程为/sbin/init,系统掌握权限交给/sbin/init,让执行系统初始化!
用户空间执行的程序有 /sbin/init-->/etc/inittab(设定默认级别) -->/etc/rc.d/rc.sysinit->/etc/rc3.d/S* (或者/etc/rc5.d/S* )-->/etc/rc.sysinit-->--> 设定默认运行级别 --> 系统初始化脚本 --> 关闭或启动对应级别下的服务 --> 启动终端
(责任编辑:IT)
POST --> BootSequence(BIOS) --> BootLoader --> Kernel (ramdisk) --> rootfs --> /sbin/init
第一步、加载BIOS
BIOS担负着初始化硬件,检测硬件功能,以及引导操作系统的责任。在早期,BIOS还提供一套运行时的服务程序给操作系统及应用程序使用。BIOS程序存放于一个断电后内容不会丢失的只读存储器中;系统过电或被重置(reset)时,处理器第一条指令的地址会被定位到BIOS的存储器中,让初始化程序开始运行。 第一阶段 自我检测(Power On Self Test): 按下电源以后,CPU第一条指令指向BIOS芯片(ROM只读存储器;一般情况为只读,BIOS程序可升级,中端高端服务器上有两个BISO芯片,防止BIOS升级失败后可回退)中的BIOS程序载入到内存运行,BIOS(Basic Input/Output System的缩写、中文:基本输入输出系统)程序运行起来后会识别检测各个硬件。 如果某些检测到硬件有问题时: 1.相关硬件指示灯会变颜色(红色或者橙色) 2.屏蔽有问题的硬件继续进行下一步;如果达到临界点下一步无法进行; (例如一些工业标准服务器有多路处理器,多根内存条... 将有问题硬件所在槽位设置成disabled) 第二阶段:Boot Sequence bios程序自检完成后会加载CMOS芯片中(随机存储器RAM)的BIOS设置信息(时间,密码,启动项等); Boot Sequence(BIOS)为用户设定启动顺序由哪个设备启动计算机,如光盘驱动器、硬盘、软盘、USB U盘等, 按照Boot Sequence设定启动顺序,遍历设备的第0柱面第0磁道第1个扇区(也叫MBR),如果发现这个扇区0xAA559结束,则BIOS认为它是一个可引导扇区,进入第三阶段;否则再找下个下一个启动项中设置的下一个设备,直到找到为止;如果都没有BIOS会提示没有找到操作系统。
第三阶段:Boot Loader(启动加载器) 当BIOS确定要启动哪个启动设备后,它会去加载设备第0柱面第0磁道第1个扇区中512字节内容程序到内存地址00000:7c00中,然后跳转到00000:7c00处将控制权交给这段代码,到此,计算机不再由BIOS中固有的程序来控制,变成了这一小段程序(446)执行掌控计算机进行下一步工作(参考:一个操作系统的实现 作者:于渊) MBR: 位于硬盘的0柱面、0磁头、第1扇区称为主引导扇区(也叫主引导记录MBR),大小为512字节 第一部分主引导程序(boot loader)占446个字节 第二部分区表信息占64字节(一个分区占16个字节,所以只能分4个主分区) 第三部分是magic numb占两个字节,校验MBR信息
Boot Loader中的程序不属于哪个操作系统,它只是为了让计算机引导操作系统(内核),所以只要这个程序能引导对应的操作系统,其实用哪个都无所谓。Boot Loader作用找到内核后将其加载到内存中,计算机不再由Boot Loader来掌管, linux上常见的Boot Loader: 1.LILO 2.GRUB GRUB功能比较强大,很多linux都使用GRUB作为启动加载器,它既可以引导linux内核,也可以引导window 以下为grub的内容
详解请查看(http://blog.chinaunix.net/uid-24774106-id-3497929.html) 第四阶段:Kernel 当Kernel被加载到内存中后它会进行自解压,并且运行起来以只读方式挂载文件系统,检测以及掌控各个硬件。其中kernel从grub启动接收到传递到的参数initrd /initramfs-2.6.32-573.el6.x86_64.img有何作用? 当内核启动运行后,它需要访问根文件系统,要访问根文件系统必须要加载根文件系统所在的设备,而这时根文件系统又没有挂载,要挂载根文件系统首先需要根文件系统的驱动程序,这是一个典 型的先有鸡先有蛋的问题啊!为解决这个问题,GRUB在加载内核同时,也把initrd加载到内存中并运行,那么initr又起到了什么作用哪,其实initrd文件其实是一个虚拟的根文件系统,里面有bin、lib、lib64、sys、var、etc、sysroot、 dev、proc、tmp等根目录,它的功能就是内核与真正的根建立联系,内核通过它加载根文件系统的驱动程序,然后以读写方式挂载/etc/fstab中定义的内容,至此, 内核加载完成。
第五阶段:运行/sbin/init 当系统内核启动完成以后,启动的第一个用户进程为/sbin/init,系统掌握权限交给/sbin/init,让执行系统初始化! 用户空间执行的程序有 /sbin/init-->/etc/inittab(设定默认级别) -->/etc/rc.d/rc.sysinit->/etc/rc3.d/S* (或者/etc/rc5.d/S* )-->/etc/rc.sysinit-->--> 设定默认运行级别 --> 系统初始化脚本 --> 关闭或启动对应级别下的服务 --> 启动终端 (责任编辑:IT) |