Linux启动流程详解:从按下电源到进入桌面发生了什么

举报
yd_232225224 发表于 2026/09/19 11:09:03 2026/09/19
【摘要】 当Linux系统无法正常启动时,用户看到的现象可能非常相似:显示器始终没有信号;主板标志之后黑屏;看不到GRUB菜单;选择系统后卡在厂商标志;屏幕停留在一行内核错误;可以进入命令行,却进不了桌面;使用旧内核可以启动,新内核却无法启动。这些现象可能发生在完全不同的启动阶段。如果不了解Linux启动流程,就容易把引导器、内核、显卡驱动和桌面环境问题混在一起。一台典型Linux计算机从开机到进入桌...

当Linux系统无法正常启动时,用户看到的现象可能非常相似:

  • 显示器始终没有信号;
  • 主板标志之后黑屏;
  • 看不到GRUB菜单;
  • 选择系统后卡在厂商标志;
  • 屏幕停留在一行内核错误;
  • 可以进入命令行,却进不了桌面;
  • 使用旧内核可以启动,新内核却无法启动。

这些现象可能发生在完全不同的启动阶段。如果不了解Linux启动流程,就容易把引导器、内核、显卡驱动和桌面环境问题混在一起。

一台典型Linux计算机从开机到进入桌面,大致会经历:

通电
→ 固件初始化
→ 启动引导器
→ 加载Linux内核
→ 加载initramfs
→ 挂载真正的根文件系统
→ 启动systemd
→ 启动系统服务
→ 启动登录界面与桌面环境

定位启动故障的关键,就是判断系统究竟卡在了哪一步。

一、第一阶段:硬件通电与固件初始化

按下电源按钮后,CPU并不会直接运行Linux。主板固件会首先接管计算机。

现代计算机通常使用UEFI,较老设备可能使用传统BIOS。

固件主要负责:

  • 初始化CPU;
  • 检测内存;
  • 初始化显卡输出;
  • 枚举存储设备;
  • 检测键盘和其他基础硬件;
  • 读取启动顺序;
  • 找到可启动程序。

开机时看到的主板厂商标志,通常属于固件阶段,而不是Linux界面。

如果连主板标志都看不到,问题通常还没有进入Linux启动流程,应优先检查:

  • 显示器和线缆;
  • 显卡输出接口;
  • 显卡供电;
  • 内存安装;
  • 主板状态;
  • 固件显示输出设置;
  • 硬件自检指示灯。

此时修改GRUB或内核参数通常没有意义,因为Linux尚未开始运行。

二、UEFI如何找到启动程序

在UEFI模式下,磁盘上通常存在一个EFI系统分区。该分区使用固件能够识别的文件系统,里面保存引导器的EFI可执行文件。

UEFI固件会读取启动项信息,然后加载对应的引导程序。

可以将其简化为:

UEFI固件
→ EFI系统分区
→ 引导程序

Linux系统可以使用不同引导器,例如GRUB或其他UEFI启动管理器。

如果固件能看到磁盘,却找不到启动项,可能出现:

  • 直接进入固件设置;
  • 提示没有可启动设备;
  • 自动进入其他系统;
  • 进入引导器救援模式。

常见原因包括:

  • EFI系统分区损坏;
  • 引导文件丢失;
  • 固件启动项被删除;
  • 磁盘启动顺序变化;
  • 系统安装模式与固件模式不一致;
  • Secure Boot拒绝加载未受信任的引导文件。

三、GRUB负责什么

GRUB是常见的Linux引导器。

它主要负责:

  • 显示可启动系统或内核列表;
  • 读取启动配置;
  • 加载Linux内核;
  • 加载initramfs;
  • 向内核传递启动参数;
  • 将控制权交给内核。

典型启动项包含三类重要信息:

Linux内核文件
initramfs文件
内核命令行参数

例如,GRUB需要告诉内核:

  • 根文件系统在哪里;
  • 是否启用安静启动;
  • 是否显示启动画面;
  • 是否使用特定显卡参数;
  • 是否进入指定systemd目标。

如果GRUB菜单没有显示,不一定意味着GRUB不存在。它可能被设置为隐藏菜单,并在倒计时结束后自动启动默认选项。

四、GRUB界面和系统桌面不是一回事

GRUB有自己的显示模式,它运行在Linux内核之前。

