浅谈 Linux 系统启动过程

本文涉及的产品
资源编排,不限时长
无影云电脑企业版,4核8GB 120小时 1个月
无影云电脑个人版,1个月黄金款+200核时
简介: 【4月更文挑战第22天】浅谈 Linux 系统启动过程

一、前言

Linux 系统在日常工作中已经是我们朝夕相处的亲密伴侣,每次当我们按下可爱的电源键那一刻起直到出现熟悉的登陆界面。这短短的一瞬间它都经历什么?

二、Linux 启动过程

对于一台安装了 Linux 系统的主机来说,当我们按下开机按钮时一共要经历这几个阶段。

image.png

其中,每个过程都执行了自己该做的初始化部分的事情,有些过程又可分为好几个子过程。
接下来,我们就对每个阶段做一个详细分析和讲解。

三、BIOS 自检过程

稍有计算机基础的人都应该听过 BIOS(Basic Input / Output System),又称基本输入输出系统,可以视为是一个永久地记录在 ROM 中的一个软件,是操作系统输入输出管理系统的一部分。早期的 BIOS 芯片确实是"只读"的,里面的内容是用一种烧录器写入的,一旦写入就不能更改,除非更换芯片。现在的主机板都使用一种叫 Flash EPROM 的芯片来存储系统 BIOS,里面的内容可通过使用主板厂商提供的擦写程序擦除后重新写入,这样就给用户升级 BIOS 提供了极大的方便。

BIOS 的功能由两部分组成,分别是 POST 码和 Runtime 服务。POST 阶段完成后它将从存储器中被清除,而Runtime服务会被一直保留,用于目标操作系统的启动。

BIOS两个阶段所做的详细工作如下:

  • 步骤1:上电自检POST(Power-on self test),主要负责检测系统外围关键设备(如:CPU、内存、显卡、I/O、键盘鼠标等)是否正常。例如,最常见的是内存松动的情况,BIOS自检阶段会报错,系统就无法启动起来;
  • 步骤2:步骤1成功后,便会执行一段小程序用来枚举本地设备并对其初始化。这一步主要是根据我们在 BIOS 中设置的系统启动顺序来搜索用于启动系统的驱动器,如硬盘、光盘、U盘、软盘和网络等。我们以硬盘启动为例,BIOS此时去读取硬盘驱动器的第一个扇区(MBR,512字节),然后执行里面的代码。至此,BIOS 的任务就完成了,此后将系统启动的控制权移交到 MBR 部分的代码。

四、系统引导

我们首先来了解一下 MBR,它是 Master Boot Record 的缩写。硬盘的 0 柱面、0 磁头、1 扇区称为主引导扇区。它由三个部分组成,主引导程序(Bootloader)、硬盘分区表 DPT(Disk Partition table)和硬盘有效标志(55AA),其结构图如下所示:

image.png

磁盘分区表包含以下三部分:

  • Partition ID (5:延申 82:Swap 83:Linux 8e:LVM fd:RAID)
  • Partition起始磁柱
  • Partition的磁柱数量

通常情况下,诸如 lilo、grub 这些常见的引导程序都直接安装在MBR中。

我们以grub为例来分析这个引导过程

grub有两个作用:

  • 加载扇区
  • 加载内核

首先加载 /boot/grub

  • grub 加载第一个文件是 stage1,此时只能识别 ext3 系统文件。
    image.png
  • 加载完 stage1 后才能加载 stage1.5,stage1.5 有很多文件格式,当加载完 stage1.5 后能够识别其他的文件格式。

  • grub 加载 stage2 就可以看到开机画面。

  • grub 加载完 tage2 开始加载内核,首先加载 kenal

  • 内核都是模块化内核的路径是 /lib/modules/
    image.png

  • Grub 在加载内核的同时也在加载驱动文件。只有加载完驱动后才能识别硬盘。
    image.png

五、加载第一个程序

加载第一个程序 /sbin/init 加载这个程序会运行 /etc/inittab 配置文件这里主要设置了启动默认进入的级别。

一共有7个运行级别路径为 /etc/rc.d

  • 0-----关机
  • 1------单用户模式
  • 2----单用户不能用nfs
  • 3-----字符模式
  • 4------未定义
  • 5------图形界面
  • 6-----重启

我们预览下 init 脚本主要是加载各种存储介质相关的设备驱动程序。当所需的驱动程序加载完后,会创建一个根设备,然后将根文件系统 rootfs 以只读的方式挂载。这一步结束后,释放未使用的内存,转换到真正的根文件系统上面去,同时运行 /sbin/init 程序,执行系统的1号进程。此后系统的控制权就全权交给 /sbin/init 进程了。

六、初始化系统

到这里就是就快要看到曙光啦,接下来就是最后一步初始化系统。

/sbin/init 进程是系统其他所有进程的父进程,当它接管了系统的控制权之后,它首先会去读取 /etc/inittab 文件来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设置网络等。

主要包括以下工作:

  • 执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统算是基本运行起来了,后面需要进行运行级别的确定及相应服务的启动。
  • 执行/etc/rc.d/rc 脚本。该文件定义了服务启动的顺序是先 K 后 S,而具体的每个运行级别的服务状态是放在 /etc/rc.d/rc*.d(*=0~6) 目录下,所有的文件均是指向 /etc/init.d下相应文件的符号链接。rc.sysinit 通过分析 /etc/inittab 文件来确定系统的启动级别,然后才去执行 /etc/rc.d/rc*.d 下的文件。
  • /etc/init.d-> /etc/rc.d/init.d
    /etc/rc ->/etc/rc.d/rc
    /etc/rc*.d ->/etc/rc.d/rc*.d
    /etc/rc.local-> /etc/rc.d/rc.local
    /etc/rc.sysinit-> /etc/rc.d/rc.sysinit
    

也就是说,/etc 目录下的 init.d、rc、rc*.d、rc.localrc.sysinit 均是指向 /etc/rc.d 目录下相应文件和文件夹的符号链接。

执行用户自定义引导程序 /etc/rc.d/rc.local。执行 /etc/rc.d/rc3.d/S99local 时,它就是在执行 /etc/rc.d/rc.local。S99local 是指向 rc.local 的符号链接。就是一般来说,自定义的程序不需要执行上面所说的繁琐的建立 shell 增加链接文件的步骤,只需要将命令放在 rc.local 里面就可以了,这个 shell 脚本就是保留给用户自定义启动内容的。

  • 完成了系统所有的启动任务后,Linux 会启动终端或 X-Window· 来等待用户登录。tty1,tty2,tty3...这表示在运行等级1,2,3,4 的时候,都会执行 /sbin/mingetty,而且执行了 6 个,所以 Linux 会有 6 个纯文本终端,mingetty 就是启动终端的命令。
  • 除了这 6 个之外还会执行 /etc/X11/prefdm-nodaemon 这个主要启动 X-Window

至此,系统就启动完毕了。

目录
相关文章
|
2月前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
102 3
|
2月前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
84 2
|
16天前
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
146 78
|
20天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
53 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
2月前
|
缓存 Java Linux
如何解决 Linux 系统中内存使用量耗尽的问题?
如何解决 Linux 系统中内存使用量耗尽的问题?
149 48
|
16天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
79 13
|
30天前
|
搜索推荐 Linux
深入理解Linux操作系统的启动过程
本文旨在揭示Linux操作系统从开机到完全启动的神秘面纱,通过逐步解析BIOS、引导加载程序、内核初始化等关键步骤,帮助读者建立对Linux启动流程的清晰认识。我们将探讨如何自定义和优化这一过程,以实现更高效、更稳定的系统运行。
|
2月前
|
Ubuntu Linux 网络安全
linux系统ubuntu中在命令行中打开图形界面的文件夹
在Ubuntu系统中,通过命令行打开图形界面的文件夹是一个高效且实用的操作。无论是使用Nautilus、Dolphin还是Thunar,都可以根据具体桌面环境选择合适的文件管理器。通过上述命令和方法,可以简化日常工作,提高效率。同时,解决权限问题和图形界面问题也能确保操作的顺利进行。掌握这些技巧,可以使Linux操作更加便捷和灵活。
49 3
|
16天前
|
Ubuntu Linux C++
Win10系统上直接使用linux子系统教程(仅需五步!超简单,快速上手)
本文介绍了如何在Windows 10上安装并使用Linux子系统。首先,通过应用商店安装Windows Terminal和Linux系统(如Ubuntu)。接着,在控制面板中启用“适用于Linux的Windows子系统”并重启电脑。最后,在Windows Terminal中选择安装的Linux系统即可开始使用。文中还提供了注意事项和进一步配置的链接。
39 0
|
2月前
|
存储 运维 Linux
如何在 Linux 系统中使用 envsubst 命令替换环境变量?
`envsubst` 是 Linux 系统中用于替换文本中环境变量值的实用工具。本文分三部分介绍其工作原理、使用方法及实际应用,包括配置文件替换、脚本执行中环境变量替换和动态生成文件等场景,帮助用户高效利用 `envsubst` 进行开发和运维工作。
72 4