Linux 启动流程全解析:从 BIOS 到 systemd
发布时间 - 2026-01-30 00:00:00 点击率:次Linux启动是分阶段移交过程,BIOS/UEFI→MBR/GPT→GRUB→内核+initramfs→systemd;initramfs必须精确匹配硬件与根设备形态,缺失或不兼容会导致“VFS: Unable to mount root fs”等错误。
Linux 启动不是一条线性路径,而是一系列依赖明确、阶段清晰的移交过程;跳过任一环节(比如绕过 initramfs 直接挂载根文件系统),系统大概率卡死在“VFS: Unable to mount root fs”。
BIOS/UEFI 到 MBR/GPT 的控制权移交关键点
传统 BIOS 读取磁盘第一个扇区(512 字节)的 MBR,执行其中的引导代码;UEFI 则查找 EFI 系统分区(ESP)中 /EFI/boot/bootx64.efi(x86_64)这类可执行镜像。两者根本区别在于:BIOS 是 16 位实模式,无文件系统概念;UEFI 原生支持 FAT32,能直接按路径加载 EFI 应用。
常见错误现象:
- UEFI 模式下硬盘为 MBR 分区表 → 启动失败,提示 “Invalid partition table” 或直接进固件界面
- BIOS 模式下硬盘为 GPT 分区表 → 可能成功启动(部分兼容),但
grub安装到core.img时会报错 “embedding is not possible”
实操建议:
- 用
lsblk -f查看分区类型和挂载点,确认 ESP 是否存在且格式为vfat - 用
efibootmgr -v(需在 UEFI 环境下运行)验证当前启动项指向的 EFI 路径是否真实存在 - 安装系统前,根据固件类型明确选择 MBR+BIOS 或 GPT+UEFI 组合,不要混用
GRUB2 加载内核与 initramfs 的实际行为
grub.cfg 中的 linux 行指定内核镜像(如 vmlinuz-6.1.0-xx-amd64),initrd 行指定对应的 initramfs.img。注意:这不是“加载两个文件后一起运行”,而是 GRUB 将内核解压到内存,再把 initramfs 作为初始 RAM 文件系统一并载入——内核启动后第一件事就是解包并切换到这个临时根环境。
容易踩的坑:
-
initramfs缺失或损坏 → 内核 panic,停在 “Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)” -
initramfs不含对应硬件驱动(如 NVMe 控制器、LVM 模块、加密模块dm-crypt)→ 找不到根设备,卡在 “Waiting for root device…” - 手动更新内核后未重建
initramfs→update-initramfs -u必须执行,否则新内核无法识别旧 initramfs 中的驱动
验证方式:
- 启动时按
e进入 GRUB 编辑模式,检查linux和initrd行路径是否指向真实存在的文件(用ls (hd0,gpt2)/boot/测试) - 从 Live 系统挂载原系统,运行
lsinitramfs /boot/initrd.img-xxx | grep -E "(nvme|lvm|crypt)"确认关键模块已打包
systemd 接管后如何判定“启动完成”
systemd 并不等待所有服务就绪才宣告启动完成;它以 default.target(通常是 graphical.target 或 multi-user.target)的激活状态为标志。只要该 target 下所有 Wants/Requires 的 unit 进入 active(running)状态,systemctl is-system-running 就返回 running。
这意味着:
- 后台仍在启动的服务(如
docker.service设置了After=network.target但网络尚未 ready)不会阻塞系统就绪判断 -
systemctl list-jobs可看到 pending 的 unit,它们可能因依赖未满足而排队 - 某些服务(如
getty@tty1.service)在graphical.target下是被WantedBy的,但若桌面环境崩溃,它仍可能处于 running 状态,系统仍算“已启动”
调试建议:
- 用
systemd-analyze blame查看哪些 unit 启动耗时最长 - 用
systemd-analyze critical-chain追踪从default.target到最慢 unit 的依赖链 - 若服务始终 failed,检查其
Wants=或After=的上游 unit 是否 active,而非只看自身日志
整个流程里最容易被忽略的是 initramfs 的内容适配性——它不像内核那样“向下兼容”,而是必须精确匹配当前硬件抽象层和根设备形态;换一块 NV

# linux
# docker
# 字节
# 硬盘
# ai
# amd
# ios
# bios
# 解压
# gpt
# 区别
# for
# default
# table
# embedding
# 分区表
# 文件系统
# 加载
# 镜像
# 固件
# 的是
# 第一个
# 模式下
# 找不到
# 这类
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速搭建FTP站点实现文件共享?
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
Bootstrap整体框架之CSS12栅格系统
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
原生JS实现图片轮播切换效果
javascript中对象的定义、使用以及对象和原型链操作小结
如何在景安云服务器上绑定域名并配置虚拟主机?
如何在局域网内绑定自建网站域名?
如何实现javascript表单验证_正则表达式有哪些实用技巧
详解阿里云nginx服务器多站点的配置
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
如何在IIS服务器上快速部署高效网站?
如何用景安虚拟主机手机版绑定域名建站?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
Laravel如何使用查询构建器?(Query Builder高级用法)
JavaScript如何实现错误处理_try...catch如何捕获异常?
如何撰写建站申请书?关键要点有哪些?
Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践
zabbix利用python脚本发送报警邮件的方法
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
Laravel如何处理文件下载请求?(Response示例)
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
怎样使用JSON进行数据交换_它有什么限制
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
浅析上传头像示例及其注意事项
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
长沙企业网站制作哪家好,长沙水业集团官方网站?
韩国服务器如何优化跨境访问实现高效连接?
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
如何快速生成专业多端适配建站电话?
香港服务器如何优化才能显著提升网站加载速度?
Linux安全能力提升路径_长期防护思维说明【指导】
网站优化排名时,需要考虑哪些问题呢?
js代码实现下拉菜单【推荐】
使用spring连接及操作mongodb3.0实例
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
Java遍历集合的三种方式
如何在建站主机中优化服务器配置?
Android使用GridView实现日历的简单功能
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
Linux网络带宽限制_tc配置实践解析【教程】
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
Laravel如何使用Gate和Policy进行授权?(权限控制)
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
如何快速上传建站程序避免常见错误?
Android自定义listview布局实现上拉加载下拉刷新功能
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
Swift开发中switch语句值绑定模式

