Linux启动全流程拆解:从按下电源键到登录提示符的排查指南
开机时那一秒钟到底发生了什么这个问题我前后琢磨了差不多五年从第一次对着黑屏上的 GRUB 倒计时发呆到后来在生产服务器上逐行看串口日志排查启动卡死Linux 的启动过程对我来说不再是背流程书上的七个步骤而是一套可以快速定位问题的“心理模型”。这篇文章就把这套模型完整拆给你从按下电源键一直到你看到登录提示符每一个环节的关键动作、常踩的坑、排查手段都会讲到。不管你是刚接触 Linux 的新手还是已经在用 systemd 管理服务的开发者只要你想真正搞懂这几十秒里系统的“想法”这篇文章都值得你花半小时读完。1. 整体启动流程先建立全局视图很多教程一上来就讲 GRUB 配置、内核参数容易让人迷失在细节里。我建议你先在脑子里画一条主线固件加载引导程序引导程序加载内核内核初始化硬件并挂载根文件系统然后交给第一个用户态进程由它拉起所有服务。这条主线拆开就是四个阶段固件阶段BIOS/UEFI检测硬件找到可启动设备引导加载器阶段GRUB2选择内核加载 initramfs内核阶段解压自身、初始化驱动、挂载根目录用户态阶段systemd执行默认目标启动全部服务这四个阶段看起来简单但实际启动失败时往往是因为它们之间的交接点出了问题。比如内核启动到一半找不到根分区或者 systemd 等某个挂载点超时这类问题如果脑子里的阶段划分不清晰排查起来会非常痛苦。我自己的习惯是任何启动问题先问“卡在哪一个阶段”而不是“为什么起不来”。因为每个阶段输出的信息位置不一样排查工具也完全不一样。固件阶段的错误看屏幕提示GRUB 阶段看 GRUB 菜单和命令行内核阶段看内核日志用户态阶段看 systemd 日志。阶段定位准了问题就解决了一半。2. 固件到引导加载器从按下电源键到 GRUB 菜单出现2.1 传统 BIOS 和现代 UEFI 的区别按下电源键后CPU 会从一个固定的物理地址开始执行固件代码。老式 BIOS 会做 POST 自检然后按照 CMOS 里配置的启动顺序去扫描设备。它会读取硬盘第一个扇区MBR的 512 字节把这部分代码加载到内存并执行这就是引导程序的第一阶段。现在的 UEFI 则是另一套逻辑。它不需要读 MBR而是直接读取硬盘上 EFI 系统分区ESP里的.efi文件。这个分区通常是 FAT 格式里面存放着 GRUB 的 EFI 可执行文件比如grubx64.efi。UEFI 固件根据 NVRAM 中的启动项记录去加载这个文件。注意现在绝大多数 Linux 发行版默认使用 UEFI 模式如果你在老的教程里看到fdisk分 MBR 分区、装 GRUB 到/dev/sda那套操作在新的设备上不一定适用。装系统前先确认自己的固件模式避免 UEFI 和 Legacy 混用出问题。2.2 GRUB 2 的加载过程GRUB 2 的设计非常有意思它把自己拆成了多个阶段。EFI 版 GRUB 其实是把核心映像直接编译成了grubx64.efi固件加载这个文件后GRUB 就开始解析自己的配置。传统 BIOS 版则需要经过boot.img、core.img等中间环节因为 MBR 里那 512 字节装不下完整的 GRUB 代码。GRUB 加载后干的事情可以概括为三步读取/boot/grub/grub.cfg配置文件解析菜单项确定要启动的内核和 initramfs加载内核映像和 initramfs 到内存然后跳转到内核入口这里有个重要的细节GRUB 本身是自带文件系统驱动的。它需要能读得懂/boot所在分区上的文件系统常见的有 ext4、XFS、Btrfs甚至还能读 NVMe 设备上的分区。所以如果你的/boot分区损坏或者文件系统驱动不匹配GRUB 菜单能出来但就是启动不了内核。我实际修过一台开机直接进 GRUB rescue 的机器原因是/boot分区被误格式化成了 NTFSGRUB 读不到内核文件。处理办法是进 rescue 模式后用set prefix手动指定正确的/boot/grub路径再重新生成配置文件。这个坑提醒我改分区格式前一定要确认 GRUB 能不能识别。2.3 内核参数和 initramfs 的配合GRUB 菜单里每个启动项都有一行linux开头的内容后面跟着内核路径和参数。常用参数包括rootUUID...指定根文件系统quiet抑制内核日志输出splash显示开机画面systemd.unitrescue.target临时进入救援模式还有一个参数是initrd指定 initramfs 映像路径。initramfs 是一个临时根文件系统里面包含了内核启动早期所需要的驱动和工具。为什么不能直接加载真正的根文件系统因为真正根分区可能位于 RAID、LUKS 加密卷或 LVM 逻辑卷上内核自己并不认识这些逻辑卷结构需要额外的用户态工具去激活它们。所以内核的做法是先把这个小的 initramfs 作为临时根目录运行里面的init脚本加载必要驱动激活根分区所在的存储设备然后再把根目录切换到真正的根分区上。这个“切换根”的动作英文叫switch_root。理解了这点你就理解了为什么/boot里总有一堆initramfs-*.img文件。它们不是多余的而是内核与真实根文件系统之间的桥梁。3. 内核初始化从解压到挂载根文件系统3.1 内核入口和早期初始化当 GRUB 把控制权交给内核后内核首先会解压自己。现代内核映像是一个自解压的压缩包解压完成后会进入架构相关的汇编代码设置页表、栈指针然后跳到 C 语言写的start_kernel()函数。这个函数是内核初始化的“总调度室”。start_kernel()做的事情非常多我用几个关键点概括初始化内存管理初始化调度器初始化中断控制器初始化时钟系统创建 init 进程PID 1的雏形这个阶段基本上没有日志输出除非你加了earlyprintk参数因为串口驱动都还没准备好。如果内核在这一阶段崩溃你很可能只看到黑屏或者一个停滞的画面排查难度极大。3.2 设备驱动加载与 initramfs 执行内核完成基础初始化后会解压并挂载 initramfs。它会在内存里创建一个 rootfs然后执行/init这个文件在 initramfs 里和系统真正的/sbin/init不是同一个。基于 Debian/Ubuntu 的发行版这个/init是initramfs-tools生成的脚本基于 RHEL/CentOS 的则是dracut生成的。这个阶段的重点是加载存储控制器驱动。比如你的根分区在 NVMe SSD 上initramfs 里必须有对应的nvme驱动如果用了 LVM就需要device-mapper相关模块如果用了 LUKS 加密还需要dm-crypt和密码提示工具。遇到“内核恐慌无法挂载根文件系统”的情况绝大多数都是这里出了问题。排查方法是在 GRUB 菜单按e编辑启动项在内核参数行末尾加上break或者改成rd.breakdracut 环境这样系统会停在 initramfs 的 shell 里你可以手动检查驱动是否加载、设备节点是否存在。3.3 rootfs 切换和第一个用户态进程initramfs 里的脚本成功挂载真实根分区后会调用switch_root把根目录切换过去然后执行真实根目录下的/sbin/init。在现在的主流发行版里/sbin/init通常是一个指向 systemd 的符号链接。这里有一个很多人没注意到的细节内核在挂载根文件系统时会检查其只读挂载标志。传统 SysV 启动流程会在早期以只读方式挂载根目录然后由 fsck 检查文件系统再重新以读写方式挂载。systemd 继承了类似逻辑如果你在日志里看到Reached target Local File Systems之前有 ext4 检查的提示那就是 fsck 在做检查。到了这一步内核的使命基本完成从 PID 1 开始剩下的所有工作都交给了用户态程序。4. systemd 接管从 PID 1 到登录界面4.1 systemd 的启动目标和单元依赖systemd 启动后最先做的事情是读取默认目标target。不同发行版默认目标可能不同但大多数服务版系统默认是multi-user.target带图形界面的桌面版是graphical.target。你可以通过systemctl get-default查看当前默认目标。systemd 和传统 SysV init 最大的不同是并行启动。SysV 按脚本顺序一个个启动systemd 则根据单元之间的依赖关系尽可能并行执行。比如网络服务和 SSH 服务如果没有依赖关系它们可以同时启动大大缩短总启动时间。但并行带来一个问题如果有两个服务都依赖同一个资源或者要启动的单元很多systemd 必须等依赖项就绪。如果某个单元卡住超过默认超时时间通常 90 秒systemd 会放弃并标记该单元为失败状态但不会影响整体启动。4.2 关键 target 和常见服务顺序下面这张表是我自己整理的生产环境排查时高频遇到的 target 和它们的作用Target 名称作用启动失败典型现象sysinit.target系统初始化基础服务挂载点找不到磁盘、文件系统挂载失败basic.target基础系统能力包括 sockets、timers日志系统起不来、tmpfiles 报错multi-user.target多用户非图形环境SSH 起不来、网络服务异常graphical.target图形界面环境显示管理器起不来rescue.target单用户救援模式需要 root 密码进入systemd 的单元文件里到处是Wants、Requires、After这类依赖指令。After只影响顺序不影响是否启动Requires则强制要求依赖单元成功如果依赖失败本单元也会失败。实际操作中我常在启动卡住时用的命令是systemd-analyze系列systemd-analyze blame systemd-analyze critical-chainblame可以按启动耗时从高到低列出每个单元的初始化时间critical-chain则打印关键链路上每个单元的耗时。有一次我发现 sshd 启动花了 30 秒然后blame显示network.target一直在等 DHCP 超时查下去才发现网卡里配了不存在的 VLAN导致 DHCP 客户端反复重试。这类问题用这两个命令定位非常高效。4.3 服务启动失败时的第一手排查工具如果某个服务没起来别急着改配置文件先看状态systemctl status 服务名 journalctl -u 服务名journalctl默认只显示本次启动的日志但如果你加了-b -1就能看到上一次启动的日志。这点在很多“重启后服务没起来但错误信息一闪而过”的场景里非常有用。技巧如果你想在启动过程中看到完整日志可以在内核参数里去掉quiet加上systemd.log_leveldebug。这样 systemd 会把每一个单元的启动过程都打印到控制台不过信息量巨大建议先输出到文件再分析。5. 启动故障排查实战从卡死到恢复5.1 定位启动卡死阶段我见过最经典的故障是开机后屏幕停在某个画面上既不进登录界面也不报错。这时候千万别急着重装系统先通过三个“隔板”来判断卡在哪个阶段。如果按CtrlAltF2能切换到另一个虚拟终端说明内核和 systemd 已经基本起来了问题多半在显示管理器或登录服务。如果屏幕上有内核日志停止滚动且最后一次输出和存储设备相关基本可以判断卡在 initramfs 阶段。如果 GRUB 菜单都没出现那就是固件或 GRUB 引导问题。确定阶段后再用对应的方式介入。比如卡在 initramfs 阶段可以在 GRUB 菜单编辑内核参数增加rd.break系统会在 initramfs shell 停下你可以手动检查/dev里有没有磁盘设备、dmesg里驱动日志是否正常。5.2 常见启动问题速查表我把这几年遇到的高频启动问题整理成了下面这个表格每个都附了直接可用的排查命令或修复手段问题现象可能原因快速排查/修复开机直接进 GRUB rescue/boot引导文件缺失或分区无法识别使用 live CD 启动重新安装 GRUB 到 EFI 分区内核恐慌找不到根分区root参数错误或 initramfs 缺少存储驱动在 GRUB 编辑root/dev/sdX或重新生成 initramfs启动停在“A start job is running for”某个 systemd 单元等待超时journalctl -b看哪个单元超时临时禁用或修复服务启动自检失败进入 emergency mode/etc/fstab里有错误挂载项systemctl default继续启动然后修复 fstab图形界面黑屏但 SSH 可登录显示管理器崩溃或显卡驱动异常登录后重启显示管理器检查 X/Wayland 日志5.3 恢复模式的几种思路现代发行版默认都提供了高级选项菜单通常包含多个版本的内核和一个 recovery 模式。恢复模式简化了很多东西比如只读挂载根目录、不启动网络服务方便你修复问题。但我的建议是不要长期依赖 recovery 模式。如果只是为了改一个/etc/fstab的错误直接进 recovery 修改是没问题但如果是想诊断一个复杂的启动失败建议准备一个 live USB 环境因为 live 环境里你可以完整挂载系统盘逐项检查配置而不是被局域网内的 recovery 环境限制住。另外如果你的系统用了 LVM 或 LUKSlive 环境必须安装相应的支持工具否则盘都挂不上。常见命令行是# 激活 LVM 卷组 vgchange -ay # 打开 LUKS 加密分区 cryptsetup luksOpen /dev/sdb2 system-root这几条命令执行后再mount根分区就顺理成章了。5.4 我踩过的几个典型坑第一个坑GRUB 菜单默认超时太短来不及编辑就直接进系统。如果你经常需要调试启动参数建议把/etc/default/grub里的GRUB_TIMEOUT调大比如 10 秒然后执行update-grub。生产环境我通常设为 5 秒既能保证重启效率也给手残留一点时间。第二个坑内核更新后 initramfs 没有同步生成。很多定制内核的用户手动编译时忘了跑mkinitramfs结果重启后找不到根分区。如果你用发行版默认内核这个一般不会遇到但如果你曾经改过/etc/initramfs-tools/initramfs.conf那每次内核更新后自动生成 initramfs 时可能会带入旧配置导致启动异常。 解决办法是重新生成sudo update-initramfs -u针对 RHEL 系是sudo dracut -f第三个坑UEFI 和 Legacy 混用导致引导丢失。有些机器默认 BIOS 模式装系统后来在 BIOS 设置里改成了 UEFI结果开机提示无引导。其实系统文件都还在只是固件找不到对应的启动项。这时候可以用 live USB 进入系统挂载 EFI 分区后重新安装 GRUB 的 UEFI 版本或者把固件改回原来的启动模式。6. 把启动过程变成你的排查能力如果你把上面的内容都看完了我建议你找个实验机器做一次完整演练在 GRUB 里故意改错一个内核参数观察系统怎么报错再故意注释掉/etc/fstab里的一个挂载项看 systemd 会不会进入 emergency 模式。只有亲手制造过故障真正遇到故障时你才不会慌。我个人从这些年的实践中得到的最大感受是Linux 启动过程不是抽象的理论而是一条可以逐个节点检查的链路。每次遇到启动类问题按链路分段排查再辅以 GRUB 临时编辑、initramfs 中断、systemd 日志这三个手段绝大多数问题都可以在半小时内定位清楚。最后再分享一个小技巧给机器接上一个串口在内核参数里加上consolettyS0,115200这样启动日志会输出到串口即使设备没有显示器也能远程定位启动问题。对于服务器运维来说这一招的价值在意外断电、远程重启时体现得尤为明显。

