专栏首页北京马哥教育史上最详细linux启动过程讲解---没有之一

史上最详细linux启动过程讲解---没有之一

对于linux系统的初学者来说,理解并掌握linux系统启动流程能够使你够深入的理解linux系统,还可以通过系统的启动过程来分析问题解决问题。 Linux系统的启动流程


关于linux系统的启动流程可以分为以下步骤: POST(加电自检)–>加载BIOS(Basic Input/Outpu System)–>确定启动设备(Boot sequence)、加载Boot Loader–>加载内核(kernel)初始化initrd–>运行/sbin/init初始化系统–>打印用户登录提示符 下面让我们逐步剖析说明系统启动过程: 1、POST开机自检 linux开机加电后,系统开始开机自 检,该过程主要对计算机各种硬件设备进行检测,如CPU、内存、主板、硬盘、CMOS芯片等,如果出现致命故障则停机,并且由于初始化过程还没完成,所以 不会出现任何提示信号;如果出现一般故障则会发出声音等提示信号,等待故障清除;若未出现故障,加电自检完成。 2、开机自检完成,查找可启动设备,加载主引导目录(MBR) 开机自检完成后,CPU首先读取位于CMOS中的BIOS程序,按照BIOS中设定的启动次序(Boot Sequence)逐一查找可启动设备,找到可启动的设备后,去该设备的第一个扇区 中读取MBR,那么MBR是什么哪?它又有什么作用哪? MBR存在于可启动磁盘的0磁道0扇区,占用512字节,它主要用来告诉计算机从选定的可启动设备的哪个分区来加载引导加载程序(Boot loader),MBR中存在如下内容: (1) Boot Loader 占用446字节,存储有操作系统(OS)相关信息,如操作系统名称,操作系统内核位置等,它的主要功能是加载内核到内存中运行。 (2) Partition Table 分区表,占用64字节,每个主分区占用16字节(这就是为啥一块硬盘只能有4个主分区啦^_^) (3)分区表有效性标记占用2字节 CPU将MBR读取至内存,运行GRUB(Boot Loader常用的有GRUB和LILO两种,现在常用的是GRUB),GRUB会把内核加载到内存去执行。

由上图可以看出,内核文件存在于/boot目录下,但是在GRUB加载内核时,连/还没有被加载,它是怎么在磁盘上找到内核的哪?我们来查看一下GRUB的配置文件可以找到答案。

在/boot/grub/grub.conf中可以看到 root (hd0,0)这一行实际上是指定了/目录的所在的位置,但这个根并不是真正的根,而是/所在的位置,可以理解成/boot是处在(hd0,0) /boot,而这里的(hd0,0)指的是第一个磁盘的第一个分区,GRUB不是通过文件系统来访问内核的,以因为此时内核还没有启动,不存在文件系统, 而是直接访问 第一个磁盘的第一个分区(通过MBR中的分区表来识别分区),而识别MBR中的分区的文件系统,则是由GRUB通过加载自身携带的系统文件来实现的,这 些文件在/boot/grub目录中

大家可以看到,红色标出的地方就是GRUB可以识别的文件系统的类型了。事实上,总结一下,grub启动过程可以分为两个步骤: 第1阶段 BIOS加载MBR中的GRUB(GRUB第一阶段的文件),而GRUB只有446字节,无法实现太多功能,所以利用该阶段的文件去加载1.5阶段的文件(/boot/grub/下的文 件) 第1.5阶段 用来加载识别文件系统的文件,识别完系统后才可以找到/boot目录。 第2阶段 寻找内核并加载到内存中。 下图是GRUB启动过程中所用的的文件

3、加载内核,初始化initrd GRUB把内核加载到内存后展开并运行, 此时GRUB的任务已经完成,接下来内核将会接管并完成 探测硬件–>加载驱动–>挂载根文件系统–>切换至根文件系统(rootfs)–>运行/sbin/init完成系统初始化。但 是,问题来了,要访问根文件系统必须要加载根文件系统所在的设备,而这时根文件系统又没有挂载,要挂载根文件系统有需要根文件系统的驱动程序,这是一个典 型的先有鸡先有蛋的问题啊!为解决这个问题,GRUB在加载内核同时,也把initrd加载到内存中并运行,那么initr又起到了什么作用哪?

initrd展开后的文件

linux中/下的文件

我们可以看到,其实initrd文件其实是一个虚拟的根文件系统,里面有bin、lib、lib64、sys、var、etc、sysroot、 dev、proc、tmp等根目录,它的功能就是讲内核与真正的根建立联系,内核通过它加载根文件系统的驱动程序,然后以读写方式挂载根文件系统,至此, 内核加载完成。 4、运行/sbin/init,进行系统初始化 内核并加载进内存运行并以读写方式挂载完根文件系统后,执行第一个用户进程init,init首先运行/etc/init/rcS.conf脚本,如下图

可以看到,init进程通过执行/etc/rc.d/rcS.conf首先调用了/etc/rc.d/rc.sysinit,对系统做初始化设置,我们来看看这个脚本都是做了些什么哪?

