CentOS系列操作系统启动

2019-09-21 0 条评论 486 次阅读 0 人点赞

首先,本文会介绍CentOS5的启动流程,接下来会对比CentOS5介绍CentOS6和CentOS7的启动流程,注意文中介绍的都是BIOS+MBR格式分区的启动方式

CentOS5系统启动流程

  1. POST加电自检

    检测计算机各个硬件是否处于正常状态,如果正常则继续执行,后面的操作,如果有些部件不正常,主办上的蜂鸣器可能会发从警告声,

  2. 选择引导设备

    根据设定好的系统加载次序,依次扫描各个加载设备,直到找到第一个可以加载的磁盘设备,

  3. grub第1阶段

    读取上一步找到的磁盘设备的第0磁道第0扇区(也就是MBR)的前446字节,这一部分称做引导加载器即BootLoader

  4. grub1.5阶段

    该步骤是通过上一步的指示,读取bootloader的后n个扇区,该部分主要存放了用以加载boot分区的程序

  5. grub2阶段

    此时就可以加载boot分区了,加载之后会读取grub目录中的grub.conf配置文件,这个文件中定义了默认的启动项以及grub菜单的显示时间,内核文件(vmlinuz)的位置(支持多个内核),根分区的位置,伪根分区文件(initrd)等等,之后就可以在屏幕上看到grub的启动菜单了,在此选择需要启动的内核,选择后,grub会将整个计算机的控制权交给内核,此时grub使命完成

  6. 内核初始化

    加载内核后首先会尝试根据grub,中的配置尝试以只读的方式去挂载根分区,因为没有根分区磁盘驱动程序等原因造成根分区挂载失败,则会将initrd文件载人内存使其临时成为根分区,内核通过根分区中的工具,文件等进行自身的初始化

  7. 启动第一个进程/sbin/init

    内核初始化完成,开始尝试启动第一个进程/sbin/init,该程序在CentOS5中由SysVinit程序提供该进程会进行一系列的系统初始化动作

    1. 读取/etc/inittab文件,以下详细解释文件中各部分的作用
      • id:3:initdefault:,确定系统启动的运行级别,中间的数字代表不同的运行级别,0:关机,1:单用户模式:没有NFS服务的多用户模式,3:命令行模式的多用户模式,4:保留,暂未使用,5:图形界面模式,6:重启,在进入系统后可以使用init N来手动改变运行模式
      • si::sysinit:/etc/rc.d/rc.sysinit,系统初始化脚本,该脚步中又完成了一系列的动作,比如定义主机名,设置欢迎信息,激活selinux,挂载/etc/fstab文件中定义的文件系统(这里可能会伪根文件系统切换成真正的根文件系统),导入/etc/init.d/functions文件(该文件中定义了一系列的函数,方便在初始化时使用,)检查selinux状态,启动swap分区等等一列的操作,这里不再一一列举
      • l0:0:wait:/etc/rc.d/rc 0:会有7条这样的语句,每条代表一个运行级别,第2列的数字代表的是运行级别,最后一个数字是传给/etc/rc.d/rc脚本的参数,代表的是对应的运行级别,该脚本会根据传给他的对应的运行级别来启动关闭该级别中需要关闭,启动的服务,其工作原理很简单,执行了/etc/rc.d/rcN.d/中的脚本(N代表对应的运行级别数字),其实是指向//etc/init.d/中的对应服务启动脚本的软链接,这些软链接的名字是按规定格式写的,以K或者S,中间是两位数字最后是服务的名称,K代表该运行级别中不启动的服务,S代表该运行级别中需要启动的服务,中间的两位数字可以控制服务的启动与关闭的顺序,因为某写服务会依赖于其他的服务,因此需要有顺序的控制,最后会有一个特殊的文件S99local,这个软链接没有指向服务启动脚本而是指向了/etc/rc.local,由于是99因此它会最后一个执行,用户可以在这个文件中写一些系统启动时需要执行的命令,,由此,其实我们在执行chkconfig命令启用或者关闭某个服务开机启动时其实就是在修改这些快捷方式的名称,以上介绍可以看出,不同的运行级别,其实就是启动不同的服务而已,
      • ca::ctrlaltdel:/sbin/shutdown -t3 -r now:,监听ctrl+alt+del按键,当三个按键同时按下时,系统会重新启动,为了防误触,可以注释掉该行
      • pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down",这一行定义了,当计算机断电接入ups电源后,会在两分钟内关机,
      • pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled",这个功能是当接入ups后,来电后会取消上面定义的关机操作
      • 1:2345:respawn:/sbin/mingetty tty1,默认会有6行,即系统启动后会启动6个tty终端(即使用ctrl+alt+f[1-6],可以切换终端),可以人为的删除增加行,来增减这个数值,其中respawn表示该进程如果被终止,系统会立即生成一个新的进程,即保证永远有n个tty终端
      • x:5:respawn:/etc/X11/prefdm -nodaemon:这一行定义了哪一个运行级别属于图形界面,至此系统启动完成

CentOS6与CentOS5对比

其实在内核启动之前所有的步骤都没有什么变化,不过,虽然系统启动的第一个进程也是/sbin/init但是在centos6中的init程序却悄悄的发生了一些变化,centos6中的init程序由upstart程序提供,该程序其实是ubuntu开发的,以此可见,只有同行才是赤裸裸的仇恨这句话也不是那么的准确,upstart的启动过程略有不同,在/etc/inittab文件中仅定义了系统启动的运行级别,其他的配置都放在了/etc/init/*.conf中了,不过它还是会运行/etc/rc.d/rc.sysinit脚本的,upstart与SysVinit最大的区别是在开机时服务的启动上提高了速度,在CentOS5中服务只能是前一个服务启动完成后后一个服务才可以启动,这样其实并没有多大必要,因为好多服务是没有依赖关系的,因此在CentOS6中对于这些没有依赖关系的服务,在启动时是可以并行启动的,这样就加快了启动的速度

CentOS7与CentOS6的对比

在CentOS7中系统的启动有了不小的改变,首先是grub,从之前centos5,6使用的grub0.9直接升级到了grub2,系统启动的第一个进程也由init改成了Systemd,这个systemd的功能实在是太强大了(据说systemd主要借鉴了Mac的OSX系统的启动方式),服务的启动,系统的运行级别,磁盘的挂载统统可以由systemd来完成,在systemd中这些不同的功能被定义成不同的Unit,服务被叫做service,运行级别被叫做target,已经有了一种systemd一家独大的感觉了,不过,最主要的是,CentOS7的开机启动效率又被大大的提高了少,CentOS7将多数的有依赖关系的服务的启动也做了优化,大概的运行机制是在系统启动时,先将被依赖服务打一个已经启动的标签,这样需要依赖他的服务就可以差不多的和它同时启动

最后,以上这些内容为个人总结而来,可能会有很多不妥的地方,再以后觉得不妥的地方还会更新,修改

bighero

这个人太懒什么东西都没留下

文章评论(0)