ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux启动故障排查:grub引导、救援模式与root密码重置

Linux启动故障排查:grub引导、救援模式与root密码重置 简介面向系统管理员与运维学习者这份文档系统梳理操作系统启动全流程从基本输入输出系统自检、主引导记录加载、统一引导程序配置到内核装载与服务初始化并重点讲解单用户、紧急模式以及故障排查模式等典型恢复手段。针对忘记管理员密码、启动目录损坏、引导程序加密、文件系统表标识符错误等常见情况给出可直接执行的修复思路适合日常运维参考与考试复习速查。包内仅有一个便携式文档格式文件压缩后约二百二十五千字节体积小、便于离线保存与快速查阅。目前已有一百一十五人学习下载内容来自早期技术社区整理的实践笔记涵盖引导配置生成、根目录切换救援、临时指定初始化进程等重置密码细节不仅解释启动原理更注重排查流程。阅读后可建立完整的启动链路认知遇到系统无法正常引导时能按步骤定位问题避免盲目重装系统提升应急处理能力。1. Linux 系统启动过程与故障排除从 grub 引导到三种救援模式系统起不来的凌晨最考验人。这份《Linux 系统启动过程与故障排除》不是那种从内核源码讲起的理论文档它就是一本修机器的手册MBR 里的 grub 引导、/boot/grub2/grub.cfg 配置文件、single 和 emergency 模式怎么进、root 密码忘了怎么重置、grub2-install 怎么重装引导全是用得上的命令和改法。适合刚接手服务器的人也适合遇到过「内核更新后 grub.cfg 被覆盖」这类翻车的老手。本文按启动链路把配置和修复串一遍再落到每种故障的完整操作最后把最容易踩的坑单独拎出来说。2. 启动链路拆解BIOS 到内核加载配置到底改哪里2.1 MBR、grub 与内核启动链条上谁负责什么Linux 系统启动过程第一步是 BIOS 自检硬件并寻找启动设备接着 BIOS 激活 MBR。MBR 一共 512 字节前 446 字节是主引导程序grub后面 64 字节是分区表最后 2 字节是签名。grub 被加载到内存后会生成一个微系统这个微系统有能力读取文件系统、解析分区表然后通过分区表找到引导分区再去读自己的配置文件/boot/grub2/grub.cfg从中找到内核文件路径最后把内核加载进内存。理解这段链路对排障很重要如果 BIOS 阶段就失败屏幕通常没有任何输出或直接黑屏如果 MBR 损坏会提示grub rescue或Missing operating system如果 grub.cfg 丢失或配置错误会停在 grub 命令行界面。故障出现在哪一环就用哪一环的手段去修。常见做法是先用启动光盘或 U 盘进救援环境再逐层排查而不是一上来就重装系统。启动流程各环节的产物和常见故障可以这样对应环节关键产物故障表现BIOS自检、选择启动设备黑屏无输出、找不到启动设备MBR主引导程序 grub446 字节grub rescue、missing operating systemgrub 引导grub.cfg、内核文件停在 grub 命令行、kernel panic内核加载内核、initramfs卡在加载进度、无法挂载根分区系统初始化systemd、服务服务启动失败、进入紧急模式2.2 正确的改参姿势/etc/default/grub与grub2-mkconfig很多人第一次改 grub 配置时习惯直接编辑/boot/grub2/grub.cfg这在新手阶段几乎必翻车。grub.cfg是由/etc/default/grub和/etc/grub.d/目录下的脚本自动生成的内核一旦更新系统会自动调用grub2-mkconfig重新生成grub.cfg之前手工做的修改会全部失效相当于白改。正确做法是修改/etc/default/grub这个配置文件然后执行grub2-mkconfig让改动生效。这个文件里最常用的是GRUB_TIMEOUT菜单等待时间和GRUB_CMDLINE_LINUX内核启动参数。# 修改 /etc/default/grub常见内容如下 GRUB_TIMEOUT5 GRUB_DISTRIBUTOR$(sed s, release .*$,,g /etc/system-release) GRUB_DEFAULTsaved GRUB_DISABLE_SUBMENUtrue GRUB_TERMINAL_OUTPUTconsole GRUB_CMDLINE_LINUXcrashkernelauto rhgb quiet GRUB_DISABLE_RECOVERYtrueGRUB_CMDLINE_LINUX这一行就是内核启动参数rhgb表示显示图形化启动进度条quiet表示安静模式减少启动时的信息输出。需要调整参数时直接在这一行追加即可。改完以后执行grub2-mkconfig -o /boot/grub2/grub.cfg重新生成配置文件重启后才会生效。2.3 grub2-set-default默认启动项与内核参数管理如果机器上装了多个内核版本或多个系统grub2-set-default可以设置默认启动哪个菜单项。先执行awk -F\ /menuentry / {print $1} /boot/grub2/grub.cfg查看所有 menuentry 的序号再用grub2-set-default指定序号或名称。# 查看 grub 菜单项 grep ^menuentry /boot/grub2/grub.cfg # 设置默认启动第 0 项 grub2-set-default 0 # 确认当前默认项 grub2-editenv list这里注意grub2-set-default设置的是「下次启动」的默认项而/etc/default/grub里的GRUB_DEFAULTsaved表示沿用上一次启动的选择。这两者的配合逻辑是GRUB_DEFAULTsaved时grub 会读取saved_entry变量来决定启动哪个菜单项grub2-set-default实际就是在写这个变量。3. 三种救援模式实操作业single、emergency 与重置 root 密码3.1 救援模式single敲一个参数进最小系统救援模式对应 systemd 的rescue.target系统只启动必需的服务文档里的说法是「只需 8 个服务」。进入方式开机在 grub 菜单界面按e键进入编辑模式找到以linux16或linux开头的那一行内核启动命令行在行尾追加single或s然后按CtrlX启动。linux16 /vmlinuz-3.10.0-957.el7.x86_64 root/dev/mapper/centos-root ro crashkernelauto rhgb quiet single追加single后系统会跳过大部分服务直接进入单用户 shell适合做修复操作改密码、修复 fstab、禁用出问题的服务。注意进入该模式需要 root 密码如果密码忘了就不能走这条路要用 3.3 的init/bin/sh方案。3.2 emergency 模式比救援模式更精简的服务集合emergency 模式对应emergency.target启动的服务比 single 更少连网络和服务依赖都不拉起来基本只挂载根分区。进入方式和 single 一样在内核命令行行尾追加emergencylinux16 /vmlinuz-3.10.0-957.el7.x86_64 root/dev/mapper/centos-root ro crashkernelauto rhgb quiet emergency同样需要 root 密码。emergency 适合的场景是 single 模式也起不来的情况——比如某个服务在 rescue.target 依赖链里仍然触发崩溃或者根分区挂载本身有问题。在 emergency 模式下根分区默认是只读挂载执行修复命令前需要先执行mount -o remount,rw /。3.3 忘记 root 密码init/bin/sh 绕过与重置这是最经典的故障场景。root 密码忘了single 和 emergency 都进不去都需要密码这时候用的方案是在 grub 编辑界面找到内核命令行在行尾追加init/bin/sh同时把rhgb和quiet删掉。为什么必须删掉这两个参数因为rhgb会显示图形进度条quiet会隐藏内核输出两者叠加的效果是启动过程看不到任何命令行交互界面你以为系统卡死了其实/bin/sh已经在等输入。删掉之后启动到 shell 提示符后按顺序执行以下操作# 重新挂载根分区为读写 mount -o remount,rw / # 修改 root 密码 passwd root # 创建 SELinux 重标记标记文件 touch /.autorelabel # 继续执行系统初始化 exec /sbin/inittouch /.autorelabel这一步很容易被忽略。系统启用 SELinux 时直接改密码会导致登录相关文件的 SELinux 上下文不正确表现为能输入密码但登录不进去。创建.autorelabel后系统重启会自动重新标记所有文件的 SELinux 属性代价是首次重启会慢一些。exec /sbin/init的作用是把当前 shell 替换成 init 进程让系统按正常流程继续启动。4. troubleshooting 模式grub、内核、fstab 与关键文件恢复4.1 chroot 到 /mnt/sysimage把损坏系统变成可操作目录troubleshooting 模式其实是安装在系统上的「救援模式」入口在 grub 菜单里通常叫 Troubleshooting进去之后有几个子选项核心是进入 shell 后用chroot /mnt/sysimage把原系统的根分区切换到当前环境这样你能直接操作原系统里的文件、命令和配置。# 进入 troubleshooting 的 shell 后 chroot /mnt/sysimage执行 chroot 之后当前环境的/变成了原系统的根目录你可以直接运行grub2-install、vim /etc/fstab、rpm这些原系统里的工具。这是重装 grub、修复 boot 目录、改 fstab 的前提。chroot 之前系统会把原根分区挂载到/mnt/sysimage这个挂载动作通常是自动完成的如果没挂上手动执行mount /dev/sda2 /mnt/sysimage即可。4.2 重装 grub 与内核grub2-install 与 rpm -ivhgrub2-install 是把 grub 引导程序重新写入磁盘 MBR 的命令一般配合 chroot 使用。写入目标是整块磁盘而不是某个分区这是新手常搞混的地方。# 在 chroot 环境中执行 grub2-install /dev/sda执行后 grub 的主引导程序会被写到/dev/sda的 MBR 区域。如果/boot下的文件被删除或者内核损坏还需要重新安装内核 rpm 包。此时需要用到安装光盘把光盘挂载后从 Packages 目录里找到对应的内核包# 挂载安装光盘 mount /dev/cdrom /mnt # 安装内核包包名用 tab 补全 rpm -ivh /mnt/Packages/kernel-3.10.0-957.el7.x86_64.rpmrpm -ivh的-i是安装-v显示详细信息-h显示进度条。系统里原来的内核如果还在这只是多装一个内核不会覆盖旧内核grub 菜单里以后会多一个选项。装完内核后/boot目录下会生成对应的 vmlinuz 和 initramfs 文件。4.3 boot 目录重建grub2-mkconfig -o grub.cfg 的完整流程如果/boot目录整个乱了比如误删了 grub2 目录或者 grub.cfg 丢失需要手动重建配置。常见做法是先确认/boot下有没有 vmlinuz 和 initramfs 内核文件没有就先按 4.2 安装内核包然后在/boot下创建 grub2 目录并重新生成 grub.cfg。# 创建 grub2 目录 mkdir -p /boot/grub2 # 进入 grub2 目录 cd /boot/grub2 # 重新生成 grub.cfg grub2-mkconfig -o /boot/grub2/grub.cfggrub2-mkconfig -o的-o指定输出文件路径它会扫描/etc/default/grub、/etc/grub.d/脚本以及磁盘上的内核文件生成完整的引导菜单。生成完 grub.cfg 之后还要执行grub2-install /dev/sda把引导程序装回 MBR。这两步缺一不可只有 grub.cfg 没有引导程序MBR 还是空的只有引导程序没有 grub.cfggrub 不知道从哪里加载内核。4.4 fstab 的 UUID 对不上与 passwd/shadow 丢失fstab 问题很典型如果挂载分区时用的是 UUID并且写进了/etc/fstab后面做分区操作或重新格式化导致 UUID 变了启动时系统按旧 UUID 去找分区会失败直接进入 emergency 模式。处理方法是先用blkid查出当前各分区的真实 UUID再修改 fstab。# 查看分区实际 UUID blkid /dev/sda1 /dev/sda2 # 修改 fstab 中对应的 UUID vim /etc/fstab修改 fstab 时建议把新 UUID 和原内容逐行核对避免手误多敲或少敲字符fstab 写错会导致无法挂载根分区。另一个极端场景是/etc/passwd和/etc/shadow文件丢失症状是开机后屏幕黑屏、没有任何登录界面。原因是这两个文件是用户账户和密码认证的核心缺失时系统的登录流程直接无法初始化。# 用系统备份文件恢复 passwd 和 shadow cp -a /etc/passwd- /etc/passwd cp -a /etc/shadow- /etc/shadow用cp -a而不是cp是关键-a保留文件权限、属主和 SELinux 上下文。/etc/shadow的权限必须是----------或-rw-------如果恢复了之后权限不对登录时 passwd 命令会报错或者直接拒绝认证。恢复完成后检查一下权限位ls -l /etc/passwd /etc/shadowpasswd 是-rw-r--r--shadow 是----------或-rw-------。5. grub 加密与启动参数防篡改调参的五个常见问题排查5.1 grub 加密grub2-mkpasswd 与 00_header 改动给 grub 加密的目的是防止物理接触到机器的人按e进入编辑模式篡改启动参数。没有加密的情况下任何人都能通过 grub 编辑界面加init/bin/sh重置 root 密码这是所有 Linux 系统都绕不开的物理安全缺口。加密步骤分两步先用grub2-mkpasswd-pbkdf2生成加密密码再把结果写进/etc/grub.d/00_header。# 生成 PBKDF2 加密密码回车后输入两遍密码 grub2-mkpasswd-pbkdf2命令输出长这样Your PBKDF2 password is grub.pbkdf2.sha512.10000.xxxx...把这一整串复制下来追加到/etc/grub.d/00_header文件末尾。注意是追加到 00_header不是追加到 grub.cfg因为 00_header 是生成 grub.cfg 的源文件之一。改完之后必须重新生成 grub.cfg# 在 00_header 末尾追加以下内容 cat /etc/grub.d/00_header EOF cat EOF set superusersroot password_pbkdf2 root grub.pbkdf2.sha512.10000.xxxx... EOF EOF # 重新生成 grub.cfg grub2-mkconfig -o /boot/grub2/grub.cfgset superusersroot定义有权限编辑 grub 的用户名password_pbkdf2那一行把用户名和加密密码绑定。这样配置以后在 grub 界面按e编辑前会先要求输入用户名和密码没有密码的人进不了编辑模式。5.2 内核 cmdline 参数与默认启动项管理内核启动参数不只是故障排查时在 grub 界面临时追加也可以写进/etc/default/grub的GRUB_CMDLINE_LINUX行永久生效。常见的实用参数有net.ifnames0关闭网卡随机命名让网卡显示为 eth0consolettyS0,115200开启串口控制台输出方便无显卡的服务器远程排障panic5设置内核 panic 后 5 秒自动重启。# 修改 /etc/default/grub 的内核参数 GRUB_CMDLINE_LINUXcrashkernelauto rhgb quiet net.ifnames0 consolettyS0,115200 # 重新生成配置 grub2-mkconfig -o /boot/grub2/grub.cfg加参数时注意不要随意删掉原有的rhgb quiet除非你明确知道不需要图形化启动界面。另外调内核参数前最好先查一下参数含义有些参数比如init/bin/sh只适合临时在 grub 编辑界面用写进默认配置会导致系统每次开机都进单用户 shell。5.3 常见问题排查五条踩坑记录坑 1直接改 grub.cfg内核更新后配置全失效现象手动改了/boot/grub2/grub.cfg里的超时时间和菜单项重启后生效但某次yum update kernel之后改动全部没了。原因内核更新包会触发grub2-mkconfig重新生成 grub.cfg覆盖所有手工修改。解决改/etc/default/grub和/etc/grub.d/下的文件然后手动执行grub2-mkconfig -o /boot/grub2/grub.cfg这才是官方支持的持久化方式。坑 2加 single 进不去屏幕一片黑现象按e在行尾追加singleCtrlX启动后黑屏看起来像卡死。原因内核命令行里还留着rhgb quiet图形进度条掩盖了 shell 提示符shell 其实已经在后台等着输入。解决追加single的同时删掉rhgb和quiet启动后就能看到命令行界面。坑 3grub 加密设置后开机仍然能直接按 e 编辑现象按 5.1 改了 00_header重启后 grub 菜单按e直接进入编辑没有要求输入密码。原因改了 00_header 但没有执行grub2-mkconfiggrub.cfg 里根本没有密码相关的指令。解决每次改完/etc/grub.d/下的文件后强制走一遍grub2-mkconfig -o /boot/grub2/grub.cfg然后用grep password /boot/grub2/grub.cfg验证。坑 4fstab 里 UUID 对不上启动进 emergency现象系统启动后提示Give root password for maintenance或直接进入 emergency 模式journalctl里报UUIDxxx does not exist。原因分区重新格式化或者用mkfs重建文件系统后 UUID 变了fstab 里的还是旧值。解决在 emergency 模式执行blkid查出当前 UUID修改/etc/fstab里的对应行或者临时先把那行注释掉让系统能起来再重新建挂载项。坑 5passwd/shadow 恢复后密码无法验证现象用普通cp /etc/passwd- /etc/passwd恢复文件后登录时提示密码错误但实际上密码是对的。原因普通 cp 不保留文件权限/etc/shadow的权限变成了 644任何用户都能读同时 passwd 命令检测到权限异常会拒绝认证。解决改用cp -a恢复恢复完检查权限shadow 必须是 000 或 600passwd 是 644。6. 修复后的验证与收尾grub.cfg 备份和启动项确认6.1 验证 grub.cfg 生成结果与默认启动项修复完 grub 配置后不建议直接重启赌运气。重启前用命令确认生成结果grub2-mkconfig -o /boot/grub2/grub.cfg执行完grep ^menuentry /boot/grub2/grub.cfg能列出所有启动菜单项确认要启动的内核在列表里grub2-editenv list查看saved_entry指向哪个菜单项如果指向不对用grub2-set-default纠正。6.2 修复前的备份习惯与内核参数核对现在我的习惯是动 grub 相关配置之前强制先备份/boot/grub2/grub.cfg和/etc/default/grub备份文件带日期后缀。如果修复涉及 fstab也顺手cp /etc/fstab /etc/fstab.bak。做完这些再执行grub2-mkconfig一旦新配置起不来grub 菜单里选旧内核或者直接改回备份文件至少有一条后悔药。希望帮到你。本文还有配套的精品资源点击获取
返回列表