因此可能出现以下情况:

GRUB能显示
→ 选择Linux后黑屏

这通常说明:

  • 固件基本输出正常;
  • 引导器能够工作;
  • 问题更可能发生在内核或显卡驱动阶段。

也可能出现:

主板标志能显示
→ GRUB阶段显示器无信号

这可能与GRUB使用的分辨率、固件提供的图形接口、显卡输出选择或多显卡环境有关。

不能因为GRUB看不到,就直接认定Linux内核损坏。

五、GRUB如何启动Linux内核

用户选择启动项后,GRUB会把Linux内核和initramfs读入内存,再传递启动参数。

随后,GRUB的任务基本结束,控制权交给Linux内核。

可以理解为:

GRUB
→ 把内核放入内存
→ 把initramfs放入内存
→ 提供启动参数
→ 启动内核

如果内核文件或initramfs文件不存在,GRUB可能直接报错。

如果启动配置仍然引用已经删除的旧内核,也可能无法继续启动。

六、Linux内核刚启动时做什么

内核开始运行后,会执行一系列底层初始化工作:

  • 解压内核映像;
  • 初始化内存管理;
  • 初始化CPU调度;
  • 检测硬件;
  • 加载内核参数;
  • 初始化中断;
  • 初始化设备驱动框架;
  • 建立临时文件系统;
  • 准备挂载根文件系统。

此时系统尚未进入完整用户空间,也没有普通桌面环境。

屏幕上滚动的大量文字大多是内核消息。即使启用了图形启动画面,这些信息也仍然可能在后台产生。

可以在系统启动后查看内核日志:

dmesg

或者:

journalctl -k -b

其中-b表示查看本次启动。

七、initramfs是什么

initramfs是启动早期使用的临时根文件系统。

它通常包含:

  • 必要的存储驱动;
  • 文件系统驱动;
  • 磁盘加密工具;
  • RAID或逻辑卷工具;
  • 查找根分区的脚本;
  • 切换到真实根文件系统所需的程序。

为什么内核不能直接挂载真正的根分区?

因为根分区可能位于:

  • 特定存储控制器后面;
  • 加密卷中;
  • RAID设备中;
  • 逻辑卷中;
  • 特殊文件系统上。

如果访问根分区所需的驱动本身存放在根分区里,就会形成循环问题:

需要驱动才能读取根分区
但驱动又保存在根分区中

initramfs把启动必需的工具和驱动提前放入内存,从而解决这个问题。

八、initramfs损坏会有什么表现

如果initramfs缺少关键模块,系统可能无法找到根文件系统。

常见表现包括:

  • 找不到指定UUID;
  • 无法挂载根分区;
  • 提示找不到根设备;
  • 进入紧急命令行;
  • 内核等待设备很长时间;
  • 更新内核后无法启动,但旧内核仍能启动。

可能原因包括:

  • 生成initramfs时出错;
  • 存储驱动未被包含;
  • 文件系统模块缺失;
  • 磁盘加密配置错误;
  • 根分区标识发生变化;
  • 内核与模块版本不匹配。

重新安装内核或重新生成initramfs,有时能够解决这类问题,但应该先查看具体错误,而不是盲目重装整个系统。

九、普通initramfs与fallback initramfs

部分发行版会同时生成普通initramfs和fallback initramfs。

普通版本通常根据当前硬件和配置,只包含启动所需模块,因此体积较小。

fallback版本可能包含更广泛的驱动,适合在普通initramfs遗漏模块时尝试启动。

两者并不是两个不同内核,而可能是同一内核配合不同的早期启动环境。

如果普通启动项失败、fallback启动项成功,往往说明:

  • 内核本身可能可以运行;
  • 普通initramfs可能缺少某些必要模块;
  • initramfs生成配置需要检查。

fallback只能作为诊断和临时恢复方式,最终仍应修复正常启动所需的模块配置。

十、根文件系统是如何找到的

内核命令行通常会提供根文件系统位置,例如使用UUID标识。

使用UUID而不是固定设备名,是因为设备名可能随着硬件顺序变化。

例如,同一块磁盘在不同启动环境中不一定始终使用完全相同的设备名称,但文件系统UUID通常保持稳定。

