总:POST---> Boot Squence ---> Bootloader ---> kernel ---> init ---> 完成启动linux
系统:CentOS6ios
一、按下电源,cpu找到CMOS中的BIOS并运行起来,这个小程序会完成硬件自检。小程序
BIOS:Basic Input and Output System缓存
二、bios会根据设置的boot squence来找设备上的MBR,找到之后控制权移交给MBR中的bootloader(1 stage). ide
MBR存在磁盘上的0号扇区。工具
有3部分组成:
446:bootloader
64: 分区表 16个字节表示一个分区
2: 55AAspa
三、bootloader加载MBR以后的一部分扇区中的基本文件系统驱动(1.5 stage),如以后的27个扇区。而后再加载引导分区中的第2阶段。blog
linux上面的bootloader程序是GRUB.内存
GRUB有3个阶段组成。
bootloader:1st stage
Partition:filesystem driver, 1.5 stage
Partition:/boot/grub, 2nd stageci
由于1.5阶段的文件系统驱动只能驱动基本文件系统,因此第2阶段所在的分区不能使用lvm或软raid之类的上层文件系统。
四、加载第2阶段之后,会提供一个选择启动系统的窗口。内容就是/boot/grub/grub.conf文件中的各条目。
若是所选条目就是本机的linux系统的话:
在点击进入系统以后。GRUB会加载grub.conf文件中指定的内核和要传递给内核的参数。参数中有真实根的地址。有时候还要加载与内核同版本的initrd。 initrd是一个模拟根的文件,由GRUB把它与内核一块儿加载到内存。此文件展开之后就是一个虚拟的根。内核工做于此根中并开始以只读方挂载真实的根。所需驱动和程序在此根中加载。挂载完成之后开始把一些必要文件,如设备文件复制到真实的根。而后执行根切换。若是没有initrd文件,内核会直接挂载真实的根,若是内核里面没有根分区的驱动,则系统启动失败。
而若是所选条目是指向其它分区的另外一个系统,则GRUB的控制权移交给那个分区首部的引导程序来管理(各个分区首部保留有引导空间(linux上面好像是1024Byte),也正是这样才有了双系统或多系统)。
kernel:
自身初始化:
探测可识别到的全部硬件设备;
加载硬件驱动程序;(有可能会借助于ramdisk加载驱动)
以只读方式挂载根文件系统;
运行用户空间的第一个应用程序:/sbin/init
initrd文件有两种:
ramdisk
ramfs
Linux内核的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问;
在使用ramdisk的时候,在内存中模拟成磁盘,但由于磁盘都要有缓冲(buffer)和缓存(cache),这样的结果就是还要在内存中使用缓冲和缓存。画蛇添足,因此就有了ramfs。
在使用ramfs的时候,直接在内存中模拟成文件系统,不须要在内存中使用缓冲和缓存。
能够生成initrd的工具。能够手动用如下工具生成。
CentOS 5: initrd(ramdisk)
工具程序:mkinitrd
CentOS 6,7: initramfs(ramfs)
工具程序:dracut, mkinitrd(脚本)
五、根切换完成之后,内核开始执行第一个用户空间应用程序(若是以前的切换根不算的话)/sbin/init。以后内核退居幕后,前面由init程序来负责。init负责启动初始化已定义的各类服务程序和环境。
init就是用户空间的全部程序的祖先。
init是完成系统用户空间初始化的项目总称,它在不一样的系统版本上有不一样的实现:
init程序的类型:
CentOS 5-:SysV init
配置文件:/etc/inittab
CentOS 6:Upstart
配置文件:/etc/inittab
/etc/init/*.conf
CentOS 7:Systemd
配置文件:/usr/lib/systemd/system/, /etc/systemd/system/