1. 先捋清楚:现在的"单用户救援模式"还灵不灵
麒麟Kylin v11的root密码忘了,第一反应肯定是进单用户救援模式重置root密码。这个思路没错,但现在的Kylin v11不像老版本那样敲个single就能免密登进去了。新版系统基于systemd,启动链路由initramfs、systemd、target逐级拉起,传统的单用户模式已经变成rescue.target,而且默认情况下进入这种模式系统会要求你输root口令。这就尴尬了:root密码都忘了,还怎么进救援模式?
所以真正干活的思路要改一下:不是去等系统把服务拉起来再弹一个登录框,而是想办法在内核初始化的早期阶段拿到一个shell。这个阶段系统里还没有用户态认证逻辑,root密码校验根本没机会执行,我们就能在这个shell里直接把密码改掉。整篇文章围绕的就是这条技术路线:通过修改GRUB启动参数,借道initramfs里的rd.break钩子进入救援shell,再chroot到真实系统,完成root密码重置。这条路在Kylin v11的物理机、虚拟机上都实测可行,背后涉及的内容包括GRUB参数写法、sysroot挂载、passwd命令、SELinux标签处理、LUKS加密盘限制等,下面逐步拆开讲。
这套方法不只有"忘密码"这一个用途。如果你遇到系统起不来、rsyslog挂了但登录后shutdown命令又不好使,或者只想去掉某个异常的开机自启动服务,也可以用这里的思路。只要你能在GRUB菜单里编辑启动项,后面的大多数维护操作就都能做了。
1.1 重新理解Kylin v11的启动链路
要不再翻旧手册掉坑,得先看明白Kylin v11启动时到底做了哪些事。以UEFI引导为例,整个启动顺序大致是:固件 -> GRUB2 -> 内核与initramfs -> systemd -> 各target。GRUB读取/boot/grub2下的配置文件,加载内核镜像和initramfs。initramfs是一个微型根文件系统,里面包含了磁盘驱动、LVM、加密模块这些基础组件,任务是把真正的系统盘识别并挂载起来,然后切根(switch_root)进入你的系统根目录,再交给systemd继续启动。
rd.break这个参数的作用,就是在initramfs完成了一半工作、但还没有做switch_root之前打断它,直接给你一个root shell。这个阶段你的真实系统根目录已经在/sysroot下,只是通常以只读方式挂着。这就是"救援模式"的本质:不是传统意义上的登录框,而是让你在用户态服务全都还没起来的时候手动干活。
1.2 什么时候才用这套方案
一说重置root密码,很多人条件反射就是重装系统。重装确实快,但生产环境里的业务数据、应用配置、数据库实例全都得迁移,代价往往比想象中大得多。root密码丢失属于典型的"能修就不重装"场景,单用户救援模式就是用来处理这类问题的。
用这套方法的前提条件也很明确:你至少得能操作机器的控制台或虚拟机管理终端,能看到并编辑GRUB菜单。如果机器已经进了顽固的启动死循环,或者磁盘物理故障,那就不是密码恢复能解决的了,别硬套。另外,如果这台机器用了LUKS整盘加密,在rd.break之前系统会先弹加密口令输入界面。只用知道加密盘密码,才能继续往下走;如果加密盘密码也忘了,那下面的操作就做不到。这属于一个很关键的边界条件。
2. 动手前先花两分钟做确认
准备工作往往比操作本身更能决定成败。很多教程上来就让你改GRUB,结果一顿操作后发现连菜单都进不去,或者进去后不知道哪个设备是根分区,最后卡在半路。下面这几件事建议先走一遍。
2.1 确认你的系统版本和引导方式
麒麟操作系统的发行型号很多,Kylin v11这个叫法在不同场景里可能对应桌面版、服务器版、ARM版、AMD64版,引导方式有可能是传统的BIOS+MBR,也可能是UEFI+GPT。不过对于重置root密码来说,核心操作是一致的:都是编辑GRUB启动条目。区别只在你按e进入编辑界面后,启动行是叫linux还是linuxefi,以及要不要去掉rhgb quiet这种图形参数。
用下面命令可以快速确认版本,但如果你已经进不了系统,就只能靠回忆或者另一台同版本机器来判断了。
cat /etc/kylin-release cat /etc/os-release grub2-editenv list我建议你在有条件的机器上提前把这些信息记下来,尤其是根分区是什么类型。比如根是LVM逻辑卷、还是普通ext4分区、还是btrfs子卷,这会影响到一会chroot之后要不要激活卷组。多数Kylin v11默认安装会走LVM,但在initramfs阶段LVM其实已经被激活了,所以大部分时候不用手动处理。
2.2 需要的工具其实就这两样
不要被"救援模式"四个字吓住,需要的东西不多:
- 能显示控制台的屏幕和键盘,或者虚拟机的VNC/vSphere控制台
- 一条可以稳定打字的手(GRUB编辑界面没有复制粘贴,依赖键盘)
不需要U盘,不需要LiveCD,也不需要任何外接介质。整个操作发生在本机系统内部,只要你还进得了GRUB菜单,就够用了。如果机器在机房,可以提前告诉自己要盲操作:开机后不停按Esc或F2,看厂商固件习惯;严格说GRUB菜单出现前一般会有提示,但响应窗口很短。
2.3 优先建立备份意识和风险清单
虽然操作核心只是改密码,但涉及GRUB参数和内核引导,万一改错可能导致系统起不来。我的习惯是在动手前先把GRUB里当前启动项的完整命令行用手机拍下来,或者抄在纸上。这样就算改坏了,也可以按原样敲回去。另一个保险是,如果机器有快照功能(虚拟机都有),先打个快照;物理机没有快照就得谨慎点,别在没确认磁盘状态的情况下乱敲命令。
3. 逐步实操:从GRUB参数到root密码重置
下面进入正题。以一个典型的Kylin v11 AMD64系统为例,完整流程分四步。每一步我都把可能遇到的分叉写法写出来,你对照自己的情况选。
3.1 在GRUB菜单里修改内核启动参数
重启机器,在GRUB菜单出现时,用方向键选中默认启动项,按下字母e进入编辑模式。这时候你会看到一堆以set、insmod、linux、initrd开头的内容,我们要改的是那个以linux开头的行,也可能是linuxefi,取决于平台。
把光标移动到该行末尾,在最后的参数后面加一个空格,然后输入:
rd.break顺便建议把同一行里的rhgb和quiet去掉。rhgb是图形化启动画面,quiet是隐藏内核日志,去掉之后你能看到滚动输出,出问题时更容易定位。修改完之后,按Ctrl+X或者F10执行启动。这时候系统会加载内核,进入initramfs,随后停在rd.break中断点,弹出一个root shell。
需要注意,GRUB编辑改动是临时的,只针对本次启动有效,不会写入grub.cfg,重启后自动恢复。这一点既是优点也是陷阱,优点是改错了重启一下还能回到原样,缺点是如果你这次没把密码改成功,下次开机还要再进一遍GRUB。
3.2 在initramfs的shell里挂载真实根文件系统
进入rd.break的shell后,你可能看到提示符类似switch_root:/#,这就是initramfs环境。在这个环境里,你的真实系统根目录已经被挂到了/sysroot下。先确认一下当前状态:
mount | grep sysroot ls /sysroot正常情况下/sysroot下就是Kylin系统的目录结构,bin、etc、usr这些目录都在。不过当前一般是只读挂载。要修改里面的东西,先给它重新挂载为读写:
mount -o remount,rw /sysroot这一步很关键,漏掉的话后面chroot进去一执行passwd就会报read-only file system错误。如果你用了LVM但到这里还没激活卷组,可以手动激活一下:
lvm vgscan lvm vgchange -ay在大多数默认安装场景下,这一步不需要;如果发现/sysroot是空的,多半是逻辑卷没起来,激活之后再检查。
3.3 chroot到真实系统并重置root密码
挂载状态没问题后,用chroot把当前shell的根目录切换到/sysroot,这样后续所有命令都作用在真实系统上:
chroot /sysroot /bin/bash进入之后可以先加一条环境变量,避免后续出现奇怪的locale问题:
LANG=en_US.UTF-8 export LANG然后就是非常普通的改密码命令:
passwd root系统会提示输入两次新密码。这里我多说一句,Kylin默认对密码复杂度有要求,别设一个太短的弱密码。命令执行成功后,会显示类似all authentication tokens updated successfully的输出。这是整个流程最关键的一步,看到这个提示后密码就已经改掉了。
如果你还想顺手做点别的维护,现在也可以做。比如查看系统日志,或者排查某个服务为什么起不来。但注意,chroot环境里不是所有命令都能直接跑,很多systemctl操作要依赖完整的systemd运行状态,这种场景下不一定好使。
3.4 处理SELinux上下文并安全退出
如果你的Kylin启用了SELinux强制模式,直接改了/etc下文件的安全上下文之后,重启时系统可能因为文件标签不对而拒绝登录或起不来。稳妥做法是在chroot环境里执行:
touch /.autorelabel这个操作会告诉SELinux在下次启动时自动重新标记文件系统。不用纠结你有没有启用SELinux:没启用的话,这个空文件存在那里也无害,下次启动就会消失;启用的话,这步绝对能帮你省掉一次重装。
所有事情处理完后,连续输入两次exit退出chroot和initramfs的shell。如果想稳妥地让系统重新引导,可以执行reboot -f。注意别直接在chroot里用reboot,因为此时你还在initramfs环境里,直接重启会中断得比较粗暴。我习惯是回到switch_root提示符后执行reboot -f。
机器重新启动后,正常进入登录界面,这时候用小键盘输你刚设置的新root密码就行。如果一切正常,就完事了。
4. 常见问题与我踩过的那些坑
这部分是实际操作里最容易卡住人的地方。我把自己遇到和见过的问题整理成一张速查表,后面再补几条经验。
4.1 问题速查表
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 按e没反应,GRUB菜单出不来 | 开机阶段手速不够,GRUB菜单超时被跳过 | 开机后连续点按Esc或Shift,有的UEFI机器要按F12进启动菜单选GRUB |
| 加rd.break后黑屏 | rhgb、quiet没去掉,内核日志被隐藏 | 删除这两个参数重新引导,对照串口或截图看卡在哪一步 |
| 进shell后发现/sysroot是空目录 | LVM卷组没激活 | 执行lvm vgscan; lvm vgchange -ay再查看 |
| chroot后执行passwd报read-only file system | 根文件系统还是只读挂载 | 检查是否执行了mount -o remount,rw /sysroot |
| passwd成功了,重启后还是旧密码 | 没真正保存到/etc/shadow | 确认是在chroot /sysroot后的真实系统里执行,不是initramfs的临时环境 |
| 系统有LUKS加密盘,卡在解密界面 | 磁盘加密口令无法绕过 | 解密口令没忘才可能继续;整盘加密口令丢失只能走备份恢复路径 |
| 重启后进不去SELinux策略下的桌面 | 修改过的文件安全上下文异常 | 启动时在内核行再加入enforcing=0临时关闭,进系统执行restorecon -Rv /etc或setenforce 1 |
4.2 几条不写在官方文档里的经验
第一,GRUB编辑界面的键盘布局可能是英文,如果你的root密码里本来带中文相关字符,设置新密码时最好只用ASCII字符,免得在密码框里找不到对应键。第二,很多系统改完密码不成功,核心原因都是没理解chroot边界。你看到shell提示符再花哨,只要没做chroot,改动就落在initramfs内存盘里,重启必然丢。第三,RD.break中断点出现的提示符虽然不起眼,但这里实际上拥有完整的磁盘驱动和基础命令集,能做的事情比想象得多,不只改密码。
还有一个很容易被忽略的细节:如果你是在虚拟机里操作,并且虚拟机接入了云平台的密码管理服务,重置密码后最好去云平台侧也同步更新一下托管密码,否则下次平台侧自动同步时又可能把密码覆盖回去。物理机的话就没这个问题,但要注意管理卡和BIOS的口令别和系统root口令混着用,否则又得一轮新的"忘记密码"流程。
另外,GRUB本身也可能设了密码。如果这台机器在安装后刻意对GRUB做了口令保护,你会发现连按e都进不去编辑界面,那就只能找有GRUB口令的人协助,或者通过物理介入手段恢复了。绝大多数默认安装不会有这个问题,但高安全要求的服务器上必须提前想到。
我在实际运维里还试过另一条路径:不打断initramfs,而是用systemd.unit=rescue.target直接进救援模式。但对忘了root密码的机器来说,这条路可能卡在密码提示上,还不如rd.break来得干净。后来我基本固定就用rd.break方案,逻辑简单,步骤少,唯一要记住的就是root系统是挂在/sysroot下的。操作过几次之后,整套流程大概两三分钟就能走完,几乎不会出岔子。后面如果你遇到类似的系统维护场景,比如想修改某个grub启动参数做临时调试,这套思路是完全通用的。