相关新闻

手写webpack自定义loader与plugin:从零掌握构建扩展原理

手写webpack自定义loader与plugin:从零掌握构建扩展原理

不要从“我”开始建议不要使用“本文”、“我”等第一人称视角作为开篇方式,切换到更客观、中立的叙述口吻会更好。下面我调整一下,重写开头,给你一个更干净、更自然的版本。webpack作为前端打包工具里的老大哥,几乎每个项目都绕不…

2026/10/18 4:48:34 阅读更多 →
截图里的字复制不出来?Umi-OCR 免费离线 OCR 完整使用教程

截图里的字复制不出来?Umi-OCR 免费离线 OCR 完整使用教程

截图里的字复制不出来?Umi-OCR 免费离线 OCR 完整使用教程 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国…

2026/10/18 4:48:34 阅读更多 →
string类相关接口的使用及模拟实现

string类相关接口的使用及模拟实现

一.标准库中的string类1.1std::string是c标准库中最常用的字符串处理工具&#xff0c;位于std命名空间下&#xff0c;本质是basic_string<char>的一个特化别名&#xff0c;用于可变长的字符序列&#xff0c;并自动管理底层的动态内存。在底层string通常使用动态数组来管理…

2026/10/18 4:48:34 阅读更多 →

最新新闻

