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找到根文件系统后,会:
- 加载必要驱动;
- 解锁加密设备;
- 激活逻辑卷或阵列;
- 挂载真正的根文件系统;
- 从临时环境切换到真实系统;
- 启动真正的第一个用户空间进程。
如果根文件系统无法挂载,系统就无法进入后续的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中选中启动项后按编辑键,找到内核参数行,临时删除quiet和splash,再继续启动。
这次修改一般只影响当前启动,不会永久修改配置。
二十、如何临时修改内核启动参数
在GRUB菜单中,可以编辑当前启动项。
基本过程通常是:
- 选中Linux启动项;
- 进入编辑模式;
- 找到以
linux开头的行; - 修改行末的启动参数;
- 使用界面提示的按键继续启动。
可用于临时测试的参数包括:
- 移除
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;
- 删除配置文件。
即使系统最终恢复,也很难知道真正原因,后续问题可能再次出现。
更可靠的方法是:
- 记录当前现象;
- 确定卡在哪个阶段;
- 每次只改变一个关键变量;
- 保存错误日志;
- 验证修改结果;
- 成功后再永久应用;
- 保留一个可用的备用启动项。
二十八、Linux启动问题排查清单
遇到无法启动时,可以依次检查:
- 是否能看到主板固件界面;
- 固件能否识别系统磁盘;
- 是否能进入GRUB;
- GRUB是否能找到内核和initramfs;
- 旧内核是否能够启动;
- fallback initramfs是否能够启动;
- 移除
quiet splash后最后显示什么; - 使用
nomodeset后是否能够进入系统; - 根文件系统是否能被找到并挂载;
- 当前内核对应模块是否完整;
- 显卡驱动是否为当前内核成功构建;
- Secure Boot是否拒绝模块;
- systemd是否存在失败服务;
- 显示管理器是否启动;
- 是否能够切换到文本终端;
- 上一次启动日志记录了什么;
- 是否保留可用内核和恢复介质。
结语
Linux启动并不是一个不可分割的过程,而是多个阶段依次交接控制权:
固件初始化硬件
→ 引导器加载内核
→ 内核初始化系统
→ initramfs找到根分区
→ systemd启动服务
→ 显示管理器启动图形界面
不同阶段发生故障,会留下不同现象。
看不到主板画面,通常应先检查硬件和固件;能看到GRUB但启动后黑屏,应重点检查内核、initramfs和显卡驱动;能够进入命令行但没有桌面,则应检查显示管理器和图形会话。
只要先判断系统卡在哪一次“控制权交接”,Linux启动故障就不再只是笼统的“开不了机”,而会变成一个能够逐层缩小范围的问题。
- 点赞
- 收藏
- 关注作者
评论(0)