直接开始。今天聊聊Linux引导和修复这应该是每个Linux用户迟早都要面对的一课。我见过太多人平时用得挺顺某天开机突然黑屏或者停在一个奇怪的命令行界面然后就懵了要么重装系统要么干着急。其实Linux的引导流程和修复手段是有套路可循的今天一次性讲清楚从引导流程到密码重置再到系统救援希望你看完之后遇到问题能自己动手搞定。先说清楚这篇实践笔记适合谁。如果你刚接触Linux那你能在本文建立起对引导过程的整体认识遇到问题知道该往哪个方向排查如果你已经有一定使用经验但没系统梳理过修复方案那你可以直接按文章里的步骤操作基本覆盖了日常90%的故障场景。所有步骤我都尽量写得可以直接照做不绕弯子。1. 引导流程拆解搞懂开机后到底发生了什么Linux修复这件事我觉得第一关不是背命令而是理解引导的整个链路。你对流程理解得越透彻遇到故障时定位就越快。1.1 从按下电源键到登陆界面的完整链路Linux启动大致可以拆成这么几个阶段BIOS或UEFI固件自检初始化硬件然后根据启动顺序找到启动介质。启动介质上读取引导加载程序常见的就是GRUB2它负责加载内核镜像。内核接管系统完成硬件初始化、驱动程序加载然后挂载根文件系统。内核启动第一个用户态进程systemdPID为1再由它并行启动其他服务和目标单元。最后启动登录管理器或者字符终端等待用户输入账号密码。你不需要把每个环节的所有细节都背下来但一定要知道每个阶段大概花了多长时间。排查的时候如果开机卡在某个地方你要能判断是卡在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然后按Ctrlx启动。系统会进入单用户模式直接以root身份给你一个shell这时执行passwd命令就可以重置密码了。需要提醒的是有的发行版在单用户模式下/文件系统是以只读方式挂载的直接改密码可能提示只读文件系统错误。你需要在shell里先执行一下重新挂载命令把根分区改成可读写然后再执行passwdmount -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然后Ctrlx启动。系统会停在一个类似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/sysrootchroot进去之后你面对的就是一个完整可写的系统环境。这时可以执行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目录里。确认分区后手动加载内核和initramfsset 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/sdaUEFI下还需要确保EFI分区里存在grubx64.efi之类的文件。部分发行版会用grub2-install --targetx86_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 --purgeRed 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 / exit4.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 平时可以做的事减少重启修复的概率我觉得最好的修复其实是预防。这里分享几个我平时会做的加固习惯修改关键配置前先备份尤其是有明显风险的fstab、/etc/default/grub这类文件。磁盘分区发生变化、新装系统、迁移机器之后第一时间重新生成GRUB配置并安装一次引导程序。内核更新后不要着急删旧内核保留最近一个可以正常启动的版本万一新内核出问题还能回退。在启动菜单中留意系统自动生成的内核回退选项很多发行版在内核更新后会自动保留一个旧内核菜单项你的启动菜单可能会多出几行这是保命选项。装机完成后做一次引导备份比如备份GRUB配置、记录分区的UUID和完整的lsblk输出。这些信息在你需要救援的时候能省去大量排查时间。最后再分享一个经验每次帮别人修复引导时我都会把出问题的过程在脑子里走一遍是GRUB问题、内核问题、还是文件系统问题。有了这个判断再动手效率完全不同。有时候开机卡住不是什么严重故障可能只是某个服务启动太慢多等几分钟就好了。很多人一看到屏幕停住就焦虑急着重启反而把一个小问题折腾成大问题。先看键盘灯再看日志最后再动手这个顺序我建议你也记住。