新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/9/30 11:21:00来源:尧图网络
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——知道这条流水线存在排障时才知道该重跑哪一步。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

SQLAlchemy ORM实战指南:从模型设计到查询优化与排坑 2026/9/30 11:58:54

SQLAlchemy ORM实战指南:从模型设计到查询优化与排坑

写SQLAlchemy之前,先聊聊我这几年的感受。Python世界里,如果你和数据库打过交道,SQLAlchemy ORM几乎是绕不开的名字。它不是一个简单的“python 连接数据库”库,而是一套完整的数据访问工具链,底层帮你处理连接池、SQL…

阅读更多 →
同城O2O系统架构实战:中台化设计与Kubernetes部署实践 2026/9/30 11:58:54

同城O2O系统架构实战:中台化设计与Kubernetes部署实践

做同城O2O系统架构这几年,我最大的感受是:真正难的不是某个接口怎么写,而是整条链路从下单到履约怎么在设计层面就保持清晰、可控、可扩展。你打开外卖App点一份餐,背后涉及用户、商家、支付、调度、骑手、售后等多个系统的协作&a…

阅读更多 →
使用Docker容器化Python应用:从Dockerfile到docker-compose实战 2026/9/30 11:58:54

使用Docker容器化Python应用:从Dockerfile到docker-compose实战

1. 为什么要用Docker来跑Python应用先说个我自己的经历。几年前我接了一个爬虫项目,本地跑得好好的,一到服务器上就各种报错。一会儿是Python版本不对,一会儿是缺少某个系统依赖库,最离谱的一次是对方服务器上已经装了Python 3.6&…

阅读更多 →
拖拽式H5编辑器部署实战:从Nginx托管到Docker交付 2026/9/30 11:58:20

拖拽式H5编辑器部署实战:从Nginx托管到Docker交付

做前端这行,最不缺的就是“帮我做个H5活动页”这种需求。市场部要一个秒杀页,产品经理要一个抽奖落地页,运营今天改文案明天换Banner,每次改起来比新建还慢。后来我给自己找了个一劳永逸的办法:部署一套拖拽式H5页面制…

阅读更多 →
ChatGPT 提示词工程实战:11 种 AI 指令把大模型变成你的私人学习教练 2026/9/30 11:58:18

ChatGPT 提示词工程实战:11 种 AI 指令把大模型变成你的私人学习教练

简介:这份docx文档收录了11个可直接套用的ChatGPT学习指令,聚焦思维导图、费曼技巧、精细提问、间隔重复、SQ3R法、双编码、类比隐喻、故事叙述、交错学习等主流高效学习法,适合需要借助AI辅助自学新技能、备考或系统攻克某一领域知识的学习者…

阅读更多 →
车辆路径优化实战:从TSP到VRP的Python求解指南 2026/9/30 11:58:18

车辆路径优化实战:从TSP到VRP的Python求解指南

最近在折腾一个配送调度的小项目,白天上班跟业务方对需求,晚上回家写算法,满脑子都是车辆路径优化这几个字。等我真正把一条条路线在图上铺开的时候,才发现车辆路径优化这件事,真的是既奇妙又折磨人。今天想从我的实战…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