LinuxZone

LinuxZone.net
Linux系统网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

Linux系统的启动流程关于linux系统启动过程的分析问题

2023年8月14日 429点热度

阐述:

1.开机BIOS自检

2.MBR引导

3.grub引导菜单

4.加载内核kernel

5.启动init进程

6.读取inittab文件,执行rc.sysinit,rc等脚本

7.启动mingetty,步入系统登入界面

来个简图:

超详尽描述linux系统从开机到登录界面的启动过程

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

Linux系统的启动流程

关于linux系统的启动流程可以分为以下步骤:

POST(加电自检)–>加载BIOS(BasicInput/OutpuSystem)–>确定启动设备(Bootsequence)、加载BootLoader–>加载内核(kernel)初始化initrd–>运行/sbin/init初始化系统–>复印用户登入提示符

下边让我们逐渐分析说明系统启动过程:

1、POST开机自检

linux开机加电后,系统开始开机自检,该过程主要对计算机各类硬件设备进行检查linux系统重新启动,如CPU、内存、主板、硬盘、CMOS芯片等,假若出现致命故障则停机,但是因为初始化过程还没完成,所以不会出现任何提示讯号;若果出现通常故障则会发出声音等提示讯号,等待故障消除;若未出现故障,加电自检完成。

2、开机自检完成,查找可启动设备,加载主引导目录(MBR)

开机自检完成后,CPU首先读取坐落CMOS中的BIOS程序,根据BIOS中设定的启动顺序(BootSequence)逐一查找可启动设备,找到可启动的设备后,去该设备的第一个磁道中读取MBR,这么MBR是哪些哪?它又有哪些作用哪?

MBR存在于可启动c盘的0扇区0磁道,占用512字节,它主要拿来告诉计算机从选取的可启动设备的那个分区来加载引导加载程序(Bootloader),MBR中存在如下内容:

(1)BootLoader占用446字节,储存有操作系统(OS)相关信息,如操作系统名称,操作系统内核位置等,它的主要功能是加载内核到显存中运行。

(2)PartitionTable分区表,占用64字节,每位主分区占用16字节(这就是为什么一块硬碟只能有4个主分区啦^_^)

(3)分区表有效性标记占用2字节

CPU将MBR读取至显存,运行GRUB(BootLoader常用的有GRUB和LILO两种,如今常用的是GRUB),GRUB会把内核加载到显存去执行。

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

启动系统零部件_启动系统零故障_linux系统重新启动

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

启动系统零部件_启动系统零故障_linux系统重新启动

你们可以看见,白色标出的地方就是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完成系统初始化。并且,问题来了,要访问根文件系统必需要加载根文件系统所在的设备,而这时根文件系统又没有挂载,要挂载根文件系统有须要根文件系统的驱动程序,这是一个典型的先有鸡先有蛋的问题啊!为解决这个问题linux移植,GRUB在加载内核同时,也把initrd加载到显存中并运行,这么initr又起到了哪些作用哪?

initrd展开后的文件

linux系统重新启动_启动系统零故障_启动系统零部件

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,对系统做初始化设置linux视频,我们来瞧瞧这个脚本都是做了些哪些哪?

事实上init执行/etc/rc.d/rc.sysinit的初始化将会做好多设置:

1、获得网路环境

2、挂载设备

3、开机启动画面Plymouth(取替了过往的RHGB)

启动系统零故障_linux系统重新启动_启动系统零部件

4、判断是否启用SELinux

5、显示于开机过程中的欢迎画面

6、初始化硬件

7、用户自定义模块的加载

8、配置内核的参数

9、设置主机名

10、同步储存器

11、设备映射器及相关的初始化

12、初始化软件c盘阵列(RAID)

13、初始化LVM的文件系统功能

14、检验c盘文件系统(fsck)

15、设置c盘配额(quota)

16、重新以可读写模式挂载系统c盘

启动系统零故障_启动系统零部件_linux系统重新启动

17、更新quota(非必要)

18、启动系统虚拟随机数生成器

19、配置机器(非必要)

20、清除开机过程当中的临时文件

21、创建ICE目录

22、启动交换分区(swap)

23、将开机信息写入/var/log/dmesg文件中

init执行完/etc/rc.d/rc.sysinit后,将会执行/etc/inittab来设定系统运行的默认级别:

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

启动系统零部件_启动系统零故障_linux系统重新启动

如图示,/etc/rc.d/rc[0-6].d/下的文件在系统初始化阶段,以S开头的将被启动,以K开头的将被关掉,文件名K/S前面的的数字代表优先级,数字越小优先级越高,优先执行。

最后,将执行/etc/rc.d/rc.local脚本,可以按照自己的需求将一些执行命令或则脚本讲到其中,当开机时就可以加载。

5、打印登陆提示符

