
最近有好几个运维朋友问到麒麟信安系统root密码忘了怎么办这问题其实挺常见——不是账号被人恶意锁了就是太久没登录密码过期了更常见的是项目交接时原管理员没把root密码留下。我经手过的国产化项目生产环境里麒麟信安系统不算少数平时要求稳定不重启可一旦真的到了忘记root密码这一步再稳的机器也得停下来处理。这篇文章就基于我实际在麒麟信安系统上的操作记录讲讲root密码忘记后的几种重置方法。如果你是刚接触国产Linux的运维照着做也能解决问题。1. 忘密码前的判断麒麟信安系统能不能用CentOS的救援方法1.1 麒麟信安系统与CentOS系Linux的兼容性麒麟信安系统KylinSec是基于Linux内核的国产服务器操作系统引导方式默认是GRUB2init系统是systemd整体操作习惯和Red Hat Enterprise Linux、CentOS非常接近。在实际维护中网上大量针对CentOS/RHEL的root密码重置方法在麒麟信安上基本能用只是GRUB启动菜单的名称不叫“CentOS”而是麒麟信安自己的名称路径、shell、服务名这些细节大同小异。这里要先说明一个容易混淆的点麒麟信安系统在项目里经常遇到不同小版本有的版本和CentOS 7更像有的版本融入了更多openEuler系的东西。但无论哪个小版本只要能进GRUB编辑菜单通过修改内核启动参数来重置密码的逻辑都是一样的。这个底层兼容关系决定了我们的排查思路可以复用也意味着你在搜索引擎里翻到的CentOS 7重置方法大概率是有效的。1.2 三条可走的修复路线以及为什么首选rd.break忘记root密码后常见有三条路线修改GRUB内核参数进入initramfs临时shellrd.break修改GRUB内核参数进入单用户模式/救援目标systemd.unitrescue.target通过系统安装光盘或USB启动介质进入救援模式这三条路线本质都一样绕过正常的登录认证在加载完内核后、或加载到一半的时候直接用shell修改密码文件。我通常首选rd.break。原因是它打断启动的时机最早在systemd还未切换根目录之前就停下来。此时SELinux策略还未完全介入很多后续会被卡住的操作在这个阶段反而畅通。单用户模式虽然也可以但有些版本在进入rescue.target时会提示输入root密码或者要求按CtrlD重启这就尴尬了——你正是因为忘了密码才进的救援它却要密码。而安装介质救援模式需要手边有匹配的介质临时找起来麻烦而且介质版本和系统版本不一致时chroot进去可能遇到库文件不匹配的问题。所以只要Grub菜单能打开rd.break是我第一个尝试的办法。2. 动手前必看GRUB参数与挂载状态解析2.1 进入GRUB编辑模式的实操窗口重置root密码最关键的一步是进入GRUB编辑界面。麒麟信安系统默认的GRUB菜单超时时间往往很短有些甚至直接隐藏菜单。你需要在开机自检结束、屏幕出现厂商Logo或黑屏的那一瞬间按住键盘的Shift键传统BIOS启动或连续按Esc键UEFI启动把GRUB菜单“拦下来”。菜单出现后用方向键选中默认的内核启动项然后按e进入编辑模式。注意这里不是按Enter直接启动而是e。进入后你会看到一长串内核启动参数通常以linux16、linux或kernel开头的行需要我们处理。移动光标到该行末尾留一个空格后追加参数。其他行特别是initramfs开头的行不要乱动否则很可能连救援环境都进不去。如果服务器是通过KVM/IPMI远程管理的要确认你用的Web控制台或虚拟串口能够把按键传递到底层虚拟机。很多时候按e没反应不是机器问题是按键没有传到GRUB层面。我踩过这个坑明明是键盘按了e控制台没反映后来才发现是JViewer的输入焦点没有点进去。2.2 linux16行后面加的每个参数到底有什么用在linux16那行末尾不同的追加参数会决定你进入什么环境。我列个对比表追加参数启动时发生什么适用场景rd.break在initramfs阶段、切换真实根目录前中断进入临时shell最通用适合SELinux启用的系统init/bin/bash内核直接把/bin/bash作为第一个进程启动可进入shell但和rd.break不能同时用systemd.unitrescue.targetsystemd进入救援目标类似单用户模式传统单用户模式习惯single或数字1systemd以单用户模式启动老CentOS习惯部分系统会被SELinux限制rd.break这个名字看起来有点抽象其实“rd”是ramdisk的缩写。启动过程中initramfs一个临时根文件系统先被加载到内存然后完成挂载真实磁盘根分区的准备工作。加了rd.break相当于在这个准备完成后突然踩一脚刹车系统停在底层shell但真正的系统根目录还没切换过去。此时真实系统的根文件系统被挂载在/sysroot目录下你需要手动处理。而init/bin/bash相当于让内核不要启动systemd直接运行一个最原始的shell。这个方法在很老的系统上常用但在新版麒麟信安上容易遇到“根文件系统只读”的问题后续操作和rd.break差不多不如rd.break方便。2.3 从只读挂载到读写挂载remount这一步不能省很多人在rd.break阶段直接执行chroot /sysroot然后想都不想就改密码结果遇到“只读文件系统”错误。原因是initramfs在中断前把/sysroot挂载为只读模式防止你在这个阶段把系统文件改坏。你需要先把它重新挂载为可读写mount -o remount,rw /sysroot这里要特别注意参数顺序remount是在不改变挂载点的情况下重新挂载一次必须跟-o rw一起而且rw写在前面的挂载选项列表里。写成mount -o rw,remount /sysroot或mount -o remount,rw /sysroot都可以但别只写mount -o remount /sysroot那会按原只读属性重新挂载等于白干。单用户模式下也有类似情况。虽然单用户模式理论上已经是真实根环境但有时根文件系统还是只读挂载的。稳妥起见进入shell后先执行mount -o remount,rw /确认读写。这一步是后续所有修改的基础漏了的话前面所有功夫都会白费。3. 三种重置root密码的方法与完整操作记录3.1 方法一rd.break方式推荐适用最广这个方法我强烈推荐尤其当系统开启了SELinux时。完整步骤如下重启服务器在GRUB菜单处按e编辑默认启动项。找到linux16开头的行移动到行尾留一个空格追加参数rd.break。按Ctrlx或F10启动。这里注意不是按Enter。系统会停在initramfs的shell界面提示符类似switch_root:/#。执行下面两条命令把真实根目录挂载为可读写并切换进去mount -o remount,rw /sysroot chroot /sysroot执行修改root密码的命令passwd root按提示输入新密码两遍。如果系统配置了密码强度策略弱密码会被拒绝比如少于8位、不包含大小写数字组合等。建议使用一个强度足够的新密码不要图省事设成123456。如果系统启用了SELinux麒麟信安默认多为enforcing在chroot环境下执行touch /.autorelabel这个命令会在真实根目录下创建一个标记文件重启后内核会自动重新标记文件安全上下文。不执行这步改了/etc/shadow后文件上下文可能会漂移重启结果就是密码明明改对了但SSH和本机登录都进不去。连续执行两次exit退出chroot和initramfs shell系统会继续完成启动流程。然后等待重启完成用新密码登录root。整个过程不需要联网因为是本地shell操作网络服务在这个阶段大概率没起来。实测中从重启到完成改密一般三分钟以内搞定比起找安装盘重新引导要快得多。3.2 方法二单用户模式systemd.unitrescue.target如果你的系统没有启用SELinux或者你更习惯传统Linux救援方式可以尝试单用户模式。步骤在GRUB编辑界面找到linux16行行尾追加参数systemd.unitrescue.target不是直接写single首选用完整unit名称避免兼容性歧义。Ctrlx启动。系统会准备进入救援目标。进入shell后同样确保根文件系统可写mount -o remount,rw /修改密码passwd root如果启用了SELinux同样需要touch /.autorelabel输入reboot重启正常登录。这个方法有个隐藏问题某些麒麟信安版本在进入rescue.target时会弹出“需要root密码来继续”的提示或者直接要求按CtrlD重启。这在忘记密码的前提下几乎是死局。所以如果单用户模式进不去不必死磕马上回头用rd.break。3.3 方法三系统光盘救援模式当GRUB引导菜单本身已经损坏或者你手边正好有麒麟信安系统安装光盘、USB启动盘时可以用救援模式从安装介质启动选择语言后在安装方式界面选择“救援已安装的系统”或“Rescue a system”。救援程序会扫描磁盘找到已安装的系统将原系统根分区挂载到/mnt/sysimage。进入shell后切换到原系统环境chroot /mnt/sysimage修改密码passwd root如果系统启用了SELinux同样创建/.autorelabel标记文件。执行exit退出chroot再退出救援程序系统重启。这个方法的最大限制是介质版本。如果安装光盘的系统版本和硬盘里安装版本跨度很大chroot之后执行passwd可能提示缺少动态链接库或命令路径不对。遇到这种情况建议重新挂载或者干脆用rd.break避免在版本兼容上浪费时间。3.4 重置后的清理与验证SELinux、新密码、重启测试密码改完不是马上大功告成还要做几个布尔判断第一确认GRUB菜单里追加的参数没有被保存。rd.break、systemd.unitrescue.target这些参数都是临时的重启后自动消失。但如果你在GRUB编辑界面期间顺手改了其他持久化配置或者之前改过/etc/default/grub就要检查GRUB_CMDLINE_LINUX里有没有残留调试参数。正常情况不需要改配置文件。第二处理好SELinux标记。前面说的touch /.autorelabel是最省心的方式。如果你不想重启后全盘重新标记等太久也可以单独恢复shadow文件上下文restorecon -v /etc/shadow /etc/gshadow全盘relabel在重启时自动进行根据机器配置不同可能持续几分钟到十几分钟。千万在这个过程中不要强制断电否则文件标记得不全后续登录可能不稳定。第三验证新密码。重启后先用root在本机登录一次再用SSH从另一台机器登录一次。如果本机登录正常但SSH被拒检查/etc/ssh/sshd_config是否有PermitRootLogin no那是另一个策略问题。另外建议在这个阶段把当前密码信息同步到密码管理库避免又丢一次。4. 实战中踩过的坑常见问题与排查方向4.1 按e没反应、引导菜单只闪一下就没了我在多台麒麟信安服务器上都遇到过这个问题排除键盘本身失灵后要逐个检查GRUB菜单是不是被隐藏了。如果是开机时长按Shift传统BIOS或连续按EscUEFI唤出菜单。部分麒麟信安版本默认GRUB_TIMEOUT0需要手动干预。服务器是不是通过远程管理卡连接的。IPMI/KVM的虚拟控制台有时不会捕获GRUB阶段的按键需要等一会儿按或者换用串口控制台。GRUB是否设置了密码。设置了superusers之后按e会先要求输入GRUB用户和密码这个密码和系统root密码独立。如果你没有GRUB密码rd.break这条路等于封死只能用安装介质进入到救援模式后再想办法。所以生产环境建议把GRUB密码保存在安全位置别依赖单一管理员记忆。4.2 passwd修改成功但重启后密码还是不对这个现象最迷惑人。明明执行passwd时一切正常重启后却登录失败。我遇到过的原因有三种改错了shadow文件。在rd.break阶段如果忘记chroot /sysroot直接在原始shell执行passwd修改的是initramfs临时文件系统里的文件重启后所有改动丢失。判断方法执行passwd前先执行pwd如果路径不是/sysroot相关的真实系统路径就是没切进去。SELinux上下文不对。重启后内核安全策略拒绝ssh或login读取shadow文件表现就是“密码错误”实际上密码是新的。处理方式做touch /.autorelabel或restorecon -v /etc/shadow。PAM账户锁定策略。如果之前root因为输错密码次数过多触发了pam_faillock锁定即使密码重置锁定标记还在登录也会被拒。这种情况下可以进入same shell后查看/var/log/faillock里面Root的锁定记录清理对应文件或者执行faillock --reset --user root如果版本支持。4.3 根文件系统被LUKS加密时重置密码的优先级现在很多麒麟信安生产环境会开启全盘加密忘记root密码前还要过LUKS密码这一关。在GRUB编辑页追加rd.break后启动流程会在挂载/sysroot之前要求输入LUKS解密密码。如果LUKS密码也忘了那root密码重置就没意义了——你需要先处理加密盘的恢复问题这就是另一个话题。如果LUKS密码还在你可以在GRUB参数里显式指定rd.luks.nameUUIDxxx,root其中UUID是加密分区的UUID。这条参数可以让initramfs在进入shell前自动尝试解锁。但推荐方式是正常启动时输入LUKS密码解锁后再按rd.break流程走避免在GRUB参数里写死敏感信息。4.4 修改内核参数后启动卡住如何盲操作启动过程中屏幕停在滚动日志但一直没有shell提示符出现这种“卡死”偶尔会碰到。尤其当默认console配置不是TTY时shell已经起来了你只是看不到提示符。可以盲打命令先敲一次回车看看有没有空行输出。输入mount -o remount,rw /sysroot回车。输入chroot /sysroot回车。输入passwd root回车按提示输入新密码。如果盲打完密码后依然没有反馈可以在GRUB参数里临时追加consoletty0或consolettyS0,115200再启动一次。前者把日志输出到本地屏幕后者面向串口终端。这个参数不影响重置密码只是让输出可见。5. 防止下次再忘密码管理与安全加固建议5.1 用密钥认证替代root密码登录如果服务器平时只有少数几个运维人员远程管理最省事的方法就是配置SSH密钥登录把root密码当成备用凭证。在麒麟信安系统上先在本机生成密钥对ssh-keygen -t ed25519 -C rootserver把公钥追加到服务器/root/.ssh/authorized_keys然后确认/etc/ssh/sshd_config中PermitRootLogin、PubkeyAuthentication配置正确。再决定是否关闭密码登录。日常维护时用密钥认证登录后执行sudo passwd root就能改密码根本不用重启跑机房。但要注意密钥文件本身要保护私钥丢失后如果被拷贝走等于给了别人root权限。所以私钥建议设置口令并且存放在加密容器里。5.2 密码过期策略与定期修改提醒我见过不少root密码忘掉是因为系统安全策略要求3个月改一次密码但账号过期提醒被忽视了。在麒麟信安上可以给root设置合理的过期时间chage -M 90 -W 7 root这条命令设置密码最长使用90天提前7天开始提示。同时你还要在运维监控里配置对账号过期时间的定时检查不要只依赖登录时那一两行提示。另外如果项目有多个管理员建议root密码放在密码管理库改完密码后所有管理员都能看到最新版本避免人员变动后被清空记忆。5.3 给GRUB加口令防止物理接触被改密码上面介绍的rd.break重置方法前提是能物理接触服务器、能进入GRUB编辑界面。就算系统root密码设置得再复杂别人只要能摸到服务器、能按e就能用同样的方法把root密码改掉。所以对于机房安全要求比较高的场景应当给GRUB设置口令。麒麟信安系统默认支持GRUB2的超级用户认证机制。可以使用grub2-set-password或者用grub2-mkpasswd-pbkdf2生成加密哈希然后配置到/etc/grub.d/40_custom中最后重新生成/boot/grub2/grub.cfg。设置之后按e修改启动参数前必须提供GRUB账号密码。这样一来密码重置这条路被物理安全策略堵住了也反过来保护你的root密码不被别人轻易重置。当然GRUB密码和root密码要分开管理最好由两个不同角色保管。否则GRUB密码遗忘了一样得用安装介质进救援模式处理麻烦程度比root密码有过之而无不及。我个人在实际维护中的体会是root密码这种关键基础凭证不能完全依赖某一个人的记忆力。每次给客户部署麒麟信安系统我都会做三件事把初始root密码放进密码管理库设置密码过期提醒并且提前配好SSH密钥登录。这样即使哪天真的忘了密码只要密钥认证还能通过远程就能直接sudo把它改掉根本不用跑机房重启。如果连SSH都进不去那说明距离彻底断连已经不远物理访问层的保护也该同步加强。希望上面这些操作记录能帮正在和root密码较劲的运维朋友少走几个弯路。