前言
Linux启动的过程在实际生产中有着至关重要的作用。试想一下,如果我们在实际生产中服务器因为某一个服务出了问题,而不能启动,这时我们应该怎么办。如果我们了解Linux的详细启动过程,知道是在哪一个环节出了问题,我们就能够进入到相应的环节,排除掉相应的问题,从而解决实际生产中的问题。
同时,我们在这里提出一个问题,有谁知道Windows的启动过程呢?如果启动过程出了问题,我们该怎么办呢?恐怕答案只有重启系统了吧……
Linux 系统的启动过程对于管理员来说是完全透明的,了解了Linux的启动过程,就好像有了透视眼一样,能够清楚的了解Linux的一切。知道了这些,不仅能够解决实际生产中的问题,更能够自己来制作Linux,自己定制Linux了,总之Linux大法好……
写在前面(最重要)
本文部分资料参考了以下博文。
- Linux Booting Process steps – RHEL/CentOS 7
- http://www.linuxidc.com/Linux/2014-03/97862.htm
- http://www.cnblogs.com/zengkefu/p/5559058.html
先来看一张图
可以图片上点击右键,选择在新的标签页中打开,这样可以查看大图。此图为笔者根据参考资料重制,转载请注明出处。
这张图大体上描述了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 在启动过程发生的错误,提示信息如下图所示
stage 1阶段
系统进入到MBR阶段中,就会直接将磁盘的前446字节读入内存中,也就是BootLoader。stage 1阶段就是指的这一段。
stage 1 阶段的任务非常简单,就是将硬盘中的这446个字节读入内存中,并解析,然后为下一个阶段做好准备。
实验 如果Stage1 阶段被破坏了,如何修复启动?
前面我们说过,Stage1 主要位于BootLoader 中,也就是硬盘的第0个磁道的第一个扇区的前446个字节,那么我们只要将446个字节破坏掉了就可以模拟这个实验。先看下面一个动图。
从图中可以看到,这时系统会直接进入救援模式。因为系统找不到找不到硬盘启动代码。所以我们就进入到救援模式,进行一系列的救援操作。
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文件。
- 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初始化脚本
相关的内容以及配置在图中已经有了详细的描述,此处不再详述。
综上,系统启动流程进行了大体的介绍,无奈,时间紧张,有很多地方只是简单地一笔带过。实际生产中,有些细节也很重要,包括整个启动过程中每一个环节如果出了故障应该如何修复,都是值得详细描述的知识点。以后有时间会回来重新更新补充,以图做到更好。