Centos启动流程

【前言】

  我们通常在启动centos时,如果你们是字符界面的话,通常会看到一串一串的字符提示,而使用windows时则不会有这种现象,这是为什么呢?因为linux在启动时会通过这些字符来告诉我们它此刻正在做什么,那么这篇博就来讨论一下centos在启动的时候都干了些啥事。。。。
  显然的,任何系统在启动的第一步就是加电,按下电源键一个系统才能启动,然后计算机的硬件会主动读取BIOS来加载硬件设备信息以及进行硬件设备的自我检测,之后系统会主动的读取第一个有引导程序的设备,该引导程序可以指定使用哪个内核来启动,并将其加载至内存当中运行,同时内核还要加载其他硬件设备以及对应的驱动程序,来使主机各个组件开始运行,等所有硬件设备完全加载完成后,系统才真正的启动起来,这个一整个流程概述,接下来来细分每个环节~~

这里写图片描述

总的来说,系统启动的流程大概就是以上的几个步骤:
1、POST (power on system test ) 加电自检
  自检主要是检测一下硬件设备是否存在并能正常运行,如CPU、内存、硬盘是否存在并能正常运行等;这些自检的功能是有一个软件程序来实现的,这个软件程序叫做:BIOS。什么又是BIOS?BIOS全称是Basic Input Output System,即基本输入输出系统,虽然这么说,是不是还是挺抽象的?好吧,me too。那就百度吧。

其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。

  看明白了不,这就相当于大楼的地基一样,是最底层、但最重要的东西。那加电过程其实就是给这个芯片通电,然后启动上面的BIOS程序,BIOS程序会根据上面的一些配置信息去读取其他的硬件设备信息并检测其是否存在并能正常运行。好了,就假装你们都明白了,来说下一个。。。。
2、加载BootLoader ( MBR )
  在硬件设备初始化之后,BIOS会列出一些可以启动的装置顺序,接下来就开始读取第一个可以启动的设备中操作系统的核心文件。我们以一个启动管理程序来处理这些核心文件的加载问题,这个启动管理程序为Boot Loader,首先Boot Loader 是一个程序,它肯定是依赖于硬盘的,或者准确的说,它是依赖于第一个可以启动的硬盘的第一个扇区内,就是MBR。
  什么是MBR?之前在学习磁盘分区时有提到过这个概念,MBR称为主引导记录,它是硬盘上是0磁道0扇区,它不属于任何分区,我们将包含MBR引导代码的扇区称为主引导扇区。因这一扇区中,引导代码占有绝大部分的空间,故而将习惯将该扇区称为MBR扇区(简称MBR)。由于这一扇区承担有不同于磁盘上其他普通存储空间的特殊管理职能,作为管理整个磁盘空间的一个特殊空间,它不属于磁盘上的任何分区,因而分区空间内的格式化命令不能清除主引导记录的任何信息。
  主引导扇区由三个部分组成(共占用512个字节):446字节的主引导程序,后面跟上64字节分区表和2字节55AA结束位就构成了512字节的主引导扇区。
3、加载GRUB
先来简单说一下grub~~~

  系统统启动在BIOS加载完以后,接着就会去MBR中读取BootLoader信息。BootLoader提供菜单选择、直接加载内核信息以及相关的控制权转交功能,因此系统启动必须加载BootLoader。BootLoader存放在MBR中,而MBR只有512字节,前446字节存放BootLoader,显然BootLoader这么多功能是无法存储在MBR中的,为了解决这一问题,linux将BootLoader的启动与加载分为了三个阶段:
stage1—-> 运行 BootLoader主程序,仅在MBR中安装了最小主程序,并没有安装其他配置文件。
stage1.5—-> 在MBR随后的扇区中存放,主要用于与stage2所在分区的文件系统进行交互。
stage2—-> 通过BootLoader加载所有配置文件及相关的环境信息。这些文件被存放在/boot/grub目录下。该目录下的文件多数定义了各种文件系统和一些启动的相关说明。
  由此可以看出/boot/grub 目录下的最重要的是grub的配置文件及各种文件系统的定义,当BootLoader 读取了这些文件系统所定义的数据后,就能够识别文件系统并读取在该文件系统上的内核文件了。

