干货分享 | Systemd 技术原理&实践(下)

本文详细介绍了 systemd 的开机启动流程,包括 BIOS 自检、GRUB 引导、kernel 内核加载、initrd 虚拟根文件系统、systemd 初始化以及终端登录阶段。通过理解这些阶段,有助于优化系统资源。文章还列举了 systemd 的常用命令,帮助读者更好地管理和控制系统。

关注优麒麟,更多干货等着你!

systemd 文章续集来啦,上期我们介绍了 systemd 的基本概念 ,本期就为大家详细讲解 systemd 相关的运行逻辑,希望能对研究系统资源优化的优客有所帮助。

systemd 时代的开机启动流程

在 systemd 作为系统的 init 程序的时代下,Linux 系统的启动流程可以大致分为 6 个阶段:BIOS 自检阶段、GRUB 引导阶段、kernel 内核加载阶段、initrd 虚拟根文件系统阶段、systemd 初始化阶段、终端登录阶段。每个阶段都各司其职,为下一个阶段的进行做铺垫,相互联系,缺一不可。接下来对每个阶段做一下介绍:

1

BIOS 自检阶段

从我们启动计算机从按下电源键开始,计算机开始通电,然后系统就开始加载主板内存上的第一段代码:BIOS,系统进入 BIOS 自检阶段。

BIOS 为基本输入输出系统,全称 Basic Input Output System,它烧录在主板的内存上,其中的内容只能读不能改,如果要进行更改只能重新烧录到主板的内存上。BIOS 在开机阶段最主要的功能为上电自检,它会对主板上接入的硬件设备一个个进行检查,例如检查 CPU、主板、内存、软硬盘系统、键盘、光驱等等硬件是否接入正常,有无故障,当某一些主要的硬件(例如 CPU、内存等)出现问题时,BIOS 就会报错,无法继续启动系统。我们在启动电脑时听到的滴滴的声音就是 BIOS 蜂鸣器发出的声音,当硬件出问题的时候就可以听到它蜂鸣器响两到三声报错,系统就无法进行下一步的启动。

BIOS 检查完所有硬件状态并状态无误的时候,就会按照设置的启动顺序去找相应的启动盘,然后引导系统进入相应的启动盘继续启动系统。有过刷机经验的朋友应该知道在系统启动时按 F12 或者 delete 键就会进入 BIOS 界面,然后就会去选择相应的启动盘进行刷机,启动盘可以是装机 U 盘、光驱,也可以是已经装了系统的磁盘等等,BIOS 可以设置默认的启动顺序,例如:可以设置 U 盘为第一启动项,开机启动时 BIOS 就会引导系统去找 U 盘对应的硬件接口,当找不到 U 盘时,BIOS 会继续尝试第二启动项,当选择好了启动项时,系统进入相应的启动盘,并开始执行启动盘中第一块磁盘第一个扇区的代码,至此 BIOS 自检阶段结束。

2

GRUB 引导阶段

GRUB 是 GRand Unified Bootloader 的缩写,它是一个多重操作系统的管理器,存放在第一个磁盘的第一个扇区的主引导扇区里面,如果你的电脑里面装了多个系统,例如 Linux 系统和 Windows 系统,那么你可以通过 GRUB 来移动光标选择自己想要进入的系统,选择好系统以后 GRUB 就会根据系统分区表里找到对应系统所在的磁盘分区,加载相应的 grub.cfg 配置文件,通过配置文件,加载 /boot 分区的文件系统驱动,然后在文件系统中找到系统内核,把内核加载进来并启动,最后把系统的控制权交给内核,至此 GRUB 引导阶段结束。

GRUB 除了引导系统这一主要功能外,还可以通过 grub.cfg 配置文件来实现其他的一些功能。grub.cfg 配置文件存放在 /boot/grub/目录下,配置文件中,Linux 参数表示系统启动时对应加载的内核,当系统里存放了多个内核、或者在你电脑上重新修改编译了新的内核的时候,可以配置此项来选择相应的内核进行加载;quiet 参数类似于 loglevel 参数,用来配置日志启动的等级;splash 参数用来配置相应的启动动画等等。

3

Kernel 内核加载阶段

在讲解内核的启动之前,先简单介绍一下 Linux 内核。Linux 内核是一种宏内核,运行在单一地址空间的单一的程序,把系统的进程线程管理、内存管理、文件系统、驱动管理、网络管理等一些基本功能集

