☰
Linux引导流程与故障修复:从GRUB到密码重置实战
2026/10/19 12:06:41 网站建设 项目流程

直接开始。今天聊聊Linux引导和修复,这应该是每个Linux用户迟早都要面对的一课。我见过太多人,平时用得挺顺,某天开机突然黑屏或者停在一个奇怪的命令行界面,然后就懵了,要么重装系统,要么干着急。其实Linux的引导流程和修复手段是有套路可循的,今天一次性讲清楚,从引导流程到密码重置再到系统救援,希望你看完之后,遇到问题能自己动手搞定。

先说清楚这篇实践笔记适合谁。如果你刚接触Linux,那你能在本文建立起对引导过程的整体认识,遇到问题知道该往哪个方向排查;如果你已经有一定使用经验,但没系统梳理过修复方案,那你可以直接按文章里的步骤操作,基本覆盖了日常90%的故障场景。所有步骤我都尽量写得可以直接照做,不绕弯子。

1. 引导流程拆解:搞懂开机后到底发生了什么

Linux修复这件事,我觉得第一关不是背命令,而是理解引导的整个链路。你对流程理解得越透彻,遇到故障时定位就越快。

1.1 从按下电源键到登陆界面的完整链路

Linux启动大致可以拆成这么几个阶段:

  1. BIOS或UEFI固件自检,初始化硬件,然后根据启动顺序找到启动介质。
  2. 启动介质上读取引导加载程序,常见的就是GRUB2,它负责加载内核镜像。
  3. 内核接管系统,完成硬件初始化、驱动程序加载,然后挂载根文件系统。
  4. 内核启动第一个用户态进程systemd,PID为1,再由它并行启动其他服务和目标单元。
  5. 最后启动登录管理器或者字符终端,等待用户输入账号密码。

你不需要把每个环节的所有细节都背下来,但一定要知道每个阶段大概花了多长时间。排查的时候,如果开机卡在某个地方,你要能判断是卡在GRUB菜单、内核解压阶段、还是systemd启动阶段。

实际排查有个很实用的经验:如果开机过程中画面停住不动,按一下大写锁定键,观察键盘灯是否切换。如果键盘灯正常切换,说明内核已经跑起来了,问题多半出在驱动、文件系统挂载或者服务启动上。如果键盘灯完全没反应,大概率是内核还没起来,或者CPU、内存、PCIe这类硬件初始化出了问题。

1.2 GRUB2在引导过程中扮演的角色

GRUB2是目前绝大多数Linux发行版默认的引导加载程序。它对用户最大的价值是两个层级:一是可以选择启动哪个内核版本,二是能在内核启动前传递参数或进入救援模式。

在GRUB2菜单界面,按下字母e键可以编辑启动项,这在实际修复中超级常用。比如你改了内核参数导致开不了机,可以在GRUB层面把出错的参数删掉再启动,不用急着跑救援模式。按下字母c键可以进入GRUB命令行,如果GRUB配置文件损坏或者硬盘分区变化,你可以手动指定根分区、加载内核。

这里有个细节值得留意:GRUB2的配置文件是/boot/grub2/grub.cfg(不同发行版可能有差异),但真正不建议手动改这个文件。它通常由grub2-mkconfig命令根据/etc/default/grub和/etc/grub.d/下的脚本自动生成。你手动改了/etc/default/grub后,需要重新生成配置才能生效。

注意:在修改任何和引导相关的配置之前,建议先在脑子过一遍恢复方案。比如你改了内核启动参数,要知道怎么进GRUB编辑临时参数;你改了fstab,要知道怎么进紧急模式或救援模式把改动回滚。

2. root用户忘记密码:三种场景下的恢复方案

root密码找回,基本都是靠进入一个不依赖原系统密码验证的环境,然后直接重设密码。核心思路都一样:绕过正常登录认证,获得一个可以写/etc/shadow文件的环境。

2.1 进入单用户模式的传统做法

单用户模式是SysVinit时代就存在的概念,在systemd时代对应的启动目标叫rescue.target。它会在不启动任何网络服务、不加载多余服务的环境下,直接给你一个root shell,这在修复文件系统、重置密码时非常有用。

