参考: 中国科学院大学 2025年秋《高级操作系统教程》课件
Linux 启动流程
- BIOS : 硬件检测,查找加载磁盘上的 MBR
- MBR : 存储 bootloader 信息,加载 Grub
- Grub : 查找并加载 kernel
- kernel : 装载驱动,挂载 rootfs, 执行 /sbin/init
- init : OS 初始化,执行 runlevel 相关程序
- 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 (定义系统默认运行级别) 设定的动作执行脚本
- 第一个被执行的脚本为
/etc/rc.d/rc.sysinit: 真正的 OS 初始化脚本- 激活 udev 和 selinux
- 根据
/etc/sysctl.conf文件设定内核参数 - 设定系统时钟
- 装载硬盘映射
- 启用交换分区
- 设置主机名
- 根文件系统检测,并以读写方式重新挂载根文件系统
- 激活 RAID 和 LVM 设备
- 启用磁盘配额
- 根据
/etc/fstab检查并挂载其他文件系统 - 清理过期的锁和 PID 文件
- 根据配置的启动级别,执行对应目录底下的脚本
- 最后执行
/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 系统调用创建
- 第一个用户态进程
- 所有用户态进程的父进程或先祖进程
主要任务:
- 系统启动
- zombie 进程管理
init 进程的缺点:
- 启动时间长: init 进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
- 启动脚本复杂: 脚本需要自己处理各种情况,这往往使得脚本变得很长。
当前的 1 号进程
| Process 1 | 描述 | 启动管理 | 进程回收 | 服务管理 | 并行启动 | 设备管理 | 资源控制 | 日志管理 |
|---|---|---|---|---|---|---|---|---|
| sysvinit | 早期版本的初始化进程工具,逐渐淘汰 | ✔ | ✔ | - | - | - | - | - |
| upstart | Debian 7, Ubuntu 14 等早期使用,目前仅仅处于维护模式 | ✔ | ✔ | ✔ | ✔ | - | - | - |
| Systemd | 快速启动,目前被大多数 Linux 发行版使用 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
当前大多数 Linux 发行版采用 Systemd 作为 1 号进程
- SysMaster-Init
- Zombie reaping
- 监控 sysmaster-core
- Less 1k LoC
- SysMaster-core
- 依赖管理器
- Hot restart,live update
- 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 messagesquiet:1
[KNL,EARLY] Disable most log messages
查看当前内核的启动命令行参数
1 | cat /proc/cmdline |
设置内核的启动命令行参数
- 方式一:编译 kernel 时通过
menuconfig确定CONFIG_CMDLINE_BOOL和CONFIG_CMDLINE - 方式二:通过 bootloader 设置
- grub:
/etc/default/grub中设置GRUB_CMDLINE_LINUX或GRUB_CMDLINE_LINUX_DEFAULT, 并grub-mkconfig -o /boot/grub/grub.cfg重启 - lilo: …
- systemd-boot: …
- grub: