☰
Linux忘记root密码:rd.break重置与GRUB密码加固
2026/10/26 2:42:39 网站建设 项目流程

凌晨两点被电话叫起来,说一台跑着老业务的机器必须重启,可 root 密码在上一任负责人交接前就没人记得了,机器还躺在机房角落,带外管理口的管理员账号也没人知道。这种场景一点都不稀奇。能救你的只有两件事:怎么在不知道密码的前提下把 root 密码重置掉,以及重置完怎么防止下一个人用同样的手法再来一遍。前者靠的是引导参数rd.break和init=/bin/bash,后者靠的是给 GRUB 配置密码(超级用户加 PBKDF2 哈希)。这两个动作看起来一个是在"破"、一个是在"补",其实它们共用同一条链路——谁能碰到 GRUB 菜单,谁就拿到了这台机器的根权限。

这篇文章把两件事分开讲透:前半段是重置 root 密码的完整可复现步骤,以及每一步背后的原因;后半段是给 GRUB 上锁的几种做法、参数取舍与验证方法;最后再把我这些年踩出来的坑一次性倒干净。刚接手服务器的新手可以照着做,要把这套动作写进运维规范的老手也能从里面挑到能用的细节。

1. 谁能碰到 GRUB 菜单,谁就是 root

很多人对"物理安全"的理解停留在"机房门有锁",但只要有人能在开机画面出现的那几秒敲一下键盘,这台机器上的所有账户体系都是纸糊的。理解这一点,后面所有操作才有意义。

1.1 从按下电源键到拿到 shell,有三个可以插手的关口

第一个关口在固件层。BIOS 或 UEFI 里可以改启动顺序,把 U 盘、光驱或者网络引导排到硬盘前面,从而完全绕过硬盘上的操作系统,用一个外部系统挂载你的磁盘,/etc/shadow想怎么改就怎么改。这个口子只能靠固件管理员密码加启动顺序锁来堵。

第二个关口在引导加载器层,也就是 GRUB。GRUB 的菜单界面允许按e编辑当前启动项的配置,而内核命令行本身就是一台 Linux 系统启动时最重要的输入参数之一。改几个字,系统的启动行为就完全变了。这个口子是本文后半段的重点。

第三个关口在内核和 initramfs 层。系统启动早期跑的是一段极简的用户态代码,负责把真正的根文件系统挂起来。这段代码执行前后都有明确的"停点",rd.break就是一个断点参数,init=/bin/bash则是直接换掉 1 号进程。两个参数都不需要任何身份验证,写在命令行上就生效。

三个关口是串联关系,任意一个不设防,整条链就断了。而现实是,绝大多数机器只有第一个关口设了防(甚至没设),第二个第三个完全裸奔。

1.2 重置密码和给 GRUB 上锁必须成对做

只做前者不做后者,等于你花两小时救回来的机器,下一个能接触到它的人用同样的方法二十分钟就能接管。只做后者不做前者,更惨——你锁上了门,钥匙在自己手里,但你还没进门。

所以顺序不能反:先把机器进得去(重置 root 密码),再把门锁上(配置 GRUB 密码),最后验证锁是真的锁上了。我见过好几次倒着操作的,加完密码重启,发现启动菜单要验证,自己又不知道密码,只能回头用安装介质救援,白白多折腾一轮。

还有一点容易被忽略:给 GRUB 上锁这件事,本质上是"提高门槛",不是"建立边界"。它挡住的是随手按e的人,挡不住把硬盘拆下来挂到另一台机器上的人。真正的边界是磁盘加密加上固件密码,GRUB 密码只是这套组合里的一个环节。

1.3 把防护层次和它挡住的对象列清楚