传统做法是:在GRUB2菜单界面选中内核启动项,按字母e进入编辑模式,找到以linux开头的那一行,在行尾追加一个单词single,然后按Ctrl+x启动。系统会进入单用户模式,直接以root身份给你一个shell,这时执行passwd命令就可以重置密码了。

需要提醒的是,有的发行版在单用户模式下/文件系统是以只读方式挂载的,直接改密码可能提示只读文件系统错误。你需要在shell里先执行一下重新挂载命令,把根分区改成可读写,然后再执行passwd:

mount -o remount,rw / passwd root

这条mount -o remount,rw /命令在救援模式下也非常重要,说是救命命令也不为过。

2.2 使用rd.break参数强制进入紧急状态

在涉及SELinux的系统中,直接进入单用户模式有时会遇到麻烦,因为重置密码后SELinux上下文可能不正确,导致后续无法正常登录。这时候更推荐的做法是修改内核启动参数,加入rd.break,让systemd在处理根文件系统挂载阶段强制中断,进入一个临时的initramfs shell。

具体步骤是:同样在GRUB2界面按e编辑,找到linux开头的那一行,在行尾追加rd.break,然后Ctrl+x启动。系统会停在一个类似switch_root:/#的提示符下。这是initramfs环境,此时根系统尚未完全切换。

在这个临时shell里依次执行:

mount -o remount,rw /sysroot chroot /sysroot passwd root touch /.autorelabel exit exit

第一条命令让真正的根文件系统可写,第二条命令切换到真实根环境,第三条重置密码。touch /.autorelabel这个操作专门针对启用了SELinux的系统,作用是让系统在下次重启时自动重新标记文件的安全上下文,避免因重置密码导致SELinux上下文错误而无法登录。

一定要记得执行两次exit。第一次退出chroot环境,第二次退出initramfs shell,系统会继续执行剩余的引导流程完成启动。这个方案的优点是对各种发行版的兼容性都不错,即使SELinux开着也不会卡在登录问题上。

2.3 通过系统安装镜像进入救援模式

如果GRUB本身坏了,或者引导加载程序完全无法正常工作,单用户模式和rd.break就算不上了,因为根本走不到内核加载这一步。这时最可靠的办法是用系统安装U盘或安装ISO,选择救援模式或者试用环境,然后挂载硬盘上的根分区,再用chroot进去修复。

流程大致是:启动到安装介质,选择救援模式(不同发行版名称略有不同,有的叫Rescue a system,有的直接给Shell)。选好后,安装程序会尝试自动发现硬盘上的Linux系统,然后挂载到某个路径下。有的发行版会直接帮你chroot进去,有的就停在shell里让你手动处理。

手动操作的关键步骤:

# 查看磁盘分区情况 lsblk # 例如根分区是 /dev/sda2 mkdir -p /mnt/sysroot mount /dev/sda2 /mnt/sysroot # 如果有单独的/boot分区,也需要挂载,例如 /dev/sda1 mount /dev/sda1 /mnt/sysroot/boot # 为了chroot后能联网、能解析DNS,可以挂载这些虚拟文件系统 mount --bind /dev /mnt/sysroot/dev mount --bind /proc /mnt/sysroot/proc mount --bind /sys /mnt/sysroot/sys # 切换进真实环境 chroot /mnt/sysroot

chroot进去之后,你面对的就是一个完整可写的系统环境。这时可以执行passwd重置密码、可以重修GRUB引导(比如grub2-install /dev/sda)、可以修复fstab配置,基本能做的事情比单用户模式全面得多。

注意:mount --bind /dev的意思是复用当前救援环境的/dev目录映射到目标根分区下,这样chroot环境里的设备节点才能正常使用。这一步不能省,否则你在chroot里可能看不到磁盘设备,修GRUB也会报错。

3. 系统引导故障排查与修复

密码忘掉算是小问题,更闹心的是开机直接停在GRUB界面,或者出现error: file not found之类的报错。这部分的核心是恢复GRUB到可用的状态。

3.1 GRUB引导程序损坏的常见表现

我碰到过的引导加载程序故障,大致有几类:

  • 开机直接进入grub>提示符,不再继续加载菜单。
  • 开机提示error: no such partition。
  • 开机提示error: file '/boot/grub2/i386-pc/normal.mod' not found。
  • 开机直接黑屏或者重启。

以上这些情况,基本可以判断是GRUB的引导代码、核心模块或者配置文件出了问题。有可能是你在安装双系统时动过分区,有可能是升级内核的时候中断了,也有人是因为误删了/boot下的文件,还有人是中了引导病毒(较少见)。

需要区分一个概念:GRUB的引导代码和GRUB配置不是一回事。引导代码安装在磁盘的引导扇区或EFI系统分区里,作用是去读取后续的模块和配置文件。配置文件是grub.cfg,负责生成菜单和加载内核。如果只是配置文件坏了,你在grub>提示符下手动指定内核路径,还是可以把系统带起来的。如果引导代码坏了,那就必须用救援方式重新安装。

3.2 在grub>提示符下手动引导系统

有时候系统会停在grub>的提示符下,这时候不用慌,可以使用GRUB提供的命令手动加载内核启动。前提是你得知道系统根分区和内核文件在哪。

在grub>提示符下,先执行:

ls

这条命令会列出GRUB能识别到的所有分区,输出类似(hd0) (hd0,msdos1) (hd0,msdos2)。然后逐个分区查看文件内容,找出/boot所在分区:

ls (hd0,msdos1)/ ls (hd0,msdos2)/

一般情况下,能在一级目录下看到grub2目录或者vmlinuz-*文件的分区,就是/boot所在分区。如果/boot没有单独分区,那这些文件就在根分区下的/boot目录里。

确认分区后,手动加载内核和initramfs:

set root=(hd0,msdos2) linux /boot/vmlinuz-5.14.0-362.el9.x86_64 root=/dev/sda2 initrd /boot/initramfs-5.14.0-362.el9.x86_64.img boot

执行完boot后,系统会尝试加载内核并启动。这里要注意内核的具体文件名要以ls实际看到的为准,不用死记硬背。

如果你能通过这种方式把系统带起来,进入系统后就可以重新生成GRUB配置并重装引导代码,彻底修复问题。

3.3 重新生成GRUB配置并重装引导代码

通过救援模式或手动引导进入系统后,需要做两件事:重新生成grub.cfg配置文件,然后把GRUB重新安装到分区对应的磁盘上。

首先生成配置:

grub2-mkconfig -o /boot/grub2/grub.cfg

部分发行版使用的是grub-mkconfig,还有一部分用的是update-grub命令,它其实也是封装了grub-mkconfig。执行后,屏幕会滚动输出,提示找到了哪些内核镜像和系统版本,这个输出过程检查一下和你实际系统情况是否一致。

然后安装引导程序到主引导记录或EFI分区:

Legacy BIOS引导方式的机器执行:

grub2-install /dev/sda

这里指定的是整块磁盘设备,不是分区号。UEFI引导方式的机器则要确认EFI系统分区的挂载位置,以CentOS/RHEL系为例:

grub2-install /dev/sda

UEFI下还需要确保EFI分区里存在grubx64.efi之类的文件。部分发行版会用grub2-install --target=x86_64-efi来指定安装目标。

注意:Legacy BIOS和UEFI是两种完全不同的引导方式,千万别搞混。UEFI机器的磁盘是GPT分区表,引导程序会写到独立的ESP分区;Legacy BIOS则直接装在磁盘的MBR区域。你用错方式装引导,大概率装了也启动不了。

3.4 /boot分区损坏或文件缺失的处理

如果/boot目录下的文件大量损坏或丢失,先别急着重装系统。只要内核和initramfs在,系统还能从这些文件引导起来;如果连内核都丢了,那就要从其他地方复制一份内核和initramfs文件进去。

最省事的场景是:你在救援模式里,可以从安装介质上的同名内核文件复制。不同发行版的路径不完全一样,一般就在安装镜像的/images/pxeboot/或/images/目录下。实在不行,找一台同版本同架构的机器,拷一份vmlinuz和initramfs文件过来,放到/boot目录下,然后再重新生成GRUB配置。注意内核版本号最好和系统已安装的内核模块版本保持一致,不然模块加载容易出问题。

/boot分区空间不足也是一类容易被忽略的问题。有些系统从来没清理过旧内核,/boot满了以后,新内核的initramfs生成不完整,重启后就可能出问题。定期执行类似清理操作很有必要,保留当前内核和最近几个旧内核即可。不同发行版清理命令不同,Debian系可以用apt autoremove --purge,Red Hat系可以手动使用包管理器移除旧内核包,也可以使用dnf autoremove清理。

4. 文件系统损坏与启动卡死问题排查

引导加载程序正常,但系统启动到一半卡住或者直接进入紧急模式,这个问题很多时候出在根文件系统上,或者某个关键挂载项上。

4.1 启动进入emergency mode的处理

不少发行版在文件系统挂载失败、某关键单元启动失败时,会在最后阶段把用户丢到emergency mode,也就是紧急模式。这是比救援模式还要基础的一个状态,除了根文件系统是只读挂载外,几乎不启动任何服务。

到这一步,屏幕会提示你输入root密码。如果root密码你已经加密过或记得,直接输入进入即可;如果你忘了root密码,那还是绕不开上面的重置方案。进入紧急模式后,第一件事就是看日志:

journalctl -xb

这个命令会从本次启动开始输出系统日志,包括哪一步出错、哪个服务挂了、哪个文件系统挂载失败了。如果你的错误是挂载失败,重点看和mount相关的关键字。

日志太长可以用管道过滤下:

journalctl -xb | grep -i error journalctl -xb | grep -i mount

排查具体原因后修复,修复完记得把根文件系统重新挂载为可读写,然后退出紧急模式继续启动:

mount -o remount,rw / exit

4.2 根文件系统损坏时的fsck修复

非正常关机、强制断电等情况,容易造成文件系统不一致。系统启动时如果检测到文件系统有错误标记,可能会拒绝挂载直接丢你进紧急模式。

修复方式是在单用户模式或救援模式里执行fsck。关键点是,检查文件系统时,该分区不能处于挂载状态。所以你需要在未挂载的状态下对根分区执行文件系统检查,在救援模式里手动挂载之前检查是一个好时机。

经典的流程是:通过安装盘进入救援模式,找到根分区对应的设备节点,先不要自动挂载,执行:

fsck -y /dev/sda2

-y参数会自动对所有检查提示回答“是”。第一次执行时会有心理预期,因为屏幕上会刷出来一堆修复记录,要看仔细是不是分区被正常修复了。好的结果是类似clean、FILE SYSTEM IS NOW CLEAN之类的提示。修复完成后,重新挂载该分区,检查数据是否完整。

注意:绝对不要在系统运行期间对已经挂载的分区执行fsck,这会造成更严重的文件系统损坏,甚至数据丢失。很多人不清楚这点,白天挂着系统跑着跑着觉得磁盘有点问题就顺手fsck了,这种操作比你想象的更危险。

XFS文件系统格式比较特殊,CentOS/RHEL系默认用XFS,它不支持在线fsck,检测方式是通过记录日志来判断是否需要回放。XFS如果遇到问题,一般不是直接执行fsck,而是先用xfs_repair工具处理,同样要求分区处于未挂载状态。

4.3 /etc/fstab配置错误引发的启动问题

还有一个非常高频的原因,是你自己改了/etc/fstab,写错UUID或者写错挂载参数,导致系统启动时挂载失败,直接卡住或者进入紧急模式。这种问题常常发生在你新加了一块硬盘、调整了分区之后。

最痛苦的是明明配置错了,系统又卡在紧急模式,fstab又是只读的,你连改都改不了。处理方式和之前说的一样:进入紧急模式、执行mount -o remount,rw /、编辑fstab。

如果fstab里挂载点对应的磁盘设备完全不存在,有一种处理方式是把那一行通过注释关掉,注释之后重启就不再尝试挂载。如果UUID不对,用blkid命令查看实际分区的UUID,然后改过来。

修改完成后,建议在退出前执行一下mount -a,模拟一下fstab里所有尚未挂载的条目,确认没有错误再重启:

mount -a

这个命令会读取fstab把所有没挂上的条目尝试挂载一遍。如果有问题会直接报错,这样你就不用反复重启来回试错了。

