Linux的启动流程(CentOS 6)

简介:

前言

   Linux启动的过程在实际生产中有着至关重要的作用。试想一下,如果我们在实际生产中服务器因为某一个服务出了问题,而不能启动,这时我们应该怎么办。如果我们了解Linux的详细启动过程,知道是在哪一个环节出了问题,我们就能够进入到相应的环节,排除掉相应的问题,从而解决实际生产中的问题。

   同时,我们在这里提出一个问题,有谁知道Windows的启动过程呢?如果启动过程出了问题,我们该怎么办呢?恐怕答案只有重启系统了吧……

   Linux 系统的启动过程对于管理员来说是完全透明的,了解了Linux的启动过程,就好像有了透视眼一样,能够清楚的了解Linux的一切。知道了这些,不仅能够解决实际生产中的问题,更能够自己来制作Linux,自己定制Linux了,总之Linux大法好……

写在前面(最重要)

本文部分资料参考了以下博文。

  1. Linux Booting Process steps – RHEL/CentOS 7
  2. http://www.linuxidc.com/Linux/2014-03/97862.htm
  3. http://www.cnblogs.com/zengkefu/p/5559058.html

先来看一张图

可以图片上点击右键,选择在新的标签页中打开,这样可以查看大图。此图为笔者根据参考资料重制,转载请注明出处。


Linux%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8

   这张图大体上描述了Linux 的启动流程,在Linux的不同启动阶段,标注的相应的注释。本文将在此图的基础上,对Linux的启动过程分阶段的进行详细的描述。同时由于自身能力有限,文中描述难免有纰漏之处,还请各位读者留言指出,我会及时改正。

Linux启动过程都经历了什么!!

  • 硬件引导启动
  • grub启动引导阶段
  • 内核引导阶段
  • init初始化阶段

硬件引导启动

   硬件引导启动过程在Linux和Windows上是相似的。熟悉Windows系统的朋友可以结合Windows的启动过程来理解。

BIOS 启动

   稍有计算机基础的人都会知道BIOS(Basic Input / Output System),又称为基本输入输出系统,它是一组固化到计算机主板上的一段程序,存储在ROM中。里面保存了计算机最基本的输入输出程序,计算机启动的时候首先根据BIOS中提供的信息去查找相应的硬件,并完成最基本的检测。如果这个过程中出现了问题,系统就不会启动。
   举一个最简单的例子,如果系统在BIOS阶段发现,内存条没有成功加载,那么系统还能够正常启动吗?即便Windows系统在这一点上也是如此的。

MBR 分区引导

   关于Linux系统的分区结构有两种方式,分别是MBR分区和GPT分区。二者在分区结构上有很大的不同,区别也很多,二者的异同可以去查看相关的资料,我们在这里不做详细的介绍。
   我们以MBR分区为例,来介绍Linux的启动过程。
   硬盘上第0磁道第一个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的大小是512字节,预启动信息、分区表信息。

   在计算机完成了BIOS阶段之后,系统会找到BIOS中指定的硬盘的MBR,此时系统启动的控制权就移交到MBR阶段。如图所示,在MBR由三部分组成,分别是BootLoader(主引导程序),DPT(硬盘分区表)和55AA(硬盘有效标志)。其详细结构可参考上图。

grub 启动引导阶段

   系统启动到MBR阶段的时候会读取MBR中记录的BootLoader。所谓的BootLoader指的就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。在Linux 中就是grub。

   Linux 中的grub 启动位于/boot/grub/目录下

实验 如果仅仅保留 grub.conf 文件,系统能够正常启动吗?

仅保留grub.conf

仅仅保留 grub.conf 在启动过程发生的错误,提示信息如下图所示

仅保留grub.conf的错误提示信息

stage 1阶段

   系统进入到MBR阶段中,就会直接将磁盘的前446字节读入内存中,也就是BootLoader。stage 1阶段就是指的这一段。
   stage 1 阶段的任务非常简单,就是将硬盘中的这446个字节读入内存中,并解析,然后为下一个阶段做好准备。

实验 如果Stage1 阶段被破坏了,如何修复启动?

前面我们说过,Stage1 主要位于BootLoader 中,也就是硬盘的第0个磁道的第一个扇区的前446个字节,那么我们只要将446个字节破坏掉了就可以模拟这个实验。先看下面一个动图。

stage1 启动失败

从图中可以看到,这时系统会直接进入救援模式。因为系统找不到找不到硬盘启动代码。所以我们就进入到救援模式,进行一系列的救援操作。

stage1 救援

grub-install 的作用就是重新安装grub,会恢复/boot/grub 目录下的文件。
我们在执行 grub-install的过程,不仅修复了stage1 阶段,还修复了stage1.5阶段和stage2阶段。

stage 1.5阶段

stage1 位于/boot基本磁盘分区中,为识别内核文件所在的文件系统提供系统识别扩展。
Stage 1.5 是桥梁,Stage 1 并不能直接识别文件系统,所以需要Stage 1.5来引导某个文件系统当中的Stage 2.

stage 2阶段

  stage 2阶段是GRUB的核心程序,能让用户以菜单方式将操作系统加载、新增参数、修改选项,这些全都是stage2的功用。对GRUB来说,stage2除了不能自己启动外,剩下的事情全都由stage2完成。像是用户在启动时所看到的GRUB启动倒数画面,或是紧接着的启动菜单画面,就都是由stage2所提供的。 在 /boot/grub/目录下可以看到由一个stage2 的文件,就是这个文件起到了至关重要的作用。
   在Stage 2阶段 会读取 grub.conf 文件,而grub.conf 文件也是在Linux的整个启动过程中占据着尤为重要的一环。

grub.conf 配置文件

