ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Linux系统启动流程详解:BIOS/UEFI、GRUB、initramfs、systemd

Linux系统启动流程详解:BIOS/UEFI、GRUB、initramfs、systemd 按一下电源到登录提示符出现中间这几十秒其实跑了四个阶段固件自检、引导加载器拉起内核、initramfs把根文件系统准备好、最后systemd接管。排启动类故障——比如卡在 GRUB、内核 panic、服务起不来——你得知道每一步在干什么才知道卡在哪一环。这一篇把整条链路拆开来。一、全链路一眼看从上电到登录顺序固定BIOS/UEFI 固件自检 → 选择启动设备 → GRUB 引导加载器 → 加载内核 initramfs → 内核挂载 initramfs 临时根 → 加载磁盘/文件系统驱动 → 切到真实根 → systemd 成为 PID 1 → 激活 default target → 登录提示符每一环都有对应的排错入口。卡在 BIOS 阶段是硬件/启动盘问题卡在 GRUB 是引导配置问题内核 panic 多半是 initramfs 或驱动进不了登录界面才是 systemd 服务问题。二、BIOS/UEFI固件阶段按下电源主板上的固件先跑起来。这东西现在分两代对比项Legacy BIOSUEFI启动方式读磁盘第一扇区 MBR读 ESP 分区里的 EFI 程序分区表MBRGPT也支持 MBR磁盘大小2TB 上限无此限制启动速度慢快可并行初始化引导文件MBR 里 512 字节FAT32 分区/EFI/目录MBR 那 512 字节里放不下完整引导器所以 BIOS 时代才搞出 GRUB stage1/stage2 这种分段设计。UEFI 直接认文件引导器就是 ESP 分区里一个.efi文件清爽很多。怎么判断自己机器是哪种[-d/sys/firmware/efi]echoUEFI 启动||echoLegacy BIOS 启动预期输出UEFI 启动有/sys/firmware/efi就是 UEFI。没有就是老 BIOS。UEFI 环境下看启动项sudoefibootmgr预期输出节选BootCurrent: 0001 Timeout: 1 seconds BootOrder: 0001,0000,0002 Boot0000* Windows Boot Manager Boot0001* ubuntu Boot0002* Hard DriveBootOrder决定引导顺序GRUB 一般就是那个ubuntu条目。三、GRUB引导加载器固件把控制权交给 GRUB 之后GRUB 干三件事显示启动菜单、选内核、把内核和 initramfs 一起加载到内存。GRUB 配置文件在哪发行版主配置重新生成命令Ubuntu/Debian/boot/grub/grub.cfgsudo update-grubCentOS/Rocky/boot/grub2/grub.cfgsudo grub2-mkconfig -o /boot/grub2/grub.cfggrub.cfg是生成出来的别手改。真正改的是/etc/default/grub全局默认项和/etc/grub.d/下的脚本。改完重新生成sudoupdate-grub# Ubuntusudogrub2-mkconfig-o/boot/grub2/grub.cfg# Rocky临时加内核参数开机卡在内核阶段临时加个single或systemd.unitrescue.target进救援模式不用改文件GRUB 菜单出现时按e找到linux那一行行末加上参数按CtrlX启动。这是排障救命招。重装 GRUB系统装在/dev/sdaUEFI 模式GRUB 坏了重装sudogrub-install /dev/sdasudoupdate-grubRocky 上是grub2-install。装完一定要update-grub重新生成配置不然菜单里还是旧条目。四、initramfs临时根文件系统内核本身不知道你的硬盘是什么接口、根分区是什么文件系统。直接挂/必失败。解决方案是 initramfsinit ram filesystem一个打包成cpio.gz的迷你根文件系统里面放着常见磁盘驱动和工具。流程GRUB 把vmlinuz内核和initramfs.img一起加载到内存。内核先把 initramfs 挂成临时根跑里面的/init脚本。/init探测硬件加载真正的磁盘/文件系统驱动比如你的根分区在 LVM 或 RAID 上这里才挂上。挂上真实根switch_root切过去丢掉 initramfs。重新生成 initramfs加了新内核驱动、改了磁盘布局都要重生成sudoupdate-initramfs-u# Ubuntu/Debiansudodracut-f# CentOS/Rocky不重生成新内核或新驱动可能在启动阶段认不出根分区直接 panic。内核 panic 长什么样Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)看到Unable to mount root fs基本就是 initramfs 里缺驱动或者/etc/fstab里根分区 UUID 写错了。五、systemdPID 1切到真实根之后第一个被内核拉起来的用户态进程就是/sbin/init现在指向 systemd。它的 PID 永远是 1。systemd 启动干这些事挂载/etc/fstab里定义的所有文件系统。初始化网络、主机名、时区。按依赖关系启动 default target 下挂的所有服务。看启动花了多久systemd-analyze预期输出Startup finished in 2.312s (kernel) 1.847s (userspace) 4.159s graphical.target reached after 1.793s in userspace哪个服务拖慢了启动systemd-analyze blame预期输出节选852ms dnf-makecache.service 410ms systemd-journal-flush.service 233ms firewalld.service 102ms NetworkManager-wait-online.service 45ms sshd.serviceNetworkManager-wait-online.service常年霸榜服务器不需要等网络完全就绪再启动应用直接sudo systemctl disable NetworkManager-wait-online能省一两秒。blame只告诉你谁最慢没说它在等谁。想看某条服务的完整等待链用critical-chainsystemd-analyze critical-chain multi-user.target预期输出节选multi-user.target 1.793s └─ NetworkManager-wait-online.service 1.582s 102ms └─ NetworkManager.service 1.204s 312ms └─ network-pre.target 1.201s缩进和箭头画出来的就是依赖等待关系multi-user.target等NetworkManager-wait-online它又等NetworkManager。启动慢到底卡在哪一环一眼看清不用一个个服务猜。六、常见故障排查入口卡在哪现象先查什么固件后黑屏找不到启动设备启动盘顺序、ESP 分区、MBR 是否被覆盖卡在 GRUB 提示符grubGRUB 没装对或 grub.cfg 找不到进救援盘重装内核 panicVFS: Unable to mount rootinitramfs、fstab UUID、磁盘是否识别一直卡在 A start job is running某服务超时GRUB 里加systemd.unitmulti-user.target跳过问题服务能启动但服务不对应用没起来进系统后journalctl -xb看本次启动日志进紧急模式的两种方式GRUB 启动参数里加systemd.unitrescue.target进救援模式加emergency.target进最小化紧急 shell。救援模式至少会尝试挂文件系统emergency 模式只挂只读根排查 fstab 问题用 emergency。七、知识扩展从 MBR 到 ESP 的引导史理解了 BIOS 和 UEFI 的差别很多老文档的MBR 第一扇区说法才有意义。Legacy BIOS 启动一台 Linux 机器链条是这样的BIOS → 读 MBR硬盘第一扇区 512 字节 → MBR 里的 GRUB boot.imgstage1只有 446 字节 → 读 GRUB core.imgstage1.5放 MBR 之后的间隙分区 → 加载 GRUB 内核stage2 → 读 /boot/grub/grub.cfg → 加载 vmlinuz initramfs446 字节连个文件系统都读不懂这就是为什么需要分段。stage1 唯一的任务就是把 stage2 找出来。UEFI 把这一切省了。固件本身就懂 FAT 文件系统ESP 分区上直接放一个grubx64.efi文件固件按 NVRAM 里记的路径加载它没有 MBR、没有 stage1、没有 boot 间隙。代价是 ESP 必须是 FAT32 分区而且分区表得是 GPT。怎么确认自己的/boot长啥样ls/boot预期输出UEFI 机器config-6.8.0-45-generic initrd.img-6.8.0-45-generic System.map-6.8.0-45-generic efi grub vmlinuz-6.8.0-45-generic initrd.img grub2 vmlinuzvmlinuz是压缩后的内核initrd.img就是 initramfs。efi目录挂载着 ESP。装内核时apt install linux-image-xxx或dnf install kernel包管理会自动把这两个文件扔进来并跑一遍update-grub你不用手动改 grub.cfg——知道这条流水线存在排障时才知道该重跑哪一步。
返回列表