这里送你一个小技巧:以后修改fstab之前,先备份一份原文件:

cp /etc/fstab /etc/fstab.bak

就一行命令的事,真出了问题,你可以在救援模式里轻松回滚,比折腾什么都要省时间。

5. 常用修复命令与排查技巧补充

最后这一部分,把前面零散提到的命令集中整理一下,再分享一点排查经验,让你把这些工具串成一个有机的整体。

5.1 一张表看懂关键修复命令

命令作用使用的典型场景
mount -o remount,rw /将根文件系统重新挂载为读写紧急模式、单用户模式下需要修改配置或重置密码
chroot /mnt/sysroot切换根目录到目标系统救援模式下直接操作原系统
grub2-mkconfig -o /boot/grub2/grub.cfg重新生成GRUB配置文件内核更新后菜单不更新、GRUB配置损坏
grub2-install /dev/sda安装GRUB引导代码到磁盘MBR引导损坏、开机停在grub提示符
fsck -y /dev/sda2检查和修复文件系统错误非正常关机导致文件系统不一致
journalctl -xb查看本次启动的详细日志启动失败需要定位具体报错项
mount -a按fstab重新挂载所有条目修改fstab后验证配置正确性
blkid查看分区的UUID和文件系统类型确认fstab里的UUID是否正确
lsblk查看块设备及挂载关系快速确认分区结构和设备号

5.2 SELinux开启状态下密码重置后的上下文问题

如果你用的发行版启用了SELinux,密码重置后会遇到一个很多人踩过的坑:你用passwd命令成功重置了密码,但重启后系统还是提示无法登录,或者登录后行为异常。这很大可能是SELinux上下文标记与重置前的文件属性不一致。

最稳的处理方式就是前面在rd.break方案里提到的,创建/.autorelabel文件:

touch /.autorelabel

有这个文件在,系统重启时会自动扫描根文件系统并重新生成正确的SELinux上下文。这个过程可能会持续几分钟,看起来就像系统在启动过程中长时间卡住,其实它在后台做标记工作,耐心等它跑完就行。

如果你是在救援模式的chroot环境下重置密码,也要记得在chroot环境里创建这个文件。不然下次重启还是进不了系统。

5.3 快速判断引导方式是Legacy BIOS还是UEFI

这个判断其实不难,lsblk和ls /sys/firmware/efi组合使用即可。如果/sys/firmware/efi目录存在,说明当前是从UEFI方式引导的;如果这个目录不存在,基本是Legacy BIOS引导。在救援模式里也要注意这个差异,因为它在决定GRUB要装到哪个位置。

如果系统原本是UEFI引导,你在修复GRUB时却没确认这个目录存在,然后误把GRUB按Legacy模式安装到MBR,大概率直接开不了机。

5.4 平时可以做的事:减少重启修复的概率

我觉得最好的修复,其实是预防。这里分享几个我平时会做的加固习惯:

  1. 修改关键配置前先备份,尤其是有明显风险的fstab、/etc/default/grub这类文件。
  2. 磁盘分区发生变化、新装系统、迁移机器之后,第一时间重新生成GRUB配置并安装一次引导程序。
  3. 内核更新后不要着急删旧内核,保留最近一个可以正常启动的版本,万一新内核出问题还能回退。
  4. 在启动菜单中留意系统自动生成的内核回退选项,很多发行版在内核更新后会自动保留一个旧内核菜单项,你的启动菜单可能会多出几行,这是保命选项。
  5. 装机完成后做一次引导备份,比如备份GRUB配置、记录分区的UUID和完整的lsblk输出。这些信息在你需要救援的时候能省去大量排查时间。

最后再分享一个经验,每次帮别人修复引导时,我都会把出问题的过程在脑子里走一遍:是GRUB问题、内核问题、还是文件系统问题。有了这个判断再动手,效率完全不同。有时候开机卡住不是什么严重故障,可能只是某个服务启动太慢,多等几分钟就好了。很多人一看到屏幕停住就焦虑,急着重启,反而把一个小问题折腾成大问题。先看键盘灯,再看日志,最后再动手,这个顺序我建议你也记住。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询