防护手段挡住谁挡不住谁实施成本
GRUB 超级用户密码在机房随手改内核参数的人从外部介质启动的人、拆盘的人低,一条命令
固件管理员密码 + 启动顺序锁想改启动顺序、想进固件设置的人会拆机箱短接跳线的人低,但要逐台设置
磁盘加密(LUKS)拆走硬盘后挂到别处读取的人已经在系统内拿到 shell 的人中,重装或迁移时做
机箱锁 / 机柜锁 / 机房门禁一切物理接触有合法权限的内部人员中,属于管理手段
带外管理口独立口令借远程控制台做手脚的人拿到带外管理权限的人低,但极易被遗忘

这张表我一般会直接放进交接文档里。因为它解释了一个非常关键的事实:这五层里最容易被忘记维护的恰恰是最后一行。多少机器 root 密码管得严严实实,带外管理口还是出厂默认口令,一条远程 KVM 就能看到开机画面,前面四层全部作废。

2. 重置 root 密码的两条路线与它们的真实差别

真到了要动手的时候,你会面临一个选择:用rd.break还是用init=/bin/bash。网上教程混杂,写这两条路的文章都很多,但很少有文章讲清楚为什么会有两条路、什么情况下该选哪条。

2.1 先解决"停不住菜单"这个前置问题

要改内核参数,前提是能看到 GRUB 菜单。企业级发行版默认会显示一个几秒倒计时的菜单,按任意方向键就能停住。但有些机器被优化过,GRUB_TIMEOUT=0,或者开了菜单隐藏,一眨眼就过去了。

这时候的手法是在固件自检画面结束、系统刚开始引导的一两秒内连续敲Esc或者按住Shift,逼 GRUB 把菜单吐出来。用带外远程控制台的话,这一两秒的窗口很容易错过,建议提前把控制台窗口开好,或者干脆连按几十下Esc。

停住菜单之后按e进入编辑界面。界面里会有一堆以linux、linux16或者linuxefi开头的行——不同版本、不同固件下名字不一样。真正的内核命令行就在这一行,它通常会跨好几行显示(用\续行),光标移动用的是方向键。要改的位置在这行的末尾,加一个空格再加参数,别插到中间去,中间是root=UUID=...、ro这类关键参数,改坏了就起不来。

提示:在编辑界面里,如果找不到linux开头的那一行,往下翻。有些系统的菜单项里有多个内核,默认光标停在第一个,改错了启动项等于白改。

2.2 rd.break 路线:在 initramfs 里改真实系统

这是目前最通用的一条路,从 7 到 9 都适用。核心思路是让启动流程在切换到真实根文件系统之前停下来,此时真实的根分区已经被挂载到/sysroot,但还没有被切换成/,系统里的各种服务、账户验证机制都没跑起来,是一个绝对干净的操作环境。

在内核命令行末尾追加:

rd.break

按Ctrl+X或者F10启动,系统会停在switch_root:/#提示符下。接下来的操作顺序是有讲究的:

# 1. 真实根此时是只读挂载,必须重新挂成可写 mount -o remount,rw /sysroot # 2. 把根切到真实系统,这一步之后 passwd 改的才是真的 /etc/shadow chroot /sysroot # 3. 重置密码,会提示输入两次 passwd root # 4. 关键一步:告诉系统下次开机重新给所有文件打 SELinux 标签 touch /.autorelabel # 5. 退出 chroot,再退出 initramfs,系统继续启动 exit exit

第一步的remount,rw是整条链上最容易漏的。漏了的后果不是报错,而是passwd执行到最后一步突然来一句Authentication token manipulation error,看起来像是密码策略问题,其实只是写不进去。

第二步的chroot同样不能省。不chroot直接passwd,你改的是 initramfs 里那个临时环境的密码文件,重启之后影子都没有。

第四步的touch /.autorelabel是最容易被跳过、后果最隐蔽的一步。原因在于:执行passwd的时候,SELinux 的安全策略还没有加载,新生成的/etc/shadow拿到的安全上下文是错的(通常落到了unlabeled_t之类的位置)。等系统正常启动、SELinux 策略加载完毕,登录程序去读shadow文件时会被策略直接拒绝,表现就是密码明明改对了,登录界面却一直提示认证失败,或者干脆登录后一堆服务起不来。/.autorelabel这个空文件的唯一作用,就是让系统在下次启动时把所有文件的安全上下文重刷一遍。