国庆AI行业盘点:模型更新、开源生态与智能体落地加速

国庆AI行业盘点:模型更新、开源生态与智能体落地加速

国庆长假这两天&#xff0c;AI圈跟过年似的。10月1日到10月8日&#xff0c;前后八天&#xff0c;不断有模型更新、开源仓库爆点、智能体应用密集落地。作为一个长期跟踪这条赛道的人&#xff0c;我几乎每天都要刷好几遍测试榜单和社区讨论串&#xff0c;很多信息还没来得及沉淀…

2026/10/18 5:37:42 阅读更多 →
程序员必备20个网站:技术阅读、刷题、接单与效率工具盘点

程序员必备20个网站:技术阅读、刷题、接单与效率工具盘点

程序员必备网站这个老话题&#xff0c;几乎每隔几个月就会被重新拿出来聊一轮。技术、接单、刷题这三类网站&#xff0c;每个开发者的收藏夹里都躺着不止一个&#xff0c;但真到要用的时候&#xff0c;很多人会发现&#xff1a;收藏了 300 个网站&#xff0c;能稳定打开、准时解…

2026/10/18 5:37:42 阅读更多 →
全大写提示词触发AI风控?解析Claude互审封禁真相与安全写法

全大写提示词触发AI风控?解析Claude互审封禁真相与安全写法

