忘掉root密码这事,放在任何Linux发行版上都够头疼的,在国产操作系统上更是容易让人手忙脚乱。尤其像麒麟Kylin v11这种既能跑在国产CPU整机上、也能装在虚拟机里的系统,如果你手上刚好有台配置好环境却想不起密码的机器,或者是从同事手里交接过来一台“密码未知”的服务器,单用户救援模式就是最常用的救场手段。我用这套方法在Kylin v11桌面版、v10 SP1服务器版上都实际操作过,折腾过UEFI引导的机器,也试过在VMware里救砖,整个过程说难不难,但确实有几个关键坑,不提前搞清楚容易卡在只读文件系统、SELinux标记这类细节上。
这篇文章直接围绕麒麟Kylin v11来写,给你完整走一遍单用户救援模式重置root密码的流程,附带参数说明、踩过坑的排查记录,以及“重置之后立刻要做的几件事”。不管你是系统运维、测试环境搭建,还是刚入职接手内网机器的新手,照着这个流程走下来应该都能把密码找回来。
1. 动手前的必知概念:为什么用单用户救援模式
1.1 单用户模式到底是个啥
单用户模式(Single User Mode)是Linux系统里一种极简启动方式,启动后不会加载常规的服务、网络、图形界面,而是直接进入一个root权限的命令行Shell。它最初的设计目的是让管理员执行系统修复,比如修复损坏的fstab、排查驱动问题、以及重置忘记的密码。说得通俗点,正常开机是“全家老小都上班”,单用户模式则是“只把保安叫来开门”,这样你就能在不被任何服务干扰的情况下进入系统底层操作。
麒麟Kylin v11虽然面向国内政企和日常桌面场景做了很多定制,但底层依然是基于Linux内核和GNU工具的体系。它的引导流程和RHEL/Fedora分支比较接近,所以单用户救援相关的操作思路、命令格式,和CentOS、Rocky这些系统几乎一致。这意味着你如果在其他Linux发行版上有过类似经验,迁移到麒麟上不会有什么障碍。
1.2 为什么重置密码要走引导参数这条路
很多人会想到用LiveCD启动后挂载硬盘直接改/etc/shadow,这个方法当然可行,但前提是你手头得有对应架构的Live镜像(麒麟一个ISO通常好几个G,不一定随时都有),还得考虑SELinux安全上下文的问题——改动过的shadow文件如果权限或标记不对,系统启动时甚至可能导致认证异常。相比之下,单用户救援模式直接复用你机器上已有的内核和initramfs,不需要额外准备任何引导介质,只需在GRUB菜单里动手脚就行,是最省事、最不容易引入新问题的办法。
另外,麒麟v11在默认安装时通常会启用SELinux(目标策略),用单用户模式重置密码还有一个隐藏好处:我们可以在同一个流程里顺手处理SELinux的自动重标记,避免系统下次启动时出现奇怪的登录失败或服务拒绝访问问题。LiveCD方案反而容易漏掉这一环。
1.3 适用场景和不适用场景
适合用单用户模式的情况包括:
- 忘记root密码,系统还能正常引导到GRUB菜单
- 从同事那里接手机器,只知道普通用户密码但不知道root密码
- 账号被锁定(比如passwd -l操作),需要通过救援模式解除锁定
- 系统提示密码过期,但你不知道旧密码,无法正常轮换
不太适合的场景:
- GRUB菜单损坏或引导器丢失,这种要去重建引导,不是重置密码能解决的
- 硬盘被LUKS加密,且你没有解密密钥,单用户模式也进不去,需要先解决加密问题
- 系统处于网络远程状态,你没法到物理控制台操作,这种情况最好走带外管理(如IPMI)或找现场人员配合
2. 完整重置步骤:从开机界面到新密码生效
2.1 第一步:进入GRUB编辑界面
开机后,看到麒麟的启动菜单(通常是蓝色或黑色背景,列出多个内核版本)时,需要快速按下键盘上的e键。注意不是回车,是e(edit),这个操作会进入GRUB的编辑模式,让你临时修改启动参数。
如果你的机器开机速度很快,来不及按键就进了系统,可以试试在BIOS/UEFI里关闭快速启动,或者开机时长按Shift键强制显示GRUB菜单。麒麟v11在部分国产固件上默认可能隐藏菜单,这种情况下Shift比Esc更可靠——我在某台基于飞腾CPU的整机上实测,按Esc容易直接退出到固件设置界面,按Shift反而能稳定调出引导菜单。
使用虚拟机(VMware Workstation或ESXi)的话,在虚拟机开机瞬间把鼠标点进虚拟机窗口内,然后快速按e,配合快捷键Ctrl+G捕获鼠标,操作时间会更充裕。
2.2 第二步:定位内核引导行并追加参数
进入GRUB编辑界面后,你会看到一大段以load_video、set gfxpayload等开头的脚本配置,不用理会那些,直接寻找以linux开头的那一行。在Kylin v11上,这行的典型样式是:
linux /vmlinuz-4.19.90-... root=/dev/mapper/kylin-root ro quiet splash不同机器上内核版本、root设备路径可能不同,但核心特征是linux开头、包含ro参数、后面跟着quiet或splash之类的内容。
用方向键把光标移动到这行末尾,在行尾追加以下参数(两者选其一即可,我更推荐第二种):
rd.break或者:
init=/bin/bash参数解释:
rd.break是dracut(initramfs生成工具)提供的一个调试参数,它让系统在切换根文件系统之前先暂停,落入一个特殊的shell提示符。此时根文件系统尚未切换,但硬盘上的实际系统根目录会挂载在/sysroot下面。init=/bin/bash则是让内核直接启动到bash,不经过systemd,适合快速进入救援环境。但这个方案受SELinux限制多一些,后面要说。
如果你还看到quiet或splash,顺手把它们删掉也行,这样启动过程会打印更多日志,方便观察有没有报错。不过这不是必须操作,嫌麻烦的可以不动。
修改完成后,按Ctrl+X或F10启动系统。如果你的主板快捷键不同,GRUB编辑界面底部会有提示,留意一下即可。
2.3 第三步:进入救援Shell并挂载文件系统
如果使用了rd.break参数,系统启动过程中会停下来,出现类似下面的提示符:
switch_root:/#此时你处于一个极简的initramfs环境中。先用下面的命令确认一下根文件系统的状态:
mount | grep sysroot正常情况下你会看到类似/dev/mapper/kylin-root on /sysroot的输出,说明真正的系统根目录已经挂在/sysroot。但这一阶段通常是只读挂载,直接修改密码会失败,所以要先重新挂载为读写模式:
mount -o remount,rw /sysroot然后需要把实际的系统根目录切进去,让后续命令操作的是真正的系统环境:
chroot /sysroot如果你的引导参数用的是init=/bin/bash,那么系统会直接停在一个bash提示符下,并且根分区同样处于只读状态。此时需要执行:
mount -o remount,rw /然后再进行后续操作。
这里有个容易混淆的点:rd.break和init=/bin/bash两种方式进入的Shell环境不同,挂载状态也不同。用rd.break时,你最后要退出两次(先exit退出chroot,再exit退出switch_root),机器才会继续启动;用init=/bin/bash时,你改完密码后不能简单exit,因为init进程已经变成了bash,退出它会直接触发内核panic或者卡住,应该在修改完成后直接执行exec /sbin/init或reboot -f来恢复启动流程。
2.4 第四步:执行密码重置
现在你已经在真正的系统根目录环境下了。直接运行:
passwd root系统会提示输入两次新密码。这里有个重要提醒:麒麟v11对密码强度默认有一定要求,如果你设得太简单,比如123456或password,passwd命令会拒绝修改或者给出警告。我遇到过最小长度限制是8位以上的策略,建议直接设一个包含大小写字母、数字和特殊字符的强密码,省得来回折腾。
密码重置成功后,系统会提示passwd: all authentication tokens updated successfully。
此时如果你所在环境启用了SELinux,还需要做一个额外操作——创建自动重标记文件。不做的后果是:密码虽然改了,但系统下次启动时可能因为SELinux的安全上下文问题拒绝某些登录操作或服务启动,表现为卡在登录界面、root无法登录、图形界面循环重启等。
touch /.autorelabel这个文件会在下次开机时触发SELinux对整个文件系统重新打标签。如果机器配置比较老,这个过程可能持续几分钟到十几分钟,看起来像“卡死了”,其实是在后台跑restorecon,耐心等就好。
2.5 第五步:退出并重启
分两种进入方式来看:
使用rd.break进入的,先退出chroot环境:
exit然后再次exit,系统会继续执行之前被暂停的启动流程,最终正常进入多用户模式。如果想立刻重启,也可以在switch_root提示符下执行:
exec /sbin/init或者直接:
reboot -f使用init=/bin/bash进入的,直接执行:
exec /sbin/init这一步会重新拉起systemd作为1号进程,系统会继续走正常的启动流程。如果该命令执行后没反应或报错,也可以强制重启:
reboot -f重启后,在登录界面输入你刚刚设置的新root密码,理论上就可以顺利进入系统了。
3. 实操要点与避坑清单
3.1 文件系统只读问题
这是新人最容易栽的坑。你进入救援Shell后,直接运行passwd root,cmd会提示密码修改成功,但你重启后发现密码根本没变,原因就是你修改的是内存中的临时状态,或者写入时因为只读文件系统而静默失败——严格来说passwd会报错,但报错信息一闪而过,很多人没注意看。
判断当前文件系统是不是只读,最直接的办法是随便创建个测试文件:
touch /test_write_check如果提示Read-only file system,说明必须先执行挂载命令。成功挂载后再试试删除这个测试文件:
rm -f /test_write_check确认可写后再执行后续操作。
3.2 SELinux自动重标记的取舍
很多教程只字不提SELinux,但国产操作系统、尤其麒麟服务器版在安装时默认启用SELinux的情况非常常见。你改密码时系统会自动更新/etc/shadow的相关上下文,但因为是在救援模式下操作的,某些文件的安全上下文可能没有被正确更新,这时touch /.autorelabel就是一张保险单。
不过要注意:自动重标记完成后,这个文件会被系统自动删除。如果你重启进入系统后再次查看发现.autorelabel还在,说明重标记过程没执行或没走完,需要检查SELinux状态、引导日志。
另一种做法是修改/etc/selinux/config,把SELINUX=enforcing临时改成SELINUX=permissive,重启后再改回来——不推荐这种操作,容易忘记改回来导致系统安全策略被无意放宽。
3.3 GRUB编辑后的“一次性”特性
GRUB编辑模式下修改的参数只在本次启动生效,不会持久化。这其实是个优点——你不用担心改坏了导致系统永久异常。但与之相对的是,如果你在编辑时不小心改了root=参数或者删错了行,系统可能会引导失败,出现类似Kernel panic - not syncing的报错。此时不用慌,直接强制断电重启,重新进入GRUB编辑界面检查参数即可。
我个人的习惯是:每次编辑后先拍照或者手抄一下原始引导行内容,万一改出问题还能对照恢复。对于不熟悉的机器,这一步很值得做。
3.4 关于update-grub的一个小建议
如果你在系统正常运行后想“固化”这次的修改(虽然正常情况下我们不改引导参数),可以在重启进入系统后执行:
sudo update-grub或者在麒麟v11上用:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg这样可以基于当前实际配置重新生成引导菜单,把系统里可能残留的错误引导项清理掉。不过这个操作和密码重置本身没有直接关系,做与不做都行,只是我习惯在救援完成后顺手固化一下引导配置。
3.5 实体机与虚拟机的操作差异
在VMware虚拟机里操作时,追加引导参数后可能需要等几秒才能看到反馈,不要因为界面没反应就反复快捷键。在实体机上,需要注意键盘布局——有些国产工控机的键盘可能是欧式布局或特殊排列,/键的位置可能跟你的预期不一样,追加参数时尽量在命令行界面里逐字确认。
另外,如果虚拟机配置了UEFI安全启动,GRUB编辑功能理论上会被限制。但根据我的实测,麒麟v11默认不会强制开启这个限制,只要你不修改引导文件签名,单次编辑参数是允许的。如果遇到Failed to load image或签名验证失败的报错,回到虚拟机设置的固件类型里把安全启动临时关掉,重置完密码再开回来即可。
4. 常见问题与排查实录
4.1 进入不了GRUB菜单怎么办
这是最打击人的情况。尝试以下排查思路:
- 开机时按住
Shift键不松手(Legacy BIOS模式),或者连续点按Esc(UEFI模式),看看引导菜单是否出现 - 如果主板是国产固件(比如昆仑固件),可能需要进BIOS里调整“启动时显示引导菜单”或“GRUB超时时间”相关选项,把延时从0秒改成3秒以上
- 检查
/boot/grub2/grub.cfg中是否有GRUB_HIDDEN_TIMEOUT这类设置,如果是0,开机时会直接静默跳过菜单。这个问题可以在能进系统时修改/etc/default/grub并重新生成配置来根治 - 如果GRUB菜单彻底丢失,操作思路会转向“用安装ISO引导后重建GRUB”,那是另一个复杂话题,需要单独用一篇来说
4.2 提示“Authentication token manipulation error”
在重置密码时,偶尔会遇到Authentication token manipulation error,这个报错通常说明/etc/shadow这个文件有异常,比如处于只读挂载、文件被锁、文件权限不对。
依次检查:
- 执行
mount | grep " / ",确认根分区挂在读写模式 - 执行
ls -l /etc/shadow,正常情况下权限应该是----------,所有者是root,如果所有者异常可以用chown root:shadow /etc/shadow修正 - 个别情况下shadow文件本身被
chattr +i加了不可变标志,执行lsattr /etc/shadow看一下,如果有i属性,用chattr -i /etc/shadow去掉后重试
这种问题在我处理的一台被加固过策略的麒麟v11服务器上真实遇到过,当时就是安全基线脚本给shadow文件加了不可变属性,导致passwd无法写入。
4.3 密码改好了但重启后自动登录卡死
这个表现更像SELinux下面两种冲突叠加的结果。建议这样处理:
- 重新走一遍救援模式,进入系统环境
- 先检查
/etc/selinux/config里的状态值 - 执行
touch /.autorelabel确保重标记文件存在 - 退出重启后,在GRUB菜单的高级选项里选择带
(rescue)字样的内核项,进入带网络连接的救援模式,观察启动日志
如果确认卡在SELinux的relabel过程,可以耐心等待10到20分钟再强制重启,一般第二次启动就正常了。我有一次在一台老旧实体机上等relabel等了近半小时,一度以为机器坏了,其实是SELinux在逐个文件打标签,慢是因为磁盘读写速度一般。
4.4 系统提示“account is locked”
这种情况常见于多次输错密码、安全策略锁定,或者被人手动passwd -l过。进入救援模式后不要只顾着改密码,还要检查并解除锁定:
passwd root如果输出显示passwd: Account is locked, password cannot be changed,需要先执行:
passwd -u root然后再重置密码。这个操作在运维里经常被忽略,我见过不少人反复重置密码却一直登不进去,最后才发现是锁定状态没解除。
4.5 桌面版卡在图形界面登录环
麒麟v11桌面版有一个比较特殊的情况:root密码重置成功后,图形界面登录框可能依然提示密码错误,但用Ctrl+Alt+F2切换到字符终端(或Ctrl+Alt+F1到F6之间切换TTY),却能正常用root登录。
这通常是显示管理器(如LightDM或GDM)缓存了旧的认证状态,或者和密码模块之间同步出现了延迟。最简单的处理是在字符终端登录后重启显示管理器:
sudo systemctl restart lightdm或者直接:
sudo reboot大多数情况下重启一次就能解决图形界面登录问题。如果还是不行,检查一下/etc/pam.d/里是否有自定义的认证配置干扰了图形登录。
5. 重置密码后的收尾与预防:别让救援白做
5.1 及时验证SELinux标记和密码策略
开机进入系统后,第一件事不是急着跑业务,而是验证密码修改是否彻底生效:
getenforce如果输出Enforcing,说明SELinux正常强制模式。然后试着用su -从普通用户切换root,或者直接注销重新用root登录,确认认证流程全部OK。
接着检查密码策略是否符合你的预期:
chage -l root这个命令会显示root账号的密码过期时间、最小修改间隔等。如果之前系统策略设置了密码立即过期,你可能需要重新设置:
chage -M 99999 root否则下次登录可能又会被强制要求改密码。
5.2 用密钥登录减少对密码的依赖
密码重置只是解决燃眉之急,长期来看,我更建议在服务器上配置SSH公钥登录,特别是对远程运维的机器。这样即使密码再次丢失或被人改掉,只要密钥文件在自己手里,依然能通过ssh进入系统。举个例子:
在本地生成密钥:
ssh-keygen -t ed25519然后把公钥拷贝到服务器:
ssh-copy-id root@服务器IP后期再把/etc/ssh/sshd_config里的PasswordAuthentication改成no,让密码认证彻底禁用,同时一定要保留能用的密钥。这样密码遗忘带来的影响就会被大幅降低。
5.3 把root密码统一纳入密码管理体系
单台机器重置密码不难,麻烦的是几十台服务器各有各的密码。身边有同事用Excel记录密码,也有团队引入密码管理软件。我的建议是:如果只是少量的测试机或开发机,那就用类似pass这样的本地密码管理工具,配合Git仓库同步,加密保存所有机器密码。如果是生产环境,尽量用堡垒机或统一认证平台,这不光解决密码遗忘问题,也能让密码轮换、访问审计变得可控。
5.4 顺便检查系统里有没有其他安全隐患
在救援模式下你能进入系统底层,这是一个很好的“整体体检”机会。既然已经站在root视角了,别只盯着密码,可以顺手做几个检查:
passwd -S root看root账号状态。
awk -F: '($3==0){print $1}' /etc/passwd列出所有UID为0的账号,正常情况下应该只有一个root,如果出现其他账号,说明系统里可能存在特权账号,需要核实来源。
last -n 20查看最近的登录记录,看看有没有异常登录行为。如果本次救援发生在你不知情的情况下,建议排查一下机器是否被入侵。
5.5 从实际体验谈一谈麒麟系统的密码策略
最后分享一个细节。麒麟v11在默认安装完成后,系统里/etc/login.defs中关于密码复杂的配置会比传统CentOS严格一些,具体表现是:最小密码长度往往设置了8位,而且pam_pwquality模块默认启用。这就意味着你不仅要在重置时设一个复杂密码,还要保证这个密码能通过系统的质量检测。
如果确实因为业务需要设置简单密码(比如某些专用内网测试环境),可以通过修改/etc/security/pwquality.conf,把minlen调低,并注释掉强制复杂度选项。不过我还是建议以强密码为主,如果内网环境有等保、密评这类合规要求,密码复杂度是逃不掉的硬指标。
写在最后的个人体会
单用户救援模式重置root密码,严格来说是个老生常谈的Linux入门运维操作,但放到麒麟Kylin v11这个具体的发行版上,还是会因为SELinux策略、引导器实现差异、国产固件的行为差异遇到各种“意料之外”的小问题。我自己在VMware里虚拟机测试时,第一次就栽在没挂载读写文件系统,导致密码表面成功实际无效,浪费了近半小时。
后来我把流程固定成了“三步走”:改参数、挂读写、看SELinux,基本就没再出过乱子。遇到报错也不要慌,GPT提示的报错信息往往比你想的要直白,无非就是文件系统、权限、锁定、安全上下文这四类问题轮着来。
希望这篇内容能帮你少走弯路。如果你在麒麟其他版本上遇到了不同表现方式,或者是在像鲲鹏这种ARM架构上操作,方法本身是通用的,只是部分命令和路径要按实际环境微调一下。操作过程中有任何拿不准的地方,建议先在虚拟机里练一遍——哪怕把密码改乱重来一次,也比在实体机上折腾要划算得多。