代价是这次重启会很慢。文件多的机器上跑十几分钟甚至半小时都正常,期间屏幕上会滚动大量重打标签的日志。别以为卡死了就去强行断电,那才是真的把系统搞坏。

2.3 init=/bin/bash 路线:更直接,但对状态没保障

另一条老牌路是把内核命令行改成这样:

rw init=/sysroot/bin/sh

rw让根分区直接以可写方式挂载,init=把 1 号进程换成 shell,systemd 完全不参与。启动后会直接掉到一个 shell 里,此时根已经是真实系统的根,不需要chroot:

passwd root touch /.autorelabel exec /sbin/reboot -f

最后那行用exec是必须的。因为此时系统没有 init 进程接管,普通的reboot命令依赖 systemd 或 SysV 的服务管理机制,调不通;exec会用重启程序替换掉当前的 shell 进程,让 1 号进程直接变成关机流程,这才是干净的退出方式。

这条路的坑比rd.break多。一是rw参数不写、或者写的位置不对,根还是只读的,passwd一样报错;二是init=/sysroot/bin/sh里的路径写错(比如写成/bin/sh,那是 initramfs 里的 shell),系统起不来也没提示,只能看着黑屏发呆;三是这条路完全绕过了 initramfs 的正常流程,某些依赖早期挂载的目录(比如/proc)可能没准备好,一些工具会行为异常。

2.4 两条路怎么选

对比项rd.breakinit=/bin/bash(或 /sysroot/bin/sh)
停在哪里initramfs 中,真实根挂载后、切换前直接以真实根为根,shell 当 1 号进程
根分区初始状态只读,需remount,rw /sysroot取决于是否加rw,加了就是可写
是否需要 chroot需要不需要
需要重打 SELinux 标签需要需要
适合的系统版本各主流版本通用,兼容性最好偏老的版本或特定场景
出错后的可恢复性高,退出后仍走正常启动流程低,容易停在半路没有提示
我个人的默认选择首选只在rd.break有异常时作为备选

我的习惯是默认走rd.break,因为它把"临时环境"和"真实系统"分得很清楚,每一步都在你的控制之内,出问题也能看懂发生了什么。init=/bin/bash更像是一把没有保险的枪,熟练的人用着快,不熟的人一枪打自己脚上。

2.5 改完密码之后必须验证的四件事

很多人改完密码就急着reboot然后ssh上去试一下,能登就完事了。我建议多花三十秒做四项检查,能省掉后面几小时的排查。

第一,用新密码在控制台登录一次,不是在 SSH 里。控制台登录路径和远程登录路径在 PAM 层面会有差异,而且键盘布局不一样,密码里有特殊符号的时候尤其明显。

第二,检查 SELinux 状态和影子文件的标签。登进去之后执行ls -Z /etc/shadow,正常应该是system_u:object_r:shadow_t:s0。如果显示unlabeled_t或者admin_home_t,说明重打标签没生效,得手动补一次restorecon -v /etc/shadow。同时看一眼getenforce和最近的审计日志,确认没有出现一批新的拒绝记录。

第三,确认重启过程完整走完了标签重刷。看/.autorelabel这个文件是否已经消失,或者检查启动日志里有没有重打标签的记录。如果文件还在,说明那一轮没跑完,下次重启还得再等一遍。

第四,把新密码记到该记的地方,并当场验证记录是可用的。密码托管、变更单、交接文档,三个地方写一遍,然后从托管系统里把密码读出来再登一次。我见过抄错一位字符、三天后才发现的情况,那时候已经没人记得原始输入是什么了。

3. 给 GRUB 上锁的三种做法与参数取舍

补完了"破",该说"补"了。GRUB 的密码保护有几个不同的实现层次,混在一起讲很容易晕,我把它们拆成三条独立的路。

3.1 三种"GRUB 密码"其实不是一回事

