0%

Linux Boot 过程

参考: 中国科学院大学 2025年秋《高级操作系统教程》课件

Linux 启动流程

  1. BIOS : 硬件检测,查找加载磁盘上的 MBR
  2. MBR : 存储 bootloader 信息,加载 Grub
  3. Grub : 查找并加载 kernel
  4. kernel : 装载驱动,挂载 rootfs, 执行 /sbin/init
  5. init : OS 初始化,执行 runlevel 相关程序
  6. runlevel: 启动指定级别的服务

Grub

Linux 上最常用的 bootloader (GNU GRUB: 来自 GNU 项目的启动引导程序)

  • GRUB 允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统
  • GRUB 可通过链式引导来引导 Windows 系统
  • 支持所有的 Linux 文件系统,也支持 Windows 的 FAT 和 NTFS 文件系统
  • 支持图形界面,可定制启动菜单和背景图片,支持鼠标
  • 拥有丰富的终端命令,用户可以查看硬盘分区的细节,修改分区设置,临时重新映射磁盘顺序,从任何用户定义的配置文件启动

kernel

kernel 启动过程:
压缩的 kernel => 解压缩的 kernel => 根文件系统 rootfs => 第一个程序 init

init

init 程序: 进行 OS 初始化操作
实际上是根据 /etc/inittab (定义系统默认运行级别) 设定的动作执行脚本

  1. 第一个被执行的脚本为 /etc/rc.d/rc.sysinit : 真正的 OS 初始化脚本
    1. 激活 udev 和 selinux
    2. 根据 /etc/sysctl.conf 文件设定内核参数
    3. 设定系统时钟
    4. 装载硬盘映射
    5. 启用交换分区
    6. 设置主机名
    7. 根文件系统检测,并以读写方式重新挂载根文件系统
    8. 激活 RAID 和 LVM 设备
    9. 启用磁盘配额
    10. 根据 /etc/fstab 检查并挂载其他文件系统
    11. 清理过期的锁和 PID 文件
  2. 根据配置的启动级别,执行对应目录底下的脚本
  3. 最后执行 /etc/rc.d/rc.local 脚本,至此,系统启动完成

运行级别 runlevel

Linux 的启动级别分为以下几种:

  • 0: 关机模式
  • 1: 单一用户模式(直接以管理员身份进入)
  • 2: 多用户模式(无网络)
  • 3: 多用户模式(命令行)
  • 4: 保留
  • 5: 多用户模式(图形界面)
  • 6: 重启

在不同的运行级别下,/etc/rc.d/rc 脚本会分别执行不同目录下的脚本:

  • Run level 0 – /etc/rc.d/rc0.d/
  • Run level 1 – /etc/rc.d/rc1.d/
  • Run level 2 – /etc/rc.d/rc2.d/
  • Run level 3 – /etc/rc.d/rc3.d/
  • Run level 4 – /etc/rc.d/rc4.d/
  • Run level 5 – /etc/rc.d/rc5.d/
  • Run level 6 – /etc/rc.d/rc6.d/

这些目录下的脚本只有 K*S* 开头的文件:
K* 开头的文件为开机需要执行关闭的服务
S* 开头的文件为开机需要执行开启的服务

进程创建

init 进程为 1 号进程:

  • 通过 fork 系统调用创建
  • 第一个用户态进程
  • 所有用户态进程的父进程或先祖进程

主要任务:

  1. 系统启动
  2. zombie 进程管理

init 进程的缺点:

  • 启动时间长: init 进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
  • 启动脚本复杂: 脚本需要自己处理各种情况,这往往使得脚本变得很长。

当前的 1 号进程

Process 1 描述 启动管理 进程回收 服务管理 并行启动 设备管理 资源控制 日志管理
sysvinit 早期版本的初始化进程工具,逐渐淘汰 - - - - -
upstart Debian 7, Ubuntu 14 等早期使用,目前仅仅处于维护模式 - - -
Systemd 快速启动,目前被大多数 Linux 发行版使用

当前大多数 Linux 发行版采用 Systemd 作为 1 号进程

systemd
  1. SysMaster-Init
    • Zombie reaping
    • 监控 sysmaster-core
    • Less 1k LoC
  2. SysMaster-core
    • 依赖管理器
    • Hot restart,live update
  3. SysMaster-extends

Linux Kernel Cmdline Parameter

参数

完整参数:https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html

  • loglevel=
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [KNL,EARLY]
    All Kernel Messages with a loglevel smaller than the
    console loglevel will be printed to the console. It can
    also be changed with klogd or other programs. The
    loglevels are defined as follows:

    0 (KERN_EMERG) system is unusable
    1 (KERN_ALERT) action must be taken immediately
    2 (KERN_CRIT) critical conditions
    3 (KERN_ERR) error conditions
    4 (KERN_WARNING) warning conditions
    5 (KERN_NOTICE) normal but significant condition
    6 (KERN_INFO) informational
    7 (KERN_DEBUG) debug-level messages
  • quiet:
    1
    [KNL,EARLY] Disable most log messages

查看当前内核的启动命令行参数

1
cat /proc/cmdline

设置内核的启动命令行参数

  1. 方式一:编译 kernel 时通过 menuconfig 确定 CONFIG_CMDLINE_BOOLCONFIG_CMDLINE
  2. 方式二:通过 bootloader 设置
    • grub: /etc/default/grub 中设置 GRUB_CMDLINE_LINUXGRUB_CMDLINE_LINUX_DEFAULT, 并 grub-mkconfig -o /boot/grub/grub.cfg 重启
    • lilo: …
    • systemd-boot: …