initramfs找到根文件系统后,会:

  1. 加载必要驱动;
  2. 解锁加密设备;
  3. 激活逻辑卷或阵列;
  4. 挂载真正的根文件系统;
  5. 从临时环境切换到真实系统;
  6. 启动真正的第一个用户空间进程。

如果根文件系统无法挂载,系统就无法进入后续的systemd阶段。

十一、PID 1为什么重要

根文件系统准备完成后,内核会启动用户空间中的第一个进程。

在许多现代Linux发行版中,这个进程是systemd,其进程号为1。

可以查看:

ps -p 1 -o pid,comm,args

PID 1承担重要职责,包括:

  • 启动系统服务;
  • 管理服务依赖;
  • 挂载其他文件系统;
  • 启动网络;
  • 管理登录会话;
  • 收集服务状态;
  • 回收孤儿进程;
  • 执行关机和重启流程。

如果内核能够运行,却无法启动PID 1,系统通常会报出严重错误,无法进入正常用户空间。

十二、systemd不是简单地按顺序启动服务

systemd会根据依赖关系并行启动多个单元。

常见单元类型包括:

  • service:系统服务;
  • socket:套接字;
  • mount:挂载点;
  • device:设备;
  • target:一组启动目标;
  • timer:定时任务。

系统启动并不一定是:

服务A完成
→ 服务B完成
→ 服务C完成

更可能是:

满足依赖后,同时启动多个服务

这样可以缩短启动时间,但也意味着日志中的事件可能交错出现。

查看启动失败的服务:

systemctl --failed

查看某个服务状态:

systemctl status 服务名

查看本次启动日志:

journalctl -b

十三、target是什么

systemd使用target表示一组系统状态和依赖关系。

常见目标可以简单理解为:

multi-user.target
→ 多用户命令行环境

graphical.target
→ 图形界面环境

graphical.target通常会依赖multi-user.target,再额外启动显示管理器。

查看默认目标:

systemctl get-default

如果默认目标是命令行模式,系统即使正常启动,也不会自动进入图形登录界面。

临时进入多用户命令行目标,可以在启动参数中指定相应目标;永久修改默认目标则应使用systemd提供的配置命令。

十四、从systemd到登录界面

系统基础服务启动后,图形系统还需要继续完成:

启动显卡驱动
→ 启动显示服务器或显示协议环境
→ 启动显示管理器
→ 显示登录界面
→ 启动桌面会话

显示管理器负责提供图形登录界面,并启动用户选择的桌面会话。

因此,如果系统能进入命令行,却没有图形登录界面,可能是:

  • 显示管理器没有启动;
  • 显卡驱动加载失败;
  • 图形会话启动失败;
  • Wayland或X11配置异常;
  • 桌面环境组件损坏;
  • 默认target不是图形目标。

此时内核和根文件系统通常已经正常工作,没有必要直接修复GRUB。

十五、显卡驱动为什么容易影响启动

图形启动涉及固件、内核、内核模块、用户空间驱动和桌面环境多个层次。

专有显卡驱动通常需要加载与当前内核匹配的内核模块。

如果内核更新了,而显卡模块没有为新内核正确构建,可能出现:

  • 内核模块找不到;
  • 模块版本不匹配;
  • 显示管理器启动失败;
  • 图形界面黑屏;
  • 系统卡在启动标志;
  • 旧内核可以启动,新内核不能启动。

这也是为什么切换旧内核有时能够暂时恢复系统:旧内核仍然拥有可用的显卡模块。

但旧内核启动成功只是重要诊断信息,不代表问题已经彻底解决。仍然需要修复新内核对应的驱动模块。

十六、内核模块必须与内核匹配

内核模块通常针对特定内核版本构建。

查看当前运行内核:

uname -r

模块一般位于与内核版本对应的目录中。

如果系统安装了新内核,却没有对应驱动模块,就可能在启动新内核时失败。

使用DKMS的驱动可以在内核更新后自动为新内核重新构建模块,但前提是:

  • 内核头文件已经安装;
  • 编译工具正常;
  • 驱动源码支持当前内核;
  • DKMS构建过程没有报错;
  • initramfs包含了正确模块;
  • Secure Boot没有拒绝模块。

内核更新完成并不代表所有第三方模块都一定已经准备好。

十七、Secure Boot可能阻止模块加载

启用Secure Boot后,系统可能只允许加载受信任签名的启动程序、内核或内核模块。

