关注优麒麟,更多干货等着你!
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 当硬件出现问题时,蜂鸣器发出的声音可以听到蜂鸣器响两到三次报错,系统无法启动下一步。
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 内核是一种在单个地址空间中运行的宏内核的单一程序,集中了系统的过程线程管理、内存管理、文件系统、驱动管理、网络管理等基本功能。内核中的每个函数都可以访问内核的其他部分,不同于微内核(代表:Windows 微内核是将这些功能独立划分为不同的服务,通过通信接口与中心内核通信服务。
在结束了 GRUB 在指导阶段,核心获得系统控制后,首先开始初始化系统中各种设备的相关配置,包括 CPU、I/O 设备、存储设备的初始化等,其次,核心创建核心状态 kernel_init 然后找到过程 initrd 并解压文件,加载 initrd 虚拟根文件系统中的驱动程序完成相关硬件的初始化,最后调用 initrd 虚拟根文件系统 init 到目前为止,内核在系统启动过程中的作用已经基本完成,内核开始等待 initrd 执行 init 内核加载阶段结束。
4
Initrd 虚拟根文件系统阶段
initrd(Initial RAM Disk)它是一个虚拟的根文件系统 GRUB 复制到内存阶段,在内核中解压,是一个临时的虚拟根文件系统,解压后,可以看到其目录结构与实际根文件系统相似,并包含了一些驱动程序。下图为解压麒麟 initrd.img 5.4.18-32 虚拟根文件系统的目录结构:
为了简化内核,只保留了最基本的模块,所以没有各种设备硬件驱动程序,这些驱动程序存储在中 initrd 内核启动时,从内核开始 initrd 在虚拟根文件系统中加载必要的驱动模块,完成硬件的初始化。 init 即虚拟根文件系统下的程序 systemd 程序,systemd 作为核心子程序,获得了系统的控制权,开始做一些系统初始化的工作。
通过以上描述,可以概括虚拟根文件系统的阶段大致可以分为内核加载 initrd 驱动程序在虚拟根文件系统下, systemd 因此,虚拟根文件系统的阶段也可以分别归类为内核加载阶段和程序加载阶段 systemd 初始化阶段是与上下两个阶段重叠的阶段。此外,initrd 它还提供了美化启动图形界面的功能,统启动过程中的功能 log 提高用户体验的日志输出。此外,initrd 它还提供了美化启动图形界面的功能,统启动过程中的功能 log 提高用户体验的日志输出。 initrd 下的 systemd 当环境初始化完成,系统切换到真正的根文件系统时,initrd 阶段结束。
5
systemd 初始化阶段
systemd 是 system deamon 简称,是一个 Linux 系统基本组件的集合提供了系统和服务的管理 pid 为 1 的 init 过程是所有过程的父亲过程。需要详细了解 systemd 小伙伴可以阅读上一篇文章:systemd 这里重点介绍一下 systemd 启动过程中所做的。
通过前面的描述,我们可以 systemd 分为虚拟根文件系统和实根文件系统两个阶段。内核通过解压 initrd 获取虚拟根文件系统执行虚拟根文件系统 init 程序来启动 systemd,systemd 在虚拟根文件系统下,子过程作为核心开始运行。在虚拟根文件下 systemd 首先,检查当前系统,如判断系统的运行状态 user 态还是 system 状态、系统是正常启动状态还是异常错误后的重启状态等,然后进行一些系统的初始配置,包括:环境变量配置、日志相关配置等,然后挂载一些关键文件系统,主要包括 /proc、/sys、/dev、/var 在这一步之后,这些基本的文件系统目录,systemd 开始准备切换实根文件目录,保存一些已配置的项目,并适应一些环境,systemd 执行 setsid()系统调用脱离核心控制,成为一个完全独立的父亲过程,至此 systemd 虚拟根文件系统阶段结束,systemd 进入实根文件系统阶段。
实根文件系统阶段,systemd 首先,对切换后的环境进行适应,然后打开日志终端的功能,提取系统启动时临时保存在核心中的日志,并将其存储在相应的日志文件中。下一步,systemd 与系统相关的初始化和配置能力的初始化和配置,例如:CPU 获取亲和力,配置主机名,系统 ID 的配置,cgroup 完成上述所有初始化工作后,控制器的挂载、回环网络的配置等,systemd 作为 PID 为 1 根据相应的保护过程,开始了各系统服务的创建和管理 Unit 配置单元文件执行相应的系统服务,系统启动工作通过各种服务逐步完成。systemd 执行 Unit 顺序大致可以分为 sysinit.target->basic.target->default.target,其中 sysinit.target 与 basic.target 主要用于启动一些与系统初始化相关的服务,并在启动初期执行一些任务,default.target 指向不同的操作级别target 如果文件进入命令行模式,则指向 multi-user.target 如果文件进入图形界面模式,则指向 graphical.target 文件。至此,systemd 启动阶段完成工作。至此,systemd 启动阶段完成工作。
6
终端登录阶段
在完成了 systemd 初始化阶段结束后,系统根据配置的运行水平进入不同的登录界面,以下主要介绍图形登录界面。在优麒麟操作系统中,systemd 启动过程主要如下:systemd->lightdm->Xorg->lightdm-greeter->ukui-greeter->ukui-session,通过优麒麟终端 pstree 命令可以看到以下两个过程树:
lightdm 是全新的,轻的 Linux 桌面桌面显示管理器首先会拉起 Xorg,Xorg 负责屏幕绘制的显示后台,然后 lightdm 还会拉起 lightdm-greeter,lightdm-greeter 是 lightdm 它会拉起子的过程 ukui-greeter 进程,ukui-greeter 这是登录界面的过程,所以 ukui-greeter 当输入登录用户名和密码时,系统将进入登录界面,通过用户名和密码效果后,lightdm 建立个人的 ukui-session 到目前为止,终端登录阶段已经结束,系统已经启动。
systemd 相关命令
systemd 提供了 systemctl 管理系统使用相关命令,以下是一些基本的常用命令:
1系统管理命令,控制系统电源状态
# 重启系统
$ sudo systemctl reboot
# 关闭系统,切断电源
$ sudo systemctl poweroff
# 暂停系统,使系统进入睡眠状态
$ sudo systemctl suspend
# 让系统进入冬眠状态
$ sudo systemctl hibernate
# 让系统进入交互式休眠状态
$ sudo systemctl hybrid-sleep
{x