第一种是固件管理员密码,存在于 BIOS 或 UEFI 里,和操作系统完全无关,管的是"能不能进固件设置、能不能改启动顺序"。设了它,别人就不能拿 U 盘抢先启动。

第二种是 GRUB 的超级用户密码,存在 GRUB 自己的配置文件里,管的是"能不能编辑启动项、能不能进 GRUB 命令行"。这才是本文要配的东西。

第三种是某些发行版安装器里那个"给引导加载器加密码"的勾选项,本质上是帮你执行了第二种,只是把操作包装了一下。

日常沟通里大家统称"GRUB 密码",但排查问题的时候一定要分清楚是哪一种,否则会出现"我明明设了密码为什么还能改启动顺序"这种对话。

3.2 用 grub2-setpassword 一步到位

最省事的做法就一条命令:

grub2-setpassword

执行后会提示输入两次密码,然后这个工具会把一个 PBKDF2 哈希写进/boot/grub2/user.cfg,并且通常会顺带重跑一次配置生成。看看生成的内容:

cat /boot/grub2/user.cfg

内容长这样:

GRUB2_PASSWORD=grub.pbkdf2.sha512.10000.9F2A....(一长串)

这串东西是密码经过 PBKDF2 加盐迭代算出来的,反推不出原文。文件权限建议收紧到只有 root 可读:

chmod 600 /boot/grub2/user.cfg

为什么用 PBKDF2 而不是直接把密码写进配置文件?因为 GRUB 的配置文件在很多环境下是可读的,明文密码写在那里等于没设。PBKDF2 的迭代次数(上面那串里的10000)意味着暴力尝试的成本被放大了上万倍,攻击者即使拿到哈希也很难在合理时间内还原。

这里有一个非常关键的机制需要搞清楚:这个方案默认只锁"编辑"和"命令行",不锁正常启动。原因是发行版的菜单生成脚本会给自动生成的启动项加上--unrestricted标记,日常开机选默认项直接进系统,不需要输密码;但一旦按了e想改内核参数,或者按了c想进 GRUB 命令行,就会先要求输入用户名和密码。

这个设计非常实用。生产机器上如果连启动都要人守着输密码,那远程重启、自动化脚本、无人值守的机房全部瘫痪。

不过要注意,grub2-setpassword会不会自动重跑配置生成,不同版本表现不完全一致。我的建议是不要假设它做了,改完自己验证一遍,或者干脆手动再跑一次配置生成命令,确认grub.cfg里确实出现了超级用户相关的行。

3.3 用 grub2-mkpasswd-pbkdf2 手动控制写入位置

如果需要更精细的控制,比如指定超级用户名、给不同的启动项设置不同的访问策略、或者把保护写进自定义菜单项,就走手动这条路。

第一步,生成哈希:

grub2-mkpasswd-pbkdf2

按提示输两次密码,会输出类似grub.pbkdf2.sha512.10000.1A2B3C...的字符串,复制下来。

第二步,把它写进自定义配置片段。不要去直接改/boot/grub2/grub.cfg——那个文件是生成出来的,下次跑配置生成就覆盖了。正确的位置是/etc/grub.d/40_custom:

vim /etc/grub.d/40_custom

在文件末尾追加两行:

set superusers="root" password_pbkdf2 root grub.pbkdf2.sha512.10000.1A2B3C...

set superusers定义谁是超级用户,password_pbkdf2给这个用户绑密码哈希。用户名不一定是root,但用root最不容易和系统账户混淆,排查时也直观。

第三步,重新生成主配置文件:

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

这一步看似简单,但它有一个非常容易踩的坑:BIOS 引导和 UEFI 引导的主配置文件路径不一样。先确认系统的引导方式:

[ -d /sys/firmware/efi ] && echo "UEFI" || echo "BIOS"
引导方式主配置文件路径
BIOS / Legacy/boot/grub2/grub.cfg
UEFI/boot/efi/EFI/<厂商目录>/grub.cfg