grub.conf 文件在启动过程中有着很大的作用

  • 能够指定默认启动的内核或者系统
  • 提供交互式接口
  • 提供启动时的密码保护

下面我们就会详细的解释一下grub.conf 这个配置文件。如下图所示,是我们自定义的grub.conf文件。

grub.conf

  • default=0 默认启动的是哪个操作系统
  • timeout=5 选择需要启动的操作系统所需要的时间,如果5秒钟之内不选的话,就启动默认内核或者操作系统
  • splashimage 启动菜单的背景 ,也就是在选择 需要启动的内核或者操作系统的界面
  • passwd 输入启动项的密码,意思就是说在看到系统启动项之后,只有输入密码才能进行命令操作,比如说进入单用户。这里配置密码的方式有多种,可以以明文的形式进行配置也可以以加密的形式进行配置。而加密的方式有两种,grub-md5-crypt,grub-crypt. 在文件中配置如下所示。
    passwd magedu
    passwd --md5 加密密码
    passwd --encrypted  加密密码  
  • hiddenmenu 隐藏选择kernel或操作系统菜单,只有出现等待界面后按下enter键才会出现。如果没有这个字段,则每次系统启动都会出现这个选择菜单。
  • title 定义需要启动的菜单,(hd0,0) 可以去掉,但是 kernel 和 initrd 两者的顺序不能颠倒,否则系统启动失败。
  • rhgb 选项可以去掉,隐藏 启动的动画界面(通常是CentOS 6 或者 CentOS 7的LOGO),直接显示字符界面,字符界面上显示的是各种服务的相关启动信息
  • quiet 默认隐藏内核的启动信息,如果去掉,启动时不光显示服务的启动信息,还显示内核的启动信息。

    如果我们隐藏了内核的启动信息,去哪里能够查看内核的启动信息呢?

cat /proc/cmdline 会显示与grub.conf 一致的内核信息。

内核引导阶段

   Kernel,内核,Kernel是Linux系统最主要的程序,实际上,Kernel的文件很小,只保留了最基本的模块,并以压缩的文件形式存储在硬盘中,当GRUB将Kernel读进内存,内存开始解压缩内核文件。讲内核启动,应该先讲下initrd这个文件,

   initrd(Initial RAM Disk),它在stage2这个步骤就被拷贝到了内存中,这个文件是在安装系统时产生的,是一个临时的根文件系统(rootfs)。因为Kernel为了精简,只保留了最基本的模块,因此,Kernel上并没有各种硬件的驱动程序,也就无法识rootfs所在的设备,故产生了initrd这个文件,该文件装载了必要的驱动模块,当Kernel启动时,可以从initrd文件中装载驱动模块,直到挂载真正的rootfs,然后将initrd从内存中移除。

   Kernel会以只读方式挂载根文件系统,当根文件系统被挂载后,开始装载第一个进程(用户空间的进程),执行/sbin/init,之后就将控制权交接给了init程序。

init 初始化阶段

   init 过程,顾名思义,就是对操作系统进行初始化的一个过程,此时操作系统内核已经在内存中加载。实际上是根据/etc/inittab(定义了系统默认运行级别)设定的动作进行脚本的执行,第一个被执行的脚本为/etc/rc.d/rc.sysinit,这个是真正的OS初始化脚本

相关的内容以及配置在图中已经有了详细的描述,此处不再详述。

综上,系统启动流程进行了大体的介绍,无奈,时间紧张,有很多地方只是简单地一笔带过。实际生产中,有些细节也很重要,包括整个启动过程中每一个环节如果出了故障应该如何修复,都是值得详细描述的知识点。以后有时间会回来重新更新补充,以图做到更好。

相关文章
|
4月前
|
网络协议 安全 Linux
Linux-Centos7学习笔记
Linux-Centos7学习笔记
43 0
|
9月前
|
监控 数据可视化 Linux
Linux(Centos7.0)下HelixServer的环境搭建
考评学生端考试中的英语考试需要传输听力,以往的传输方式是将音频文件全部传输完之后再进行播放,然而这样效率并不高,所以就引入了流媒体这个概念,所以也就有了上级领导让我在linux(Centos7.0)系统上面搭建流媒体环境的任务。
|
10月前
|
网络协议 Linux 网络安全
Linux_centos7_常用指令
Linux_centos7_常用指令
|
Linux
Linux(CentOS 7_x64位)系统下安装Xmgrace
Linux(CentOS 7_x64位)系统下安装Xmgrace
1784 0
Linux(CentOS 7_x64位)系统下安装Xmgrace
|
网络协议 Linux 网络安全
linux篇-centos7.3配置
linux篇-centos7.3配置
100 0
|
Linux 数据安全/隐私保护
【系统】[Linux]CentOS 7之安装篇-详解(2)
【系统】[Linux]CentOS 7之安装篇-详解
141 0
【系统】[Linux]CentOS 7之安装篇-详解(2)
|
Linux
【系统】[Linux]CentOS 7之安装篇-详解(1)
【系统】[Linux]CentOS 7之安装篇-详解
193 0
【系统】[Linux]CentOS 7之安装篇-详解(1)
|
Linux
Linux-CentOS系统
CentOS系统其实在我理解来看,就是免费版本的Redhat。下载了,就是从官网直接下载加可以了。
110 0
Linux-CentOS系统
|
Linux
Linux(CentOS 7_x64位)系统下安装GaussView5
Linux(CentOS 7_x64位)系统下安装GaussView5
324 0
Linux(CentOS 7_x64位)系统下安装GaussView5
|
Linux Python
Linux(CentOS 7_x64位)系统下安装ACPYPE
Linux(CentOS 7_x64位)系统下安装ACPYPE
669 0
Linux(CentOS 7_x64位)系统下安装ACPYPE