系统初始化完成后,init给出用户登入提示符(login)或则图形化登入界面,用户输入用户和密码登录后,系统会为用户分配一个用户ID(uid)和组ID(gid),这两个ID是用户的身分标示,用于测量用户运行程序时的身分验证。登陆成功后,整个系统启动流程运行完毕!

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 内核 分区 初始 加载 开机
最后更新:2023年8月14日

Linux系统网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

Linux系统网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
Linux内核中的系统调用的标准表示可移植操作系统接口 分区和目录中创建的文件数量有限制 网络攻防干货:显示文件的前10行知识点详解 :Access访问时间函数讲解文件:#include定义函数 嵌入式Linux系统组成部分部分64移植过程 Linux中的文件时间属性可以使用stat命令命令查看 linux 命令 操作系统版本 中标麒麟-内核Linux银河麒麟内核 linux内核移植的主要模块(或组件) Ubuntu下终端默认字体,看起来很舒畅,蛮漂亮的 Linux设备树编译:内核中的dtc工具 服务器配置进行域名解析及域名的解析与解析 安装完linuxredhat5.4,打开浏览器发现显示中文全部成了乱码 linux下mysql英文乱码解决方式(2008-08-22) ubuntu字体安装方法,超实用!!(附详细教程) Linux下USB转串口DB9(RS232)和转换线 Linux上部署Web应用程序时非常常见的做法虚拟主机 (Linux基础知识)Linux用户权限管理 关于Linux发行版本的详细信息和架构信息的说明书 Linux操作系统安装Linux系统的镜像文件导入进去的应用 基于Linux的驱动开发:远见品质Linux内核与品质
Linux上部署Web应用程序时非常常见的做法虚拟主机Linux下USB转串口DB9(RS232)和转换线ubuntu字体安装方法,超实用!!(附详细教程)linux下mysql英文乱码解决方式(2008-08-22)安装完linuxredhat5.4,打开浏览器发现显示中文全部成了乱码服务器配置进行域名解析及域名的解析与解析Linux设备树编译:内核中的dtc工具Ubuntu下终端默认字体,看起来很舒畅,蛮漂亮的linux内核移植的主要模块(或组件)linux 命令 操作系统版本 中标麒麟-内核Linux银河麒麟内核Linux中的文件时间属性可以使用stat命令命令查看嵌入式Linux系统组成部分部分64移植过程:Access访问时间函数讲解文件:#include定义函数网络攻防干货:显示文件的前10行知识点详解分区和目录中创建的文件数量有限制Linux内核中的系统调用的标准表示可移植操作系统接口SHELL编程中使用变量的实验原理和使用技巧和技巧Linux服务器出现CPU负载达到100%居高不下的情况Java代码运行步骤及文档说明--Java代码动态规划软链接使用指令ln-s指令创建软连接文件操作系统
(亿速云网站)如何处理“”的有关知识 嵌入式Linux基础教程(第2版)-高级驱动教程 如何在Linux下查看系统版本的命令? linux内核与驱动 2016年10月12日托福考试真题及答案解析 如何查看less文件的地址和统计文件? Linux系统下如何创建用户并查看当前系统登陆用户的教程 (Linux基础知识)Linux系统查找文件的详细内容介绍 关于Linux内核邮件列表(LKML)中的编写方法和方法 AmericanMegatrendsU盘启动相对轻松易行,只需下载Megatrends 如何创建和安装Kvaser操作系统的最新长期支持版本14.04.3 Java常见的端口号列表:ps命令详解 Linux内核裁剪——无模块支持(title-引导条) 如何搭建一个Linux云服务器?介绍如何从零开始,以最简单的方式搭建 故渊发布补丁集减少编译Linux内核时的最大内存使用量 Linuxdevicedriver的概念系统调用是怎么样的呢? Linux下的其它服务都可以用以上执行开启和关闭操作 (Linux基础知识)shell+history方式设置远程执行命令 Linux内核的内存子系统映射的漏洞及解决办法 Linux下创建用户的创建服务服务 如何设置GNOME的TrueType中文字体,不可同时使用!
标签聚合
linux服务器 操作 软件 内核 应用 目录 文件目录 linux系统 文件 命令
书籍
课程
技术群
技术干货大合集↓
  • 2023年12月 / 28篇
  • 2023年11月 / 89篇
  • 2023年10月 / 94篇
  • 2023年9月 / 90篇
  • 2023年8月 / 92篇
  • 2023年7月 / 96篇
  • 2023年6月 / 91篇
  • 2023年5月 / 93篇
  • 2023年4月 / 91篇
  • 2023年3月 / 69篇
友情链接:

Linux书籍 | Linux命令 | Linux系统 | RHCE红帽认证 | Linux软件 | Linux教程 | CentOS系统 | Linux内核 | Linux服务器 | Linux大神 | IT资源 | Linux系统

COPYRIGHT © 2024 LinuxZone.net ALL RIGHTS RESERVED.