4、加载系统内核,执行系统初始化信息。
  之前的工作已经做完,接下就是加载内核。那么内核文件放在哪呢?内核文件通常存放在/boot目录当中,并且是一个vmlinuz开头的文件,我们先来看一下;

这里写图片描述

  那要来思考一个问题了,既然这个时候内核程序并没有加载到磁盘,又该怎么去读取系统上的内核文件?如果先去加载磁盘,就必须要有磁盘的驱动程序,然后这些驱动程序都在硬盘上…….是不是衍生出了一个鸡和蛋的问题?为了解决这一问题,centos采用了一种叫做虚拟文件系统,也可以成为辅助的伪根系统来解决。它同样也放在/boot下,以initramfs开头:

这里写图片描述

  这个initramfs文件的特点是:能够通过BootLoader程序加载到内存中,然后这个文件会被解压缩并且在内存中模拟一个根文件系统,这个根文件系统能够提供一个可以运行的程序,系统就可以通过这个文件来挂载根的文件系统,从而实现后续的正常启动。
  这个文件时安装操作系统时才生成的文件,并不是光盘文件中带有的,所以如果不小心误删除了这个文件,我们可以使用工具来进行生成,就是下面这个了:
mkinitrd /boot/initramfs-`uname -r`.img  `uname -r`
文件名字后可以不跟版本号,但是后面一个版本号是必须加的
5、启动用户空间第一个执行程序/sbin/init
  在内核、硬件及驱动信息加载完毕后,内核会呼叫用户控件的第一个执行程序/sbin/init,init是一个二进制文件,它的主要功能是 准备软件运行环境,包括系统的主机名称、网络配置、文件系统格式等其他服务的启动管理。
基本上centos启动的大致流程就是以上所说的几步,接下来我们来详细介绍一下grub~~

【grub】

  既然我们前面提到,系统启动必须加载BootLoader才能去加载内核,从而提到了grub的重要性。那么/boot/grub 目录下重要的是grub的配置文件及各种文件系统究竟是怎么定义的呢?首先来看grub的配置文件,它是/boot/grub/下名为grub.conf的文件:

这里写图片描述

依次对其中的参数定义作解释:

defalut=0 ——> 表示默认的启动条目,如果装有多个系统,0表示启动第一个title;1表示启动第二个title…..
timeout=5 ——> 表示等待时间,一旦超时,系统则使用默认的启动条目启动系统。
splashimage=(hd0,0)/grub/splash.xpm.gz ——> 启动时的背景图片信息
hiddenmenu ——> 隐藏菜单,默认不显示;如想要显示,将它注释掉即可。
title ——> 定义各个操作系统的名称
root (hd0,0) ——> 表示内核文件存放的位置,第一个0表示第一块硬盘;第二个0表示第一个分区
kernel ——> 内核的名称及启动时的核心参数
rhgb 启动时的图形界面
quiet 静默模式加载内核
initrd ——> 伪根操作系统

  既然我们之前说这个配置文件很重要,那么如果我们在生产中不小心误删了文件怎么办?如果直接rm -rf /boot/* 又怎么办?接下来进行实验:
实验:删除/boot下所有文件并恢复

这里写图片描述

  重启后我们发现机器会出现在这个界面,没有真正启动,因为我们已经将启动文件下的配置文件全部删除,因此系统找不到内核文件和伪根系统,所以系统一直停留在这个界面:

这里写图片描述

这时候我们再次重启,进入救援模式,一路选择默认到达下面这个界面:

这里写图片描述

  因为我们原系统文件都挂载到/mnt//sysimage下,所以第一步首先切换根,这样操作就方便多啦~切换后看下目录下的文件确认是否已经切换成功:

这里写图片描述

  因为之前说过,内核文件是光盘文件自带的,所以我们可以通过挂载光盘找到文件进行复制就可以了~~

cp /cdrom/isolinux/vmlinuz /boot/

这样内核文件就已经恢复,第一步就算完成了~~~↓

这里写图片描述

  接下来就要找回辅助的伪根系统了。还记得吗?initramfs开头的文件,这个文件是我们安装操作系统时生成的文件,因此我们可以使用命令来生成:
mkinitrd /boot/initramfs-`uname -r`.img  `uname -r`
文件名字后可以不跟版本号,但是后面一个版本号是必须加的

这里写图片描述

  现在内核文件和辅助伪根系统都已经有了,接下来就要回复我们grub目录下的文件了,同样的,我们也使用工具来生成:

grub-install /dev/sda

  关于这里为什么是/dev/sda 要说一下,因为自己之前也犯过这种糊涂。因为我们生成的是系统的启动文件,是grub,也可以说是MBR。主引导扇区是在512字节的前446个字节,后面跟的才是分区表的信息,因为我们这里只能写的只能指定硬盘,不能指定单独的硬盘分区噢~~

这里写图片描述

  以上步骤都完成了,就剩最后一步了,手动加入grub.conf 文件,这个文件要写在/boot/grub/下,写上主要的参数就可以啦~~

这里写图片描述

最后重启就可以恢复了~~~

这里写图片描述

  由以上实验我们可以看出/boot下的文件非常重要,删除一个都可以导致系统无法启动,那在/boot 启动以后,内核会启动第一个执行程序/sbin/init 文件,系统接下来的操作,例如网卡配置、文件系统格式等都是通过init的配置文件来定义的,那么如果这个文件不小心删除了,该怎么恢复呢?接下来实验一下:
【实验】删除/sbin/init 文件,并恢复。
我们先将/sbin/init文件移动到/app下,这样也间接删除的功能,然后重启系统

这里写图片描述

重启会出现这样的报错界面 :

这里写图片描述

按回车键会一直卡住,这时我们重启,进入到启动菜单界面:

这里写图片描述

按”a”键进入一个命令行界面,在内核参数后面加上 “init=/bin/bash ” ,然后按回车键:

这里写图片描述

这时系统会进入一个临时的以bash启动的界面:

这里写图片描述

  我们进入/app目录,发现目录下没有文件,因为我们没有挂载,所以先将/dev/sda3目录 挂载到/app下,为什么我肯定是/dev/sda3呢?我也不确定,你可以将/dev/sda下的分区分别挂载到一个目录下查看,看看哪个是你需要的分区。这里我需要的分区就是/dev/sda3。
  进入/app目录发现了我们之前移动的文件,将它移回/sbin下就可以了,但是发现在移动时并没有成功,系统告诉我们“/”是只读文件系统,那我们重新将”/”挂载为读写就可以了,再重新移动,发现移动成功。这时候我们重启就可以了。。

这里写图片描述

  刚刚我们是将/sbin/init文件移动到别的目录下,然后将目录找到移动回原目录下实现的恢复,如果我们真的删除了文件又该怎么恢复呢?
  有一个最简单的办法,直接挂载光盘,安装upstart包,就可以直接生成init文件,是不是很简单明了~~~

这里写图片描述

/sbin/init文件已经恢复,接下来重启系统就可以完事了~~~

【各版本启动进程】

在学习启动流程的时候,发现不同版本的Centos的第一个进程并不相同,下面就来说一下自己的总结:
Centos5:init
原理:第一个进程为init,系统启动完全按照事先规定的程序启动顺序串行启动,有依赖关系的服务也要按照启动的规定顺序依次启动。配置文件为/etc/inittab
Centos6: init(表面) upstart(实际)
原理:第一个进程表面为init,实际上是upstart。系统对于没有依赖关系的服务实行并行启动,对于有依赖关系的服务还是串行启动。
配置文件为/etc/inittab (文件中只有默认启动级别,其他设置被单独放入其他文件中) /etc/init/*.conf
Centos7:systemd
原理:启动时所有的服务都实行并行启动,对于有依赖关系的服务:1服务在启动过程中向2服务发送信号,表示已经启动,但实质上并没有启动;如果1服务没有启动,启动2服务时会向1服务发送信号激活1服务,用户在访问的时候才会启动需要激活的服务,所以启动效率高,用户访问时效率较低。
配置文件 /usr/lib/systemd-*

【END】

  系统的启动进程就说到这吧,又总结了一遍也巩固了一遍知识点,也是蛮有益处的~~希望自己加油,坚持写博客,超越每一天的自己吧~FIGHTING

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值