UEFI 机器上如果照着老教程往/boot/grub2/grub.cfg生成,命令会成功、文件会更新、看起来一切正常,但重启之后密码压根不生效——因为 GRUB 读的是 EFI 分区里那一份。我就被这个坑耍过一次,排查了半小时才发现写错了地方。不确定目录名的话,直接ls /boot/efi/EFI/看一眼就知道了。

3.4 --unrestricted 的取舍:锁编辑还是锁启动

前面提到自动生成的菜单项带了--unrestricted,如果想把"启动"这一步也锁上,就得把这个标记去掉。

手动写的菜单项长这样,不带--unrestricted就是要密码:

menuentry 'Custom Entry' --class gnu-linux { linux /vmlinuz-... root=/dev/mapper/xxx ro initrd /initramfs-....img }

带上就是正常启动免密:

menuentry 'Custom Entry' --class gnu-linux --unrestricted { ... }

我的实际建议是生产环境保留--unrestricted,把力气花在固件密码和启动顺序锁定上。理由很现实:如果连启动都要密码,那么一次计划内重启就得有人在机房或者带外控制台前面守着;带外控制台的键盘输入还有延迟,输错三次更是灾难;批量重启脚本会在第一个节点就卡死,然后你会收到一串告警。

真正需要连启动都锁的场景其实很窄:高安全等级的离线机器、放在半公开区域的设备、或者合规要求明确写了"引导需认证"的环境。这些环境下守着输密码是可以接受的成本,那就去掉--unrestricted。

3.5 内核升级会不会把密码配置冲掉

这是被问得最多的一个问题。答案是:看你把配置写在了哪里。

如果把set superusers和password_pbkdf2直接写进了/boot/grub2/grub.cfg,那内核一升级、包管理器一重跑配置生成,这两行就没了,密码保护静默失效——最危险的就是这种"失效了但没人发现"的状态。

如果写在/etc/grub.d/40_custom里,或者用的是grub2-setpassword生成的user.cfg(配置生成脚本会自动去读它),那么每次重跑配置生成都会重新带上去,内核升级也不会丢。

所以判断标准很简单:配置文件里那两行是不是"手写进最终产物"的。是的话就有风险。

顺带说一句,升级内核之后建议做一次抽查:

grep -c superusers /boot/grub2/grub.cfg

返回 0 就说明配置丢了,赶紧补。这个检查放进例行的变更后验证清单里,成本几乎为零。

3.6 验证的唯一可靠方式:去菜单里真的按一下 e

配置文件改完、grep也确认了,但这都只是"看起来对"。真正可靠的验证是重启一次,在菜单上按e,看它是不是弹出认证提示。

验证的时候注意几点:输错密码的表现应该是直接被踢回菜单,而不是放你进去;输入正确的用户名和密码之后,编辑界面正常出现;按Esc或Ctrl+C能退出编辑回到菜单,然后正常启动不受影响。

这个验证必须在维护窗口里做。因为万一配置写坏了导致菜单加载失败,机器是起不来的,需要有救援介质在手边。我一般会把安装镜像挂在带外控制台的虚拟光驱上再重启,这样出问题能立刻进救援模式,不用跑去机房。

4. 那些教程里不会写、但几乎一定会遇到的坑

下面这些全是实操里撞出来的,按发生频率排序。

4.1 passwd 报 Authentication token manipulation error

这个报错几乎是密码重置环节的头号杀手,而且它对应至少四种完全不同的根因,必须逐个排查。

排查顺序我一般是这样:

# 1. 根分区是不是真的可写 mount | grep ' / ' # 2. 磁盘是不是满了(满了就写不进去) df -h / # 3. shadow 文件是不是被加了不可变属性 lsattr /etc/shadow # 4. 影子文件本身的权限和属主对不对 ls -l /etc/shadow

