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

[经验分享] Linux的启动流程(CentOS 6)

[复制链接]

尚未签到

发表于 2018-4-21 10:05:58 | 显示全部楼层 |阅读模式
前言
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
先来看一张图
可以图片上点击右键,选择在新的标签页中打开,这样可以查看大图。此图为笔者根据参考资料重制,转载请注明出处。
DSC0000.png
这张图大体上描述了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 文件,系统能够正常启动吗?
DSC0001.gif
仅仅保留 grub.conf 在启动过程发生的错误,提示信息如下图所示
DSC0002.png
stage 1阶段
系统进入到MBR阶段中,就会直接将磁盘的前446字节读入内存中,也就是BootLoader。stage 1阶段就是指的这一段。
stage 1 阶段的任务非常简单,就是将硬盘中的这446个字节读入内存中,并解析,然后为下一个阶段做好准备。
实验 如果Stage1 阶段被破坏了,如何修复启动?
前面我们说过,Stage1 主要位于BootLoader 中,也就是硬盘的第0个磁道的第一个扇区的前446个字节,那么我们只要将446个字节破坏掉了就可以模拟这个实验。先看下面一个动图。
DSC0003.gif
从图中可以看到,这时系统会直接进入救援模式。因为系统找不到找不到硬盘启动代码。所以我们就进入到救援模式,进行一系列的救援操作。
DSC0004.gif
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文件。
DSC0005.png


  •   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初始化脚本 相关的内容以及配置在图中已经有了详细的描述,此处不再详述。
综上,系统启动流程进行了大体的介绍,无奈,时间紧张,有很多地方只是简单地一笔带过。实际生产中,有些细节也很重要,包括整个启动过程中每一个环节如果出了故障应该如何修复,都是值得详细描述的知识点。以后有时间会回来重新更新补充,以图做到更好。
  

  

  个人博客地址:http://www.pojun.tech/ 欢迎访问

运维网声明 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-449916-1-1.html 上篇帖子: CentOS6安装salt 下篇帖子: Linux的启动流程(CentOS 7)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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