有意思。“让Claude管Claude”本身没问题&#xff0c;问题是这句提示词是用全大写敲出来的。我是在一个技术讨论群里看到这件事的&#xff1a;某人做了个自动化流程&#xff0c;让一个Claude会话去审核另一个Claude会话生成的文案&#xff0c;这本来是个很常见的质检思路&#…

2026/10/18 5:37:42 阅读更多 →
Image GPS Editor实战:照片GPS数据的读取、修改与批量处理

Image GPS Editor实战:照片GPS数据的读取、修改与批量处理

前阵子帮朋友整理一趟长途自驾的素材&#xff0c;几百张照片导进电脑&#xff0c;结果发现相机里明明开了GPS记录&#xff0c;出来的照片却有一大半坐标信息是空的。另一批用手机拍的照片倒是带位置&#xff0c;但其中有几张因为当时在船上漂着&#xff0c;定位偏到了海里。用看…

2026/10/18 5:37:42 阅读更多 →
变量之路:理清编译与链接中的符号、地址与重定位机制

变量之路:理清编译与链接中的符号、地址与重定位机制

先问一个问题&#xff1a;你在 IDE 里写了int counter 0;&#xff0c;点一下运行按钮&#xff0c;程序跑起来了。可是那个叫counter的变量&#xff0c;它的地址到底是谁给它的&#xff1f;它为什么能从一个名字变成一个真实存在于内存里的地址&#xff1f;我在带新人的时候发现…

2026/10/18 5:37:42 阅读更多 →
律所案件管理系统设计与落地:角色权限、流程引擎与文书协同实践

律所案件管理系统设计与落地:角色权限、流程引擎与文书协同实践

1. 这个系统到底在解决什么问题做律师的朋友应该都有过这种体验&#xff1a;一个案子从收到材料到最终归档&#xff0c;中间要经过立案、排期、取证、文书起草、审核、盖章、送达、开庭、归档这么一串流程。传统做法是什么&#xff1f;微信群接龙、Excel表格、共享文件夹、Outl…

2026/10/18 5:36:42 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →