本文最后更新于44 天前,其中的信息可能已经过时,如有错误请发送邮件到2156936367@qq.com
当我们按下Linux电源键的时候,背后发生了什么? 首先,介绍一下整个流程
- BIOS/UEFI
- BootLoader(GRUB)
- 内核加载(Kernel)
- initramfs(临时根文件系统)
- init/systemd 初始化
- 用户空间(服务 + 登录) 接下来,详细讲解每一个流程。
一、BIOS / UEFI 阶段(硬件初始化)
首先,开机后运行主板固件,BIOS/UEFI程序启动,运行加电自检(POST,确保不同的硬件组件在启动之前都是能够正常工作的)
| 模式 | 特点 | 读取 BootLoader |
|---|---|---|
| BIOS | 传统模式(MBR) | 读取硬盘MBR,前512字节 |
| UEFI | 现代模式(GPT + EFI分区) | 读取EFI分区中的.efi文件 |
流程:
- 自检(POST)
- 初始化(检查) CPU、内存、硬盘等硬件
- 按启动顺序查找可启动设备
- 加载 BootLoader(读取引导程序)
二、BootLoader(引导程序)
常见的就是 GRUB2(LILO已经过时)
流程:
- 读取配置文件 /boot/grub2/grub.cfg
- 显示菜单
- 选择内核
- 传递启动参数
- 加载内核 /boot/vmlinuz-xxx 到内存
- 加载临时根文件系统,/boot/initramfs-xxx.img 到内存
- 把控制权交给内核
三、内核(Kernel)启动
Linux内核开始执行
流程:
- 解压自身,/boot/vmlinuz-xxx是压缩的内核镜像
- 初始化核心组件,内存管理,进程管理……其中内存管理:a.建立页表,b.启用虚拟内存
- 初始化设备驱动:a.磁盘驱动、b.文件系统驱动、c.网络驱动
- 挂载临时根文件系统(initramfs):initramfs是内存中的临时根文件系统
- 作用:
a.加载系统真正的根文件系统root所需的驱动(帮忙驱动),内核初期还不会访问磁盘(缺驱动)
b.找到真正的root分区(/dev/sda2)
c.挂载root分区
d.切换根目录root
四、init / systemd(用户空间初始化)
内核启动第一个用户态进程:systemd (PID 1)
早期:/sbin/init(SysV)
现代:systemd:整个用户空间的主管
- 作用:
a.所有进程的祖先
b.读取配置 /etc/systemd/system/
c.systemd 根据 /etc/systemd/system/default.target 确定启动级别(如多用户模式或图形界面)。
- systemd 启动流程:
- 挂载文件系统 /proc,/dev…
- 启动 udev(设备管理)
- 启动日志(journald)
- 启动网络
- 启动服务(sshd / cron / dbus 等)
- 启动图形界面(如果有)
注意:这里是并行启动服务,快所以好,这是systemd启动快的原因,之前叫init串行服务,比较慢,后面被systemed 取代
六、用户空间(登录阶段)
最终会看到:
启动 getty 等待用户输入用户名密码,或者启动图形桌面环境(GNOME/KDE)。
- 服务器:终端登录(tty)
- 桌面:GUI 登录界面(GDM/KDM)
登陆后:
启动shell,读取配置 ~/.bashrc,~/.profile….
面试题
- Linux 启动第一个进程是什么?它的 PID 是多少?在现代 Linux 中是 systemd,在老版本中是 init。其 PID 永远是 1。
- 什么是 initramfs (或 initrd)?它的作用是什么?它是一个临时的根文件系统。因为内核不知道如何驱动所有的硬件(如 RAID 卡、复杂的驱动),initramfs 包含了这些驱动。内核先挂载它,加载驱动,然后再挂载真正的硬盘根分区root。
- systemd 相比之前的 SysVinit 有什么优势?并行启动(提高速度)、按需启动、依赖检查、cgroups 隔离服务、日志统一管理 (journalctl)。
- 如何进入单用户模式(救援模式)?在 GRUB 菜单按 e 编辑,在 linux16 或 linux 行末尾添加 rd.break 或 single(或 init=/bin/bash),然后 Ctrl+X 启动。
- MBR 和 GPT 的区别?MBR 最多支持 4 个主分区,支持 2TB 以下硬盘;GPT 支持无限分区(常用 128 个),支持 2TB 以上,且有备份分区表更安全。
- 僵尸进程与 PID 1如果 PID 1 的进程(systemd)挂了,系统会立即 Kernel Panic。systemd 还有一个职责是“收养”孤儿进程(孤儿进程进程号是PPID1,假设是1)并回收僵尸进程。
- Systemd Target(启动级别)
- multi-user.target (相当于 init 3,命令行)
- graphical.target (相当于 init 5,图形化)
- 面试官可能会问:如何修改默认启动级别?(systemctl set-default …)
- 关键配置文件位置
- GRUB2 配置:/etc/default/grub 和 /boot/grub2/grub.cfg。
- 内核参数:在 /etc/sysctl.conf 或 GRUB 启动行定义。
- 文件系统挂载:/etc/fstab。
- UEFI 启动与 Secure Boot
- 现代机器多用 UEFI。UEFI 不读取 MBR,而是读取 EFI 系统分区 (ESP) 里的 .efi 文件。如果开启了 Secure Boot,未签名的内核将无法启动。
- 启动速度优化
- 可以使用 systemd-analyze blame 查看哪个服务启动最慢。
- 可以使用 systemd-analyze critical-chain 查看启动关键链。