<think>我们正在讨论systemd原理。根据用户提供的引用材料,特别是引用[2]中提到的“systemd 时代的开机启动流程”和引用[3]中提供的多个资源(包括IBM的分析文章和鸟哥的Linux私房菜),我们可以系统地解释systemd的工作原理systemd原理可以从以下几个方面进行阐述: 1. **设计目标**:为了解决传统SysVinit的启动速度慢、脚本复杂、依赖管理弱等问题,systemd的设计目标包括提高启动速度(并行启动服务)、简化服务管理、提供强大的依赖关系管理。 2. **架构核心**:systemd采用基于单元(unit)的架构,每个单元代表一个系统资源(服务、套接字、挂载点等)。单元之间通过依赖关系构成有向无环图(DAG),从而实现并行启动。 3. **关键技术**: - **套接字激活(Socket Activation)**:服务在第一次被请求时才启动,减少系统启动时的负担。 - **总线激活(D-Bus Activation)**:类似于套接字激活,适用于D-Bus服务。 - **利用Linux内核特性**:如cgroups(用于进程跟踪和资源控制)、namespaces(用于容器隔离)等。 4. **启动流程**: - 内核加载并启动systemd(作为PID=1的进程) - systemd解析默认目标(target),通常是`graphical.target`或`multi-user.target` - 根据目标单元的依赖关系,并行启动所有依赖单元 - 在启动过程中,处理套接字激活、文件系统挂载、定时器等 5. **依赖管理**:systemd通过单元文件中的`[Unit]`节定义依赖关系,如: - `Requires`:强依赖,如果依赖单元启动失败,当前单元也会失败 - `Wants`:弱依赖,即使依赖单元失败也不影响当前单元 - `After`:定义启动顺序 6. **事件驱动**:systemd采用事件驱动机制,当某个单元的状态发生变化(如激活、失败)时,会触发依赖它的单元的动作。 现在,我们将按照用户要求的格式,使用LaTeX公式(例如描述依赖关系图)、代码块(示例单元文件)来组织回答,并生成相关问题。 注意:数学公式主要用于表达依赖关系图(使用图论符号)或资源管理(如cgroups的权重分配)。 </think>### Systemd 工作原理详解 SystemdLinux 系统的核心初始化系统和服务管理器,其设计原理围绕**并行化**、**依赖驱动**和**事件触发**三大核心思想。以下是其关键原理: #### 1. **单元依赖图(Unit Dependency Graph)** Systemd 将所有系统资源抽象为**单元**(服务、挂载点、套接字等),通过依赖关系构建有向无环图(DAG): $$ \text{目标单元} \rightarrow \text{服务单元} \rightarrow \text{依赖单元} $$ - **依赖类型**: - `Requires`(强依赖):依赖单元失败则当前单元失败 - `Wants`(弱依赖):依赖单元失败不影响当前单元 - `After`/`Before`(时序控制) ```ini # 示例:Nginx 服务依赖网络(network.target) [Unit] Description=Nginx Web Server After=network.target # 网络就绪后才启动 Requires=network.target ``` #### 2. **Socket-Based 按需激活** 通过套接字监听实现服务延迟启动: 1. 创建 `/run/nginx.sock` 套接字单元 2. 客户端连接套接字时触发 `nginx.service` 启动 3. 服务处理请求后自动休眠(节省资源) ```bash $ systemctl status nginx.socket # 查看套接字激活状态 ``` #### 3. **并行启动机制** 通过依赖图分析实现最大并行度: 1. 拓扑排序所有单元 2. 识别无依赖的单元立即启动 3. 动态解决依赖冲突(如互斥服务) > 相比传统 SysVinit 串行启动,速度提升 30-50%[^2] #### 4. **资源隔离与控制组(cgroups)** 所有进程纳入 cgroups 层级管理: - **资源限制**:CPU/内存配额 - **进程跟踪**:精确管理服务树 - **沙箱隔离**:`PrivateTmp=true` 隔离临时目录 ```bash $ systemd-cgls # 查看 cgroups 层级 ``` #### 5. **事务性操作** 关键操作具备原子性: - 启动服务前预检查依赖 - 失败时自动回滚到安全状态 - 通过日志快照(Journal)记录操作序列 ```bash $ journalctl --list-boots # 查看启动日志序列 ``` #### 6. **目标(Target)协调系统状态** 类似 SysVinit 的运行级别,但支持动态切换: | 目标 | 作用 | |---------------|------------------------| | `graphical.target` | 图形界面模式 | | `multi-user.target`| 多用户命令行模式 | | `emergency.target` | 紧急恢复模式 | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值