如果第三方显卡驱动模块没有正确签名,可能出现:

  • 驱动已安装但无法加载;
  • 系统退回基础显示驱动;
  • 图形界面无法启动;
  • 日志中出现验证或密钥相关错误。

这种问题与“驱动文件是否存在”不同。文件可能已经安装,只是内核安全策略拒绝加载。

排查时需要同时确认:

  • Secure Boot是否启用;
  • 模块是否签名;
  • 签名密钥是否被系统信任;
  • 内核日志是否记录拒绝原因。

十八、nomodeset是什么

nomodeset是一个常见的临时内核参数。

正常情况下,内核会在启动早期启用显卡模式设置,配置分辨率、刷新率和显示输出。

加入nomodeset后,内核会尽量避免正常的内核模式设置,让系统使用较基础的显示方式继续启动。

它适合用于判断:

黑屏是否与显卡驱动或内核模式设置有关?

如果加上nomodeset后系统能够进入命令行或低分辨率桌面,说明问题很可能与显卡驱动有关。

nomodeset通常不是长期解决方案,因为它可能导致:

  • 分辨率受限;
  • 图形加速不可用;
  • 多显示器功能异常;
  • 亮度调节失效;
  • 桌面性能下降;
  • 专有驱动无法正常接管。

正确做法是利用它临时进入系统,再修复显卡驱动和内核模块。

十九、quiet和splash为什么会隐藏错误

许多桌面发行版默认在内核参数中加入:

quiet splash

quiet会减少启动信息输出,splash会显示图形启动画面。

这能让开机画面更简洁,但系统卡住时,用户可能只看到一个静止标志,无法知道具体错误。

排查启动问题时,可以临时移除这两个参数,让内核和systemd显示更多信息。

通常可以在GRUB中选中启动项后按编辑键,找到内核参数行,临时删除quietsplash,再继续启动。

这次修改一般只影响当前启动,不会永久修改配置。

二十、如何临时修改内核启动参数

在GRUB菜单中,可以编辑当前启动项。

基本过程通常是:

  1. 选中Linux启动项;
  2. 进入编辑模式;
  3. 找到以linux开头的行;
  4. 修改行末的启动参数;
  5. 使用界面提示的按键继续启动。

可用于临时测试的参数包括:

  • 移除quiet splash以显示详细日志;
  • 加入nomodeset测试显卡模式设置问题;
  • 指定systemd目标进入命令行;
  • 临时禁用某些驱动参数。

临时修改成功后,如果需要长期使用,应再修改实际引导配置并重新生成启动菜单。不要只依赖每次手动编辑。

二十一、为什么旧内核能启动

如果旧内核可以启动,新内核不能启动,可以优先怀疑:

  • 新内核驱动兼容性;
  • 第三方模块构建失败;
  • initramfs生成失败;
  • 新内核回归问题;
  • 显卡驱动不支持该内核;
  • Secure Boot签名问题;
  • 新内核参数与旧配置冲突。

这通常说明磁盘、根文件系统和大部分用户空间仍然正常。

保留一个已知可用的旧内核是很有价值的恢复手段。它可以让用户先进入系统,再修复新内核。

但旧内核不应无限期不更新。需要关注其维护状态和安全更新,并在新内核修复后完成迁移。

二十二、安装多个内核是否影响滚动更新

多个内核通常可以并存。

例如,系统中可以同时安装:

  • 当前主线内核;
  • 长期支持内核;
  • 针对桌面响应优化的内核。

每个内核拥有自己的文件、模块和initramfs。更新系统时,已安装的内核包会按照各自的软件包规则更新。

切换到旧内核运行,并不必然停止其他内核包更新。但如果使用的是固定版本包、已停止维护的软件源或手动复制的内核文件,则需要单独确认更新机制。

选择备用内核时,重点不是版本数字越旧越好,而是:

  • 是否仍受发行版维护;
  • 是否有可用安全更新;
  • 是否拥有对应驱动模块;
  • 是否与当前硬件兼容。

二十三、系统卡在不同位置意味着什么

完全没有主板画面

优先检查硬件、固件和显示输出。

有主板画面,没有引导器

检查启动顺序、EFI启动项和引导文件。

能进入GRUB,选择系统后立即黑屏

优先检查内核参数、显卡模式设置、内核和initramfs。

显示找不到根设备

