【前言】
我们通常在启动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个字节,后面跟的才是分区表的信息,因为我们这里只能写的只能指定硬盘,不能指定单独的硬盘分区噢~~