事实上init执行/etc/rc.d/rc.sysinit的初始化将会做很多设置: 1、获得网络环境 2、挂载设备 3、开机启动画面Plymouth(取替了过往的 RHGB) 4、判断是否启用SELinux 5、显示于开机过程中的欢迎画面 6、初始化硬件 7、用户自定义模块的加载 8、配置内核的参数 9、设置主机名 10、同步存储器 11、设备映射器及相关的初始化 12、初始化软件磁盘阵列(RAID) 13、初始化 LVM 的文件系统功能 14、检验磁盘文件系统(fsck) 15、设置磁盘配额(quota) 16、重新以可读写模式挂载系统磁盘 17、更新quota(非必要) 18、启动系统虚拟随机数生成器 19、配置机器(非必要) 20、清除开机过程当中的临时文件 21、创建ICE目录 22、启动交换分区(swap) 23、将开机信息写入/var/log/dmesg文件中 init执行完/etc/rc.d/rc.sysinit后,将会执行/etc/inittab来设定系统运行的默认级别:

如上图,linux中共有[0-6]七个运行级别,而我自己系统的默认运行级别是3. 设定玩系统默认运行级别以后,接着调用/etc/rc.d/rc脚本,这个脚本接收默认运行级别参数后,依脚本设置启用或停止/etc/rc.d/rc[0-6].d/中相应的程序,如下图,看一下我系统运行默认级别(级别)3下的内容吧

如图示,/etc/rc.d/rc[0-6].d/下的文件在系统初始化阶段,以S开头的将被启动,以K开头的将被关闭,文件名K/S 后面的的数字代表优先级,数字越小优先级越高,优先执行。 最后,将执行/etc/rc.d/rc.local脚本,可以根据自己的需求将一些执行命令或者脚本写到其中,当开机时就可以加载。 5、打印登录提示符 系统初始化完成后,init给出用户登 录提示符(login)或者图形化登录界面,用户输入用户和密码登陆后,系统会为用户分配一个用户ID(uid)和组ID(gid),这两个ID是用户的 身份标识,用于检测用户运行程序时的身份验证。登录成功后,整个系统启动流程运行完毕! 、

本文分享自微信公众号 - 马哥Linux运维(magedu-Linux),作者:马帮学员-安静

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-05-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux kernel 的设计是否已经过时?

    Linux 多年来取得的成绩毋庸多言。但最近,reddit 上有人发起了一个话题,想知道 Linux 的内核设计是否已经过时,并得到了一些有趣的答案。 这位 ...

    小小科
  • CentOS系统启动流程你懂否

    一、Linux内核的组成 相关概念: Linux系统的组成部分:内核+根文件系统 内核:进程管理、内存管理、网络协议栈、文件系统、驱动程序。 ...

    小小科
  • 在Linux环境下如何使用XFS文件系统

    XfS文件系统是SGI开发的高级日志文件系统,XFS极具伸缩性,非常健壮。所幸的是SGI将其移植到了Linux系统中。在linux环境下。目前版本可用的最新XF...

    小小科
  • 完美收官!“游云南929”探索文旅消费新模式

    ? 10月8日,随着国庆黄金周的结束,持续一个月的“游云南929”活动完美收官。 ? 此次“游云南929”文旅节相对去年全面升级,以“自在云南,全新发现”为主...

    腾讯文旅
  • Nodejs+socket.io搭建WebRTC信令服务器

    我们在学习 WebRTC 时,首先要把实验环境搭建好,这样我们就可以在上面做各种实验了。

    音视频_李超
  • 一个漏洞为何能影响数千万服务器以及66%安卓手机?

    安全研究团队Perception Point发现Linux系统内核中存在一个高危级别的本地权限提升0day漏洞,编号为CVE-2016-0728。目前有超过66...

    FB客服
  • 人民日报:云南力推旅游产业转型升级

    ? 前几年,“不合理低价游”带来的种种乱象,将云南旅游一次次推到舆论的风口浪尖。寄生于“低价游、高价购”模式上的既得利益者,织成一张盘根错节、纵横交织的“网”...

    腾讯文旅
  • 程序员必备:Java日期处理的十个坑

    我们设置了10小时,但运行结果是22点,而不是10点。因为Calendar.HOUR默认是按12小时制处理的,需要使用Calendar.HOUROFDAY,因为...

    捡田螺的小男孩
  • centos 7安装jdk并封装service服务

    有一个Spring Cloud的jar包,文件名为:RDS.jar。必须要jdk1.8版本,需要部署在 Centos 7.5的服务器上面,最好能设置开机自启动!

    py3study
  • Java日期处理易踩的十个坑

      我们设置了10小时,但运行结果是22点,而不是10点。因为Calendar.HOUR默认是按12小时制处理的,需要使用Calendar.HOUR_OF_DA...

    不会飞的小鸟

扫码关注云+社区

领取腾讯云代金券