Linux的系统启动流程可以简要概括为下图,这篇博文会在你了解了大致启动顺序之后对各个部分都具体做了什么来作出解释。
根据上图不同过程的不同颜色,我们可以将系统启动流程分为两个大的部分,蓝色表示在内核级别进行的过程,而红色部分则是用户空间进行的初始化过程。下面我们将以CentOS 5为基础来讲解各部分都做了什么,在掌握了CentOS启动的过程后我们再来看看CentOS 6和7在哪些部分都有所不同。
一、POST
POST(Power On Self Testing)是系统加电自检的过程,其中完成自检的程序是BIOS(Basic Input Output System),BIOS是固化在ROM中的一段程序,它主要完成检测系统关键硬件设备诸如内存、显卡、I/0、磁盘、键盘鼠标等是否正常。如出现显卡、内存等接口松动,则会报错。检测正常之后BIOS会读取写入MBR中的程序(BootSeqence阶段)来执行。
接下来将控制权交给bootloader。
二、BootSequence(BootLoader)
BootSequence即启动次序,按次序查找各可引导设备,第一个有引导程序的设备即为被启动系统要用到的设备;
BootSequence阶段主要由BootLoader(引导加载器)完成。
BootLoader包括MBR和Grub。它的工作是提供一个菜单,允许用户选择要启动的系统或不同的内核版本;把用户选定的内核装载到RAM中的特定空间中,然后解压、展开,而后把系统控制权移交给内核;
MBR(Master Boot Record,主引导记录),它存在于硬盘的0柱面、0磁头、1扇区,所以它有512 bytes。
主要由三部分组成:
1、前 446 bytes存储的是bootloader程序。
2、随后 64 bytes存储的是分区表。
3、最后 2 bytes是魔数,固定为0xAA55或0x55AA,这取决于处理器类型,如果是小端模式处理器(如Intel系列),则该值为0xAA55;如果是大端模式处理器(如Motorola6800),则该值为0x55AA。
GRUB(GRand Unified Bootloader)它是一个同一资源引导器。简单而言是对MBR的补充和扩展。它的处理过程有三步:
1、stage1:即运行mbr中存储的bootloader程序。它的任务就是将stage1_5(此时并不能算是磁盘分区/boot/grub/下的stage1_5,因为stage1无法识别文件系统)载入内存执行。
2、stage1_5:位于mbr之后的扇区,通过提供基本文件系统驱动让stage1中的bootloader程序能识别磁盘分区/boot/grub/上的stage2文件并载入内存执行。
注意:此处若是boot分区的文件系统类型不属于stage1_5的中的一个,则会借助ramdisk来加载在/lib64/moudles/下额外的文件系统驱动。
ramdisk:由bootloader初始化的基于内存的虚拟文件系统。在内核启动前,boot loader 会将存储介质中的 initrd 文件(initramfs-2.6.32-573.el6.x86_64.img)加载到内存,而后在内存中初始化一个文件系统。
3、stage2:这个程序主要给用户提供一个比较友好的启动菜单,而后去加载位于同一个磁盘分区/boot/的内核文件(例如 vmlinuz-2.6.32-573.el6.x86_64)。
接下来就将系统的控制权交给内核。
三、kernel
控制权移交给内核之后,内核进行自身初始化,主要完成的工作有:
1、探测可识别到的所有硬件设备并完成与之相关的配置工作,包括CPU、I/O、存储设备等。
2、加载硬件驱动程序;
此处着重说一下第2点,出于对不同硬件的适应性,内核文件中只包含了一些基本设备的驱动程序,此外的一些驱动程序则必须借助ramdisk或者ramfs(CentOS 7)来完成驱动程序的加载。在boorloader阶段已经初始化了ramdisk,实际也就是bootloader配置了initrd文件。内核此时就可以访问initrd文件系统,并运行initrd文件系统中的init程序,来加载那些不包含在内核中的驱动程序。
当然,ramdisk和ramfs不是必须的,我们若是自己编辑一个内核,且只针对一种电脑将它所需的所有驱动程序统统编辑进内核,则不需要ramdisk和ramfs。
ramfs是CentOS 7中ramdisk的进化版本。因为ramdisk和ramfs都需要在内存解压,ramdisk是虚拟磁盘,ramfs是虚拟文件系统;虚拟磁盘要用缓存和缓冲来加速对磁盘的访问,故会在内存和虚拟磁盘都会缓存和缓冲,是双缓存缓冲。而ramfs是基于内存的文件系统,不需要缓存和缓冲,效率提升。
3、以只读方式挂载根文件系统(安全考虑,防止内核初始化时对根文件系统有损坏)。
4、在根文件系统被挂载之后,运行用户空间的第一个应用程序:/sbin/init。
接下来内核将系统的控制权交给/sbin/init程序。由此,系统的启动由内核空间转化到用户空间。
四、/sbin/init程序
/sbin/init程序是内核的管家,除非程序发起系统调用。否则系统的一切都由/sbin/init程序来管理。而在系统启动时,它的工作流程是
1、根据/etc/inittab配置文件的定义来设置默认运行级别。
运行级别:设定是为了系统的运行或维护等目的而设定的机制
0:关机,shutdown
1:单用户模式(single user),root用户,无需认证;维护级别;
2:多用户模式(Multiuser),会启动网络功能,但不会启动NFS;维护模式;
3:多用户模式(Full multiuser mode),完全功能模式,文本界面;
4:预留级别;目前没有特别使用目的,但习惯以3级别功能来使用;
5:多用户模式(X11),完全功能模式,图形界面;
6:重启,reboot
2、运行系统初始化脚本(/etc/rc.d/rc.sysinit),完成系统初始化。
3、关闭对应级别下的需要停止的服务(/etc/rc.d/rc[0~6].d/K*),启动对应级别下需要开启的服务(/etc/rc.d/rc[0~6].d/S*)
此处的K*或者S*都是符号链接,链接至/etc/init.d下对应的服务脚本文件,由init程序(systemd程序,CentOS 7中)来统一管理。
4、设置登陆终端,此时若是图形界面,则还需要启动图形终端。
至此,系统的启动完成,用户可登录使用。
附录1:linux的启动流程图解
注:这张图片来自另一个博客:http://blog.chinaunix.net/uid-23069658-id-3142047.html
附录二:关于CentOS的启动init程序演进,由SysV init(CentOS 5)到UpStart(CentOS 6)再到systemd(CentOS 7)。这三者的详细工作机制可参考博客 浅析Linux初始化系统(三部分)
本文出自 “RoadtoOM” 博客,请务必保留此出处http://flyalways.blog.51cto.com/7680670/1731093
原文地址:http://flyalways.blog.51cto.com/7680670/1731093