第一种情况最常见:忘了mount -o remount,rw /sysroot,或者init=/bin/bash路线下没加rw参数。第二种情况在日志目录爆掉的机器上很典型。第三种是有人做过安全加固,给/etc/shadow加了chattr +i,这时候需要先chattr -i /etc/shadow,改完再考虑要不要加回去。第四种是文件权限被改坏了,正常应该是root:root且权限000或0000。

4.2 密码改对了却登录不进去

这种情况我遇到过三次,两次是 SELinux 标签问题,一次是键盘布局问题。

SELinux 那两次的共同特征是:控制台输密码后光标卡一下,然后重新回到登录提示,没有任何错误信息,日志里能看到一批avc: denied记录。原因就是前面说的——passwd在策略未加载的环境下生成的新shadow文件标签不对,登录程序读不了它。补救方式是在救援环境里执行:

chroot /sysroot restorecon -v /etc/shadow /etc/passwd /etc/group

或者更干脆,touch /.autorelabel再来一次完整重打标签。

键盘布局那次更搞笑:密码里带了一个@,在 GRUB 的编辑界面和某些控制台环境下,键盘映射是美式布局,而操作者用的是其他布局,输进去的字符是别的。表现就是"我明明输对了"。所以密码策略里最好明确禁止在关键账户密码里使用那些在不同键盘布局下位置不同的符号,或者至少在设置完之后用最简单的纯字母数字密码先验证一次登录,再改复杂。

4.3 加了密码之后自动化流程全线卡住

这个坑的杀伤力被严重低估。加完 GRUB 密码一段时间后,某个批量重启脚本开始超时,监控报警一片红,排查半天发现是机器停在 GRUB 的认证提示上,等人的输入。

根因通常是:脚本或者带外管理工具触发了重启,而机器上恰好有一个"需要认证才能选"的启动项(比如某些手工加的menuentry没带--unrestricted,或者 BIOS 升级后启动项顺序变了,默认项变成了需要认证的那一个)。

处理思路是先确认到底是"哪个启动项被选中了",再看那个启动项有没有--unrestricted。修法就是给它加上,或者调整GRUB_DEFAULT让它默认选免密的那一项。这也印证了前面的建议:在需要频繁无人值守重启的机器上,不要锁启动,只锁编辑。

4.4 忘了 GRUB 密码怎么救

别急着重装系统。思路和重置 root 密码完全一致:既然物理接触就能绕过,那就绕过它。

用安装介质启动进救援模式,让安装器把系统根分区挂到/mnt/sysimage,然后:

chroot /mnt/sysimage rm -f /boot/grub2/user.cfg # 如果配置是写在 40_custom 里的,就去改那个文件 grub2-mkconfig -o /boot/grub2/grub.cfg

user.cfg一删,配置生成脚本读不到密码,就不会生成超级用户那一行,密码保护就解除了。UEFI 机器上还要同步处理 EFI 分区里的那一份。

另一个更粗暴但同样有效的办法:把硬盘拆下来挂到另一台机器上,直接删文件。当然这要求你能接触到硬件并且会拆。

4.5 重打 SELinux 标签跑不完或者跑得极慢

大盘机器上一次完整重打标签可能要跑半小时以上,中间屏幕滚动大量日志,看起来像卡死。判断方法是看/.autorelabel文件是否还在,只要还在就说明任务没结束。

如果实在等不了(比如业务有停机窗口限制),可以退一步只重打关键目录:在救援环境里执行load_policy -i加载策略,然后restorecon -Rv /etc只处理配置目录。这样几秒钟就能完成,风险是其他目录如果也有类似问题不会被发现。这是一个权衡,不是推荐做法。

还有一种情况:重打标签过程中断电,重启后系统可能起不来,因为部分文件标签是新的、部分是旧的。这时候必须再用救援模式跑一次完整的重打,别指望它能自愈。

4.6 磁盘加密和 GRUB 密码的先后顺序

用了 LUKS 的机器上,启动流程是:固件 → GRUB 菜单(此时要 GRUB 密码)→ 选内核 → initramfs 里提示输入磁盘口令 → 解密 → 正常启动。

所以两套密码是串联的,谁都绕不过去。这个组合的强度比单用任何一个都高得多:GRUB 密码挡住了改内核参数,磁盘加密挡住了拆盘读取,两者互补。但也带来一个运维上的麻烦——一次重启要输两次密码,且顺序不能错。做无人值守重启的方案时要同时考虑这两层,否则你解决了 GRUB 那一关,还是会卡在磁盘口令上。

5. 把这两个动作固化成可复用的流程

单次操作能成功不算本事,能稳定重复、能交接给下一个人、出问题时能快速定位,才算。

5.1 一次密码变更应该留下什么

我的习惯是留一张四行的记录,不多写但每条都有用:

记录项内容要求为什么需要
变更原因交接缺失 / 定期轮换 / 人员离职半年后回看时能判断这次变更的性质
影响范围单机 / 同批次机器 / 某个业务集群出问题时能快速圈定排查范围
验证方式控制台登录成功 / 服务正常 / 关键任务跑通避免"改完就算完"
回退方案救援介质位置 / 备用账户 / 带外管理口地址真出事的时候不用现找

最后一行最容易被省略,但它是唯一能在紧急时刻救命的一行。我现在的做法是:每次变更前先把救援介质的挂载方式确认一遍,确认能挂上再动手。

5.2 一个开机前自检的小脚本

把检查项写成脚本,每次变更后跑一遍,比凭记忆靠谱得多:

#!/bin/bash echo "=== 引导方式 ===" [ -d /sys/firmware/efi ] && echo "UEFI" || echo "BIOS" echo "=== GRUB 主配置路径 ===" if [ -d /sys/firmware/efi ]; then ls -l /boot/efi/EFI/*/grub.cfg 2>/dev/null else ls -l /boot/grub2/grub.cfg fi echo "=== 超级用户配置是否存在 ===" grep -h "superusers" /boot/grub2/grub.cfg /boot/efi/EFI/*/grub.cfg 2>/dev/null || \ echo "警告:未发现 superusers 配置" echo "=== user.cfg 权限 ===" ls -l /boot/grub2/user.cfg 2>/dev/null || echo "未使用 user.cfg" echo "=== root 账户是否有可用密码 ===" awk -F: '$1=="root"{print ($2=="!!"||$2=="*")?"警告:root 密码未设置":"root 密码已设置"}' /etc/shadow echo "=== SELinux 状态 ===" getenforce echo "=== shadow 文件标签 ===" ls -Z /etc/shadow

脚本本身没什么技术含量,价值在于把"我大概记得检查过"变成"每次都跑同一套检查"。有几个检查项平时根本想不到,比如superusers那一条——内核升级后它静默消失的概率不低,靠人肉记忆去grep是不现实的。

5.3 在测试机上把整个流程走两遍

这话听起来像废话,但确实有用。密码重置这个动作,第一次做的时候要对着文档一步步来,中间还要查命令、确认路径,二十分钟能做完算快的。而在真实故障场景里,你往往是在半夜、在压力下、在业务负责人的催促中操作,这时候靠的是肌肉记忆。

我自己的训练方式是:找一台测试机,先把 root 密码改成一个随机串,然后不看文档,从重启开始计时,走完rd.break全套流程,目标是把时间压到三分钟以内。然后紧接着做第二遍——给它配上 GRUB 密码,重启验证e键被拦住,再删掉user.cfg恢复。两遍走下来,这套动作就变成条件反射了。

注意:所有演练都在测试环境做。生产环境上第一次执行陌生操作,不管文档多详细,都属于高风险行为。

最后再分享一个我觉得挺值的小习惯:把rd.break和init=/sysroot/bin/sh这两个参数,连同mount -o remount,rw /sysroot、touch /.autorelabel这几条命令,存在手机上或者打印一张卡片贴在机柜门内侧。真到断网、带外控制台只有个黑屏字符界面、脑子一片空白的时候,那张卡片比任何文档都好使。

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

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

立即咨询