☰
麒麟信安系统Root密码失效?GRUB重置全流程实战
2026/10/7 16:52:53 网站建设 项目流程

机房值班手册里写得最多的永远是那一句:root密码不能丢。但现实往往讽刺,项目交接、离职人员、密码过期策略,总有一个理由让你在某个下午站在终端前,试遍自己习惯的组合都进不去。这周我就被一台麒麟信安系统的机器卡了近四十分钟,最后虽然用老办法救回来,但过程里确实踩了几个和 CentOS/RHEL 不太一样的坑。这里把完整的解决过程整理出来,给同样面对“麒麟信安系统 root 密码失效”的运维朋友做个参考。

先说结论:麒麟信安虽然基于 Linux 内核,体系结构上兼容主流 RPM 系生态,但它在引导流程、SELinux 策略和 systemd 处理上都做过定制,网上那些针对 Ubuntu 的 liveCD 修改法在这里行不通,最可靠的是通过 GRUB 引导参数进入紧急模式重置。整个过程不需要额外工具、不需要 U 盘启动盘,只要你还能物理接触这台机器,就能在五分钟内把密码改回来。

1. 先说清场景:哪些情况需要动 GRUB,哪些其实不用

很多朋友一上来就直奔“改内核参数”这条路,但这一步是有前提的。咱们先梳理一下,麒麟信安系统 root 密码进不去,通常分成三类:

第一类是密码明文还记得,只是登录时提示密码过期。这类根本不需要重启机器,用当前密码登录进去之后,配合chage命令延长时间或者直接重设就好。我见过不少同事在这上面栽跟头——密码明明是对的,系统却强制要求修改后才能继续会话,于是误以为“密码失效了”,直接跑去改引导参数,白白增加风险。

第二类是系统里配置了 SSH 密钥登录,而 root 的密码在外部被改过、谁也不知道。这种只要你是管理员,能从其他机器用密钥登进去,也不需要走 GRUB。进去之后一条passwd root就能解决。

第三类才是真正意义上的“所有登录方式都断掉”—— SSH 没开启、本地 console 密码也不知道、kickstart 里设的初始密码又被人改过。只有这种情况下,才需要进入单用户模式或者用rd.break去重置。下面的内容主要针对第三类场景来展开。

注意:判断自己属于哪类场景时,顺便检查一下是不是有人为修改过 PAM 配置或/etc/shadow权限。如果是因为/etc/shadow的权限异常导致认证失败,走的又是另一条排查思路,别一上来就重置密码。

还有一点要提前确认:你机器上有没有启用磁盘加密(LUKS)。如果/boot或者根分区是加密的,进入 GRUB 之后还会要求输入解密短语,这个密钥如果也丢了,那就不属于“重置 root 密码”的范畴,而是“恢复加密盘”的问题,复杂度和风险完全不在一个量级。

2. 实操前置准备:改引导参数前必须懂的几件事

在动手之前,我把原理简单捋一下,你理解了之后遇到变体就不会慌。

GRUB 引导时,会读取/boot/grub2/grub.cfg里的菜单配置,然后按你指定的参数把内核加载起来。正常启动时,内核会挂载根文件系统并交给 systemd 执行默认 target;而我们需要做的,是在内核参数里加入特殊指令,让它跳过部分初始化步骤,直接进入一个以 root 权限运行的 shell。

麒麟信安系统在启动菜单上保留了标准 GRUB 界面,但有个细节:它的菜单项可能叫“KylinSec Linux...”而不是通用的“CentOS Linux”。另外,某些定制版本默认隐藏了菜单、倒计时极短,需要开机瞬间不断按上下方向键调出菜单。

具体操作路径是这样的:开机进入 GRUB 界面后,选中要启动的内核行,按下e键进入编辑模式。找到以linux开头、包含vmlinuz的那一行——这行后面跟的是内核启动参数——移动光标到这一行的行尾,按空格后追加目标参数,再按Ctrl+x或F10启动。整个过程和主流发行版没有本质差别。

但这里有几个麒麟信安特有的坑要注意:

  • 有的版本在 GRUB 菜单前会先加载自己的安全引导模块,你按e进入编辑模式后,需要先验证管理员口令。这个口令和 root 口令不同,通常在首次安装系统时单独设置。如果你完全没印象,可以尝试常见的默认值,但没有把握就不要乱试太多次,有些实现会触发防暴力机制。
  • 编辑界面里内核参数是以多行换行的形式展示的,屏幕可能不够宽,这时追参数不是看行尾在哪,而是要看内核行的实际末尾字符。建议用方向键直接到行末,不要盲目往里敲,可能插到中间导致参数失效。
  • 如果机器上存在多个内核版本,优先选择默认启动项对应的那个内核。有的同事喜欢挑“救援模式”菜单项,结果按e之后发现它不是我们熟悉的参数行,反而绕弯子。

关于“单用户模式”和“rd.break”,我在实际维护中分别用过很多次,结论是:在麒麟信安上优先级最高的方案是rd.break,因为它在更早的阶段切入,几乎不受 SELinux、systemd 之类组件后续初始化的影响;single/1参数在部分版本上也能用,但有时会被策略限制或者登录后 shell 环境异常。下表是两者的核心区别:

对比项rd.breaksingle(单用户模式)
切入阶段initramfs 阶段,切换根之前内核启动完成,systemd 早期
根文件系统挂载已挂载到 /sysroot通常可直接访问根目录
SELinux 影响需要在重置后手动处理标签同样需要处理,情况稍复杂
适用系统麒麟信安全版本基本可以部分版本受 systemd 配置影响
操作难度略低,步骤固定略高,环境状态受初始 ramdisk 影响

下面两节就分别把两条路径的完整流程写清楚。我个人强烈建议优先看rd.break这条,本文标题说的“麒麟信安系统忘记root密码解决说明”,核心方案其实就这一套。

3. 方式一:rd.break 参数完整实操,麒麟信安下最稳的方案

3.1 进入 GRUB 并定位启动项

先重启机器,在 BIOS 自检过后注意观察屏幕。如果 GRUB 菜单正常显示,直接选中默认启动项,按e。如果屏幕直接进系统了,说明菜单被隐藏,需要在开机后立刻按住Shift(较新的 GRUB)或者快速连点方向键,逼它显示菜单。

进入编辑模式后,你会看到类似这样的片段:

load_video set gfxpayload=keep insmod gzio linux /boot/vmlinuz-4.19.90-... root=UUID=... ro crashkernel=auto ...

注意:这里内核行的开头可能是linuxefi(UEFI 引导时常见),不要慌,两者作用一样。我们要做的是在这行末尾追加参数。移动光标到该行结尾,输入:

rd.break

按Ctrl+x启动。系统会走一段初始化流程,最终停在一个类似下面的 shell 提示符:

Generating "/run/initramfs/rdsosreport.txt" Entering emergency mode. Exit the shell to continue. Type "journalctl" to view system logs. You might want to save "/run/initramfs/rdsosreport.txt" to a USB stick ...

看到switch_root:相关提示之前,系统会暂停,此时你已经拥有了 root 权限的 shell,只不过根目录还在 initramfs 环境下,真实根分区被挂载在/sysroot。

3.2 重置密码的完整命令序列

站到这一步,后面的操作就是固定的“四板斧”。我先把完整命令列出来,再逐条解释。输入时注意大小写,Linux 是区分大小写的:

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

第一条命令mount -o remount,rw /sysroot的作用是让根分区以可写方式重新挂载。默认情况下,为了数据安全,initramfs 阶段挂载根分区时是只读的,你直接chroot进去也是只读,执行passwd会报“只读文件系统”错误。这里走的一步是整个流程成败的关键。

第二条chroot /sysroot把当前 shell 的根目录切换到真实系统。注意,执行完之后你的工作目录和命令执行环境就变成了麒麟信安的真实文件系统,此时passwd root修改的就是真实系统里的/etc/shadow,而不是临时 initramfs 里的占位文件。这一步如果漏了,密码基本白设。

第三条passwd root就是标准的重置口令命令。系统会让你输入两次新密码,输入时屏幕上没有任何回显(不显示星号),这是个正常现象。密码设置上有几点硬性建议:长度不要低于 12 位,最好包含大小写、数字和特殊字符;不要用123456、root、toor、机器名等容易猜到的组合;也不要和旧密码有相似度太高的重复部分。麒麟信安的 PAM 策略里默认启用了pam_pwquality.so,如果新密码强度不足,命令会报错并要求重新输入。

第四条touch /.autolabel是在真实根目录下创建一个标记文件,目的是让系统下次启动时自动重新标记 SELinux 文件上下文。为什么要这个操作?因为我们是在 initramfs 阶段直接改/etc/shadow,新生成的文件可能没有正确的 SELinux 标签,若系统处于 Enforcing 模式,启动后可能出现无法登录或部分服务无法启动的诡异症状。做一次 re-label 可以避免后续麻烦。

最后连续输入两次exit,第一次退出 chroot 环境,第二次退出 initramfs 的紧急 shell。系统会继续完成启动过程,过程中可能会因为 relabel 需要格外的等待时间,这时千万不要硬重启,耐心看着它把文件标签刷完。

3.3 重新登录后必须做的校验工作

机器正常起来之后,用新密码尝试登录。登录成功后,别急着收工,先跑几个命令确认系统状态:

id getenforce chage -l root systemctl status sshd --no-pager

id确认当前用户确实是 root;getenforce看 SELinux 是 Enforcing 还是 Permissive,如果启动时有 re-label 过,看到的应该是 Enforcing 且所有服务正常;chage -l root查看 root 密码的过期时间,这一步很关键,我见过不少人重设密码后过几天又被“密码过期”坑一次;systemctl status sshd则是确认 SSH 服务正常监听,以免你关了终端之后才发现远程登录不了。

这里多说一句,chage -l root的检查结果是很多人忽略的重要参数。麒麟信安默认在/etc/login.defs里配置了密码有效期,如果显示Password expires不是 never,说明系统里有自动策略在驱动密码周期,你需要根据安全基线决定是否手动调整。

如果只希望这次重置生效且不想被“过期”困扰,可以执行:

chage -M 99999 root chage -E -1 root

-M 99999表示密码最长使用期限放宽到几乎不限制,-E -1表示账号永不过期。有些安全加固规范要求定期改密,这种场景下就别执行这两条,按你们自己的密码策略来就好。

4. 方式二:单用户模式(single)完整流程与适用场景

4.1 为什么部分机器上 single 也可行

rd.break虽然稳,但有一个使用前提:initramfs 要能正常加载并执行。如果你之前手动改过/etc/dracut.conf,或者系统用的是旧版 mkinitrd 生成的 initramfs,rd.break有可能不生效。这种时候可以退而求其次,用传统的内核参数single或1直接进入单用户模式。

麒麟信安的 systemd 环境下,single对应的是rescue.target,它启动时会挂载根文件系统、加载基本服务,最后给出一个 root shell。比rd.break更接近“正常系统”,但前提条件是根文件系统能够正常挂载,如果磁盘本身有问题,这条路也走不通。

4.2 单用户模式操作细节

操作的前半段和rd.break一样:GRUB 界面按e,在内核参数行尾追加参数。这里建议直接加single。加1在某些老内核里同样是单用户模式,但有的实现里1会被当作命令行参数传给 init,触发逻辑略有差异。

追加完成后,按Ctrl+x启动,系统会打印一堆启动信息,最后出现类似这样的提示:

Welcome to emergency mode, type "root" to enter

输入root回车,进入 shell。这一步是和 Ubuntu 单用户模式最大的不同——Ubuntu 默认是直接进入 root shell 的,而麒麟信安需要手动输入用户名。有的同事在这里卡住,以为是系统没启动成功。

进入 shell 后执行:

mount -o remount,rw / passwd root

如果系统启用了 SELinux,同样建议在重置密码后处理一下上下文:

touch /.autolabel

然后直接执行reboot -f或者其他你熟悉的重启方式。启动后同样跑一遍上一小节里提到的校验命令。

4.3 单用户模式里最坑的几个细节

  • 如果你在内核参数里只写了single而没有同步把根文件系统挂载参数从ro改成rw,进入 shell 后根分区是只读的,passwd绝对会失败。有些教程会让你同时把ro改成rw,这确实是更保险的做法,因为有些单用户模式的实现不会自动 remount。
  • 单用户模式退出时如果用exit而不是reboot,系统会继续执行后面的启动 target。如果你刚才是在只读状态下跳过了一些步骤,继续启动可能会进入奇怪的依赖错误,所以我建议操作完直接reboot -f重启,干净利落。
  • 不要试图在单用户模式里用passwd命令时指定参数,比如passwd -d root。-d是删除密码,会让 root 变成无密码状态,这在生产机器上是极大的安全隐患,有的版本还会进一步拒绝 SSH 登录。
  • 单用户模式下网络服务默认不会启动,这不是故障,别花时间在里头折腾网络。

实际使用中,我遇到的情况大多是rd.break走不通(比如自定义过 initramfs)、或者机器有特殊存储设备需要在真实系统环境下才认得到盘,才转用single。常规场景直接背rd.break那套流程就够了。

5. 密码过期与策略导致的问题,重置后要一起解决

5.1 密码过期提示的处理

前面提到过,很多“忘记密码”其实是“密码过期”的乌龙。但你通过重置流程改完密码后,也可能会遇到一个更隐蔽的问题——系统提示密码已过期,要求立即修改,而你明明刚设置了新密码。

这种情况多半是因为 root 账号的失效日期或最大使用期限被设置了具体数值。登录后马上执行:

chage -l root

看输出中的几项:Last password change、Password expires、Account expires。如果Password expires不是never,说明系统安全策略里启用了强制周期,比如 90 天改一次密码。

处理方式有两种:一是按策略重新设置一个符合策略的新密码,把有效期从当天重新计算;二是如果这台机器运行着自动化脚本或服务账号,宁可让密码长期有效,那就执行:

passwd -x -1 root passwd -w -1 root

-x -1去掉最大使用期限,-w -1去掉警告天数。这样以后不会再收到“密码即将过期”的骚扰。

这里要强调一下,修改密码策略参数属于系统安全加固的范畴,如果你的麒麟信安机器接入了等保合规要求,随意取消有效期可能会在审计里出问题。需要结合自身场景决定,不要只看运维方便。

5.2 passwd 命令因强度不足直接拒绝

另一个高发问题是:你在rd.break环境里执行passwd root,设置一个自认为足够复杂的密码,结果系统还是不接受,提示类似:

Bad password: too simple

原因有几种可能。一是 PAM 的pam_pwquality.so配置里minlen值设得非常高;二是你输入的新密码与旧密码相似度太高;三是某些定制版本启用了pam_passwdqc.so,它有独立的复杂度算法。

解决的思路不是绕过密码策略,而是设置一个真正强壮的密码。建议长度至少 16 位,且包含生僻字符组合,比如:

G7#k2pQ!vN9xLm4@

这样一类密码,不管策略怎么审查都基本能过。不要为了图省事去修改/etc/security/pwquality.conf把策略关掉,尤其在生产环境里,这属于拆除安全基础防护。

如果确实因为内部流程需要临时设置弱密码,在正常启动的系统里可以用chpasswd加echo方式绕过交互式检查的部分环节,但那只建议在隔离的临时环境里使用,生产机器还是老老实实遵守策略为妙。

5.3 重置之后 SSH 登录仍被拒

这个坑我踩过不止一次。密码通过 console 登录成功了,但远程 SSH 始终提示密码错误。排查起来不复杂,通常三个原因:

第一,/etc/ssh/sshd_config里配置了PermitRootLogin no。这种场景下你虽然重置了 root 密码,但 SSH 根本不允许 root 直登,需要改为yes或者用普通用户加 sudo 方式。改完重启 sshd。

第二,防火墙规则。麒麟信安可能启用了 firewalld 或 nftables,SSH 端口对你的来源 IP 没放行。检查一下 service 状态和端口监听情况。

第三,SELinux 布尔值限制。执行:

getsebool -a | grep ssh

如果ssh_sysadm_login或ssh_root_login是 off,SSH 相关策略会阻止 root 登录。临时调整可以用setsebool -P ... 1,但要评估影响再操作。

重置完密码后无论你通过哪种方式登录,都要把 SSH 状态一并验证到位,确保这台机器在你离开机房后还能正常工作。

6. 常见问题与排查技巧实录:我踩过的那几个坑

整个操作流程并不复杂,但细节决定成败。我把亲测过程中遇到的典型问题列成速查表,你再遇到可以直接对号入座。

现象可能原因解决办法
编辑 GRUB 后按 Ctrl+x 无反应键盘布局或 GRUB 版本问题确认光标焦点在内核行,试着按 F10
进入 shell 后根分区只读,passwd 报错没有 remount rw执行mount -o remount,rw /sysroot(rd.break)或mount -o remount,rw /(single)
设置新密码时报错 “Authentication token manipulation error”/etc/shadow 权限异常或根分区满检查挂载状态、磁盘空间df -h,必要时 fsck
重启后提示 SELinux 策略拒绝,登录卡住未处理文件标签进入紧急模式后执行touch /.autolabel,让系统重新标记并重启
登录成功但 sudo 提示找不到命令PATH 环境异常直接执行/usr/bin/sudo或重新登录
重置后系统时间跳变CMOS 电池故障或时间同步未启动查看timedatectl,重新配置 chrony/NTP
重启后 GRUB 菜单又不见,无法再进编辑模式启动配置恢复默认隐藏修改/etc/default/grub中的GRUB_TIMEOUT,重新生成 grub.cfg

其中“SELinux 策略拒绝”是麒麟信安上最容易出岔子的环节。不少老运维在 CentOS 7 上习惯了关闭 SELinux,到了麒麟信安上也没有主动确认状态。实际上,麒麟信安的安全基座里 SELinux 通常是开启的,而且强制模式比 RHEL 系默认的更严格。你重置密码后如果不做touch /.autolabel或者干脆把 SELinux 改成 disabled,后续会遇到账号登录成功但很多系统调用被拒、容器跑不起来、NFS 挂载失败等一串连锁问题。

另一个容易被忽略的坑是根分区空间满。重置密码需要写/etc/shadow,如果根分区被日志或临时文件塞满,passwd会失败,提示写入错误。此时哪怕你已经 chroot 成功,也没法正常修改。处理方案是进入单用户模式后先清理日志、/tmp下的临时文件,腾出空间再改密码。我遇到过一次/var/log/journal占了几十个 G 的情况,当时第一反应还以为是系统文件损坏,后来才发现是日志分区没独立所致。

另外,如果在 initramfs 阶段执行passwd时发现系统时区、时间完全不对,也会影响chage的到期计算。这种情况下先确认当前时间是否合理。如果差得离谱,改完密码后务必同步系统时间,不然后续审计日志里的时间戳会让你头大。

关于fsck的使用时机也要有分寸。机器是因为忘记密码进入紧急模式,而不是因为磁盘故障,原则上不需要主动跑fsck。有些朋友习惯性在单用户模式下执行fsck -y /dev/...,如果分区本身是干净的,这条命令纯粹浪费时间;如果分区能正常挂载,但文件系统异常,系统启动时自己已经报过错并常常自动修复。遇到真正的异常时,你应该先看journalctl或启动日志,而不是盲目fsck。

在GRUB编辑阶段还有个细节:如果你在追加参数时不小心手滑改了根分区 UUID 或删了某个参数,启动就会掉进dracut的 rescue shell,界面完全不同。这种情况不要慌,输入journalctl或者直接重启重新编辑即可。只要启动项没被删除,GRUB 总能恢复。

操作全程最好把每一步在纸上记录下来,尤其是你改了什么、原参数是什么。有些同事总觉得记住就行,结果中途手机响了、被人一打断,回来就忘记原始内容,最后不得不重装系统,那才是真正的灾难。

从长期运维角度看,这次重置密码成功后,还有一个动作建议顺手做掉:在/etc/ssh/下配置好 root 和普通用户的 SSH 公钥登录,并把 sshd 里的密钥认证保留、密码认证按需启用。这样一来,即使下一次密码策略出幺蛾子,你依然有一条不需要知道密码的远程通道可以进系统。平时别熬夜修密码,把时间花在配置信任链上,比什么都值。

最后再分享一个我个人的小习惯:每次重装完系统、改完密码,我会把密码放进公司密码管理平台的保险柜,并在系统里把修改时间、操作人记到/root/.admin_note文件里。这个文件既不是明文密钥库,也不依赖外部服务,纯粹是一份给后来人的说明。这算不上什么尖端技术,但在接手机器时真的能救命——你永远不会知道三年后接手这台机器的人,是不是已经把密码跟上一任一起忘了。

麒麟信安系统 forget root 密码这件事,本质上就一条原则:框架内的标准路径永远比硬闯更安全、更省事。理解 GRUB 参数的含义,比死记任何教程都管用。你只要吃透rd.break这套原理,不管以后换到哪款 RPM 系国产系统,都是同一套思路。密码是门禁,但门禁后面的钥匙,始终在系统本身的设计里。

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

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

立即咨询