CentOS 6中所采用的Bootloader程序为grub,init为upstart。开机启动的大致流程图如下:
步骤图分解如下:
1、加电自检,当按下电源时,计算机通过BIOS去加载CMOS的信息,取得主机的各项硬件配置,并会进行硬件检测和硬件初始化。
2、BIOS根据Boot Sequence(设备启动次序)取得第一个可启动设备。按次序查找,如果当前设备没有MBR时,跳过当前设备查找下一个设备,直到找到含有MBR的设备。如果MBR出现损坏等故障,启动则会失败,且不会继续往下查找可引导的设备。否则,进行下一步操作。
3、BIOS会读取选定设备的MBR中的信息,并加载Bootloader。只要BIOS能识别硬盘,就可以通过硬件的INIT 13中断功能读取硬盘设备的第一个扇区内的MBR。
由于根据MBR的结构Bootloader占据了446字节,而存储在MBR中的bootloader代码因此受到了限制,为了解决这个问题,bootloader将功能切割成几个部分,因此MBR中只存储了bootloader的主程序,配置相关文件则存储在文件系统中。
grup的功能由三个模块完成:Stage1,Stage1_5和Stage2。Stage1即存储在MBR中的Bootloader,Stage1_5存储在MBR后面的扇区中,而Stage2则一般存储于文件系统中,/boot目录下。Stage1和Stage1_5所要完成的任务是去加载Stage2,Stage2才是功能实现的模块。Stage1并不能识别文件系统,因此需要加载Stage1_5,而Stage1_5具备识别文件系统的功能,因此可以到文件系统中加载Stage2模块。注意:当Stage1可以识别Stage2固定存储的物理空间时,不需要通过Stage1_5就可以直接加载Stage2。
Stage2加载相关的配置文件后,实现的功能如下:
- 提供选择菜单,并提供交互式接口。
用户可以选择不同的启动选项,可实现多重引导功能;码。
- 加载内核文件(或initramfs)
直接指向内核文件所在的位置来开始启动操作系统。
- 转交其他loader
将引导功能移交给其他的loader负责。
4、kernel被加载到内存后开始进行自身初始化,主要操作为:探测可识别到的所有硬件设备并加载相应的硬件驱动;安全起见,以只读方式挂载根文件系统, (等到启动完成,各项功能正常,再重新以读写方式挂载);调用用户空间的第一个应用程序/sbin/init 。
因为kernel无法识别磁盘,所以要借助initramfs的获取磁盘的驱动程序。 initramfs类似一个精简的内核,里面包含了启动过程中所需要的模块(在安装系统的时候确定了需要哪种硬盘驱动,也一并集成到initramfs中)。initramfs需不需要被加载取决于kernel能否识别磁盘,一般来说需要init的时刻为:
- 根目录所在磁盘为SATA,SCSI,SAS,USB等接口,IDE除外
- 根目录所在文件系统为LVM,RAID等格式
- 其他必须在内核加载时就提供的模块
5、init最主要的功能是准备软件执行的环境,调用执行相关脚本文件来实现,
如/etc/inittab、/etc/init/*.conf等
- 获取默认运行级别,/etc/inittab
- 系统初始化,/etc/rc.d/rc.systinit
- 关闭或启动对应级别下的服务,并启动启动终端等,/etc/init/*.conf与/etc /rc.d/rc#.d
/etc/rc.d/rc.sysinit初始化时所进行的操作
(1) 设置主机名
(2) 设置欢迎信息
(3) 激活udev和selinux
(4) 挂载/etc/fstab文件中定义的文件系统
(5) 检测根文件系统,并以读写方式重新挂载根文件系统
(6) 设置系统时钟
(7) 激活swap设备
(8) 根据/etc/sysctl.conf文件设置内核参数
(9) 激活lvm及software raid设备
(10) 加载额外设备的驱动程序
(11) 清理操作