设为首页 收藏本站
查看: 989|回复: 0

[经验分享] linux系统启动流程(CentOS为例)

[复制链接]

尚未签到

发表于 2018-4-21 14:30:17 | 显示全部楼层 |阅读模式
  Centos系统启动流程
  熟悉系统启动流程对于我们学习Linux系统是非常有帮助的,虽然基础,但能帮助我们更加理解Linux系统的工作机制。以下将以CentOS发行版为例来介绍Linux系统的启动流程,因为在CentOS 5、CentOS 6以及CentOS 7使用的初始化程序init各不相同,虽然CentOS 6和CentOS 7都有向后兼容,但在工作机制上仍有一些差异,因此以下主要介绍CentOS 5/6系统启动流程
  CentOS的启动流程总体顺序如下(以CentOS 6为例):
  POST --> Boot Sequence --> bootloader(MBR) -->Kernel --> 加载rootfs --> switchroot--> /sbin/init --> (配置文件:/etc/inittab, /etc/init/*.conf) --> 根据init配置文件设置默认运行级别--> 运行系统初始化脚本/etc/rc.d/rc.sysinit,完成系统初始化--> 开启或关闭用户选定的对应运行级别下所对应的服务--> 启动终端,打印登录提示符
  注意:红色部分代表内核空间的系统启动流程,紫色部分代表用户空间的系统启动流程。
  接下来逐一详解:
第一步:POST加电自检
  主要实现的功能是检测各个外围硬件设备是否存在而且能够正常运行起来,实现这一自检功能的是固化在主板上的ROM(主要代表为CMOS)芯片上的BIOS(Basic Input/Output System)程序;例如BIOS会检测CPUMemory以及I/O设备是否能够正常运行,如果是个人计算机的话可能还会检测一下显示器。只要一通电,CPU就会自动去加载ROM芯片上的BIOS程序,是这样来实现的。而检测完成之后就进行硬件设备的初始化
  POST:系统首先由POST(POWER ON SELF TEST,上电自检)程序来对内部各个设备进行检查,通常完整的POST自检将包括CPU、640K基本内存(640K BASE MEMORY)、1MB以上扩展内存(EXTEND MEMORY)、ROM(READ-ONLY MEMORY,只读存储器)、主板、CMOS存储器、串口、并口、显卡、软盘子系统、硬盘子系统、键盘进行测试,一旦发现问题,系统将给出警告或鸣笛警告。
  BIOS是英文"Basic InputOutput System"的缩略词,直译过来后中文名称就是"基本输入输出系统"。其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。
第二步:Boot Sequence(选择启动设备以加载MBR)
  主要实现的功能是选择要启动的硬件设备,选择了之后就可以读取这个设备上位于MBR里头的bootloader了。这一步的实现是这样的:根据BIOS中对启动顺序的设定,BIOS自己会依次扫描各个引导设备,然后第一个被扫描到具有引导程序(bootloader)的设备就被作为要启动的引导设备。
  MBR:主引导记录(MBR,Main Boot Record)是位于磁盘最前边的一段引导(Loader)代码。它负责磁盘操作系统(DOS)对磁盘进行读写时分区合法性的判别、分区引导信息的定位,它由磁盘操作系统(DOS)在对硬盘进行初始化时产生的。
  Bootloader:启动加载,可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。
第三步:加载bootloader(MBR)
  这一步实现起来的步骤比较多,前面的BIOS通过读取并执行启动设备的MBR中的bootloader,而bootloader要实现的功能就是提供一个菜单给用户,让用户去选择要启动的系统或不同的内核版本,然后把用户选择的内核版本加载至RAM中的特定空间,接着在RAM中解压、展开,而后把系统控制权移交给内核。
  grub是bootloader中的一种,就grub来说,这一步的实现是这样的:grub是通过分成三个阶段来实现加载内核这一功能的,这三个阶段分别是:stage1,stage1.5以及stage2。其中:
  stage1:存放于MBR的前446Bytes,用于加载stage1.5阶段,目的是为了识别并驱动stage2(或者/boot)所在分区的文件系统;
  stage1.5:存放于MBR之后的扇区,加载stage2所在分区的文件系统驱动,让stage1中的bootloader能识别stage2所在分区的文件系统;
  stage2:存放于磁盘分区之上,具体存放于/boot/grub目录之下,主要用于加载内核文件(vmlinuz-VERSION-RELEASE)以及ramdisk这个临时根文件系统(initrd-VERSION-RELEASE.img或initramfs-VERSION-RELEASE.img)。
  概述:假如要启动的是硬盘设备,首先我们的硬件平台主板BIOS必须能够识别硬盘,然后BIOS才能加载硬盘中的bootloader,而bootloader自身加载后就能够直接识别当前主机上的硬盘设备了;不过,能够识别硬盘设备不代表能够识别硬盘设备中的文件系统,因为文件系统是额外附加的一层软件组织的文件结构,所以要对接一种文件系统,就必须要有对应的能够识别和理解这种文件系统的驱动,这种驱动就称为文件系统驱动。而stage1.5就是向grub提供文件系统驱动的,这样stage1就能访问stage2及内核所在的分区(/boot)了。
  需要注意的是,stage2、内核以及ramdisk文件通常放置于一个基本磁盘分区之上,因为grub无法驱动lvm、软raid等复杂逻辑设备,除非提供一个复杂的驱动接口,否则如果stage2及内核等文件都存放在lvm等复杂逻辑设备上将无法被stage1所识别,更别说加载了!
DSC0000.png

DSC0001.png

DSC0002.png

  ramdisk:虚拟内存盘是通过软件将一部分内存(RAM)模拟为硬盘来使用的一种技术。相对于直接的硬盘文件访问来说,这种技术可以极大的提高在其上进行的文件访问的速度。但是RAM的易失性也意味着当关闭电源后这部分数据将会丢失。但是在一般情况下,传递到RAM盘上的数据都是在硬盘或别处永久贮存的文件的一个拷贝。经由适当的配置,可以实现当系统重启后重新建立虚拟盘。
第四步:Kernel自身初始化
  Kerenl在得到系统控制权之后,首先要进行自身初始化,而初始化的主要作用是:
  (1)探测可识别到的所有硬件设备;
  (2)加载硬件驱动程序,即加载真正的根文件系统所在设备的驱动程序(有可能会借助于ramdisk加载驱动);
  (3)以只读方式挂载根文件系统(即根切换);
  (4)运行用户空间的第一个应用程序:/sbin/init.
  到这里内核空间的启动流程就结束了,而接下来是用户空间完成后续的系统启动流程。
  
  注意:
  ramdisk和内核是由bootloader一同加载到内存当中的,ramdisk是用于实现系统初始化的、基于内存的磁盘设备,即加载至内存(的某一段空间)后把内存当磁盘使用,并在内存中作为临时根文件系统提供给内核使用,帮助内核挂载真正的根文件系统。而之所以能够帮助内核挂载根文件系统是因为在ramdisk这个临时文件系统的/lib/modules目录下有真正的根文件系统所在设备的驱动程序;除此之外,这个临时文件系统也遵循FHS,例如有这些固定目录结构:/bin, /sbin, /lib, /lib64, /etc, /mnt, /media, ...
  需要注意的是,系统发行商为了适应于各个不同的硬件接口,因此将各个不同的硬件接口的驱动组装打包起来,例如在用户第一次使用光盘安装完系统之后,会动态探测当前主机上的硬件设备并调用与之对应的设备驱动再做成ramdisk文件的。所以,ramdisk文件并非必须的,如果只是为了将Linux安装于特定硬件平台上,就可以直接把对应的驱动编译进内核即可,而不需要去使用ramdisk文件了。
第五步:init管理用户空间服务进程
  这一步的流程是:/sbin/init --> 根据init配置文件设置默认运行级别--> 运行系统初始化脚本/etc/rc.d/rc.sysinit,完成系统初始化--> 关闭或启动用户选定的默认运行级别所对应的服务--> 启动终端,打印登录提示符.
  
  (1)根据init配置文件设置默认运行级别
  对于CentOS 6来说,初始化程序init是upstart,其配置文件为:/etc/inittab, /etc/init/*.conf,也就是upstart将配置文件拆分成多个,在/etc/init/目录下以conf结尾的都是upstart风格的配置文件,而/etc/inittab仅用于设置默认运行级别;
  注意:
  运行级别是为了系统的运行和维护等目的而设定的一种机制,对于CentOS 5/6来讲,一共有7种运行级别,即0-6,它们的意义如下:
  0:关机模式,shutdown
  1:单用户模式(single user):不需要通过认证,登录进去之后为root用户身份,是维护模式;
  2:多用户模式(multi user):会启动网络功能,但不会启动NFS,是维护模式;
  3:多用户模式(multi user):为完全功能模式,提供文本界面;
  4:预留级别,目前无特别使用目的,但习惯上以同3级别功能来使用;
  5:多用户模式(multi user):为完全功能模式,提供图形界面;
  6:重启模式,reboot
DSC0003.png

  
  (2)运行系统初始化脚本/etc/rc.d/rc.sysinit,完成系统初始化
  运行初始化脚本是为了初始化系统环境,这一步初始化包括:
  ①  设置主机名;
  ②设置欢迎信息;
  ③激活udev和selinux
  ④挂载/etc/fstab文件中定义的所有文件系统;
  ⑤检测根文件系统,以读写方式重新挂载根文件系统;
  ⑥设置系统时钟;
  ⑦根据/etc/sysctl.conf文件来设置内核参数;
  ⑧激活lvm及软raid设备;
  ⑨激活swap设备;
  ⑩加载额外设备的驱动程序(因为内核只加载根文件系统所在分区的驱动程序);
DSC0004.png

  (3)关闭或启动用户选定的默认运行级别下所对应的服务
  要实现的功能是:根据前面用户通过init配置文件对默认运行级别的设定,关闭或启动这个运行级别下的服务。
  具体实现方式:运行/etc/rc.d/rc这个脚本文件,而初始化程序init根据前面获取的默认运行级别信息,将这个运行级别数字以参数方式传递给/etc/rc.d/rc脚本中的变量$runlevel;然后,这个脚本会以glob方式去把/etc/rc.d/rc$runlevel.d/S*匹配到的脚本所控制的服务开启,而把/etc/rc.d/rc$runlevel.d/K*匹配到的脚本所控制的服务关闭。
DSC0005.png

  需要注意的是,在这些/etc/rc.d/rc#.d/目录下,除了S99local这个服务脚本之外,其他服务都链接到/etc/init.d/目录下对应的服务脚本,而S99local则链接到/etc/rc.d/rc.local(或/etc/rc.local)。所以,如果我们有不方便或者没必要写成服务脚本的程序,但又希望这样的程序能够在开机自动开启时,可以直接写进/etc/rc.d/rc.local这个脚本文件中就行了!
DSC0006.png

  
  (4)启动终端,打印登录提示符
  根据前面获取的运行级别来启动终端,mingetty程序是用于启动终端的,它会调用登录程序login,这样就能显示出登录提示符了,类似mingetty这种用于打开终端的程序还有getty等。   
  如果默认运行级别为3,则打开字符界面;
  如果默认运行级别为5,则会打开图形界面。
  
第六步:用户登录
  系统启动结束!
  
  
  
  流程图:
  
   DSC0007.jpg

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-450136-1-1.html 上篇帖子: centos7安装apache 下篇帖子: 在CentOS下安装Chrome-MMX的沙罗双树园
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表