检查initramfs、磁盘驱动、UUID、加密卷和文件系统。

进入紧急模式

查看挂载失败、文件系统错误和关键服务日志。

能进入命令行,进不了桌面

检查显示管理器、显卡驱动、桌面环境和图形会话。

只有某个内核不能启动

检查该内核对应的模块、initramfs和驱动兼容性。

卡在关机或重启

可能与服务无法停止、设备驱动、文件系统卸载或固件电源管理有关,不一定是启动问题。

二十四、查看本次和上次启动日志

查看本次启动日志:

journalctl -b

查看上一次启动日志:

journalctl -b -1

只看本次内核日志:

journalctl -k -b

查看高优先级错误:

journalctl -b -p err

查看失败服务:

systemctl --failed

如果系统卡死后被强制关机,上一次启动日志是否完整取决于日志是否持久化到磁盘。没有持久化配置时,重启后可能丢失部分重要信息。

二十五、如何分析启动耗时

系统能够启动,但速度很慢时,可以使用:

systemd-analyze

查看固件、引导器、内核和用户空间各阶段耗时。

查看启动最慢的单元:

systemd-analyze blame

查看关键依赖链:

systemd-analyze critical-chain

需要注意,某个服务显示耗时很长,不一定代表它单独阻塞了整个启动。systemd会并行启动多个服务,因此还需要结合关键依赖链判断。

二十六、Live系统与chroot为什么能修复启动问题

如果本机系统无法启动,可以使用Live系统进入一个临时Linux环境。

Live系统运行的是外部介质中的内核和用户空间,而不是硬盘中损坏的系统环境。

将硬盘上的根分区挂载后,再进入chroot,可以让命令在目标系统的文件目录结构中运行。

这样可以执行:

  • 重新安装内核;
  • 重新生成initramfs;
  • 修复引导器;
  • 更新配置;
  • 检查文件系统;
  • 修复软件包状态。

但chroot不等于完整启动目标系统。内核仍然来自Live环境,部分硬件、服务管理和挂载行为可能与真正启动时不同。

进入chroot前通常还需要正确挂载EFI分区以及设备、进程和系统相关的虚拟文件系统。

二十七、启动修复时不要同时改太多东西

启动问题最怕一次修改多个变量,例如同时:

  • 更换内核;
  • 重装显卡驱动;
  • 修改GRUB参数;
  • 修改显示管理器;
  • 切换Wayland和X11;
  • 删除配置文件。

即使系统最终恢复,也很难知道真正原因,后续问题可能再次出现。

更可靠的方法是:

  1. 记录当前现象;
  2. 确定卡在哪个阶段;
  3. 每次只改变一个关键变量;
  4. 保存错误日志;
  5. 验证修改结果;
  6. 成功后再永久应用;
  7. 保留一个可用的备用启动项。

二十八、Linux启动问题排查清单

遇到无法启动时,可以依次检查:

  • 是否能看到主板固件界面;
  • 固件能否识别系统磁盘;
  • 是否能进入GRUB;
  • GRUB是否能找到内核和initramfs;
  • 旧内核是否能够启动;
  • fallback initramfs是否能够启动;
  • 移除quiet splash后最后显示什么;
  • 使用nomodeset后是否能够进入系统;
  • 根文件系统是否能被找到并挂载;
  • 当前内核对应模块是否完整;
  • 显卡驱动是否为当前内核成功构建;
  • Secure Boot是否拒绝模块;
  • systemd是否存在失败服务;
  • 显示管理器是否启动;
  • 是否能够切换到文本终端;
  • 上一次启动日志记录了什么;
  • 是否保留可用内核和恢复介质。

结语

Linux启动并不是一个不可分割的过程,而是多个阶段依次交接控制权:

固件初始化硬件
→ 引导器加载内核
→ 内核初始化系统
→ initramfs找到根分区
→ systemd启动服务
→ 显示管理器启动图形界面

不同阶段发生故障,会留下不同现象。

看不到主板画面,通常应先检查硬件和固件;能看到GRUB但启动后黑屏,应重点检查内核、initramfs和显卡驱动;能够进入命令行但没有桌面,则应检查显示管理器和图形会话。

只要先判断系统卡在哪一次“控制权交接”,Linux启动故障就不再只是笼统的“开不了机”,而会变成一个能够逐层缩小范围的问题。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。