1. 先搞清楚状态:你的银河麒麟到底是怎么进不去的
上周处理了一台银河麒麟V10服务器,root密码被上一任运维改了之后交接文档里写的是另一个密码,现场三个人轮流试了半小时,全部报错。数据库在跑、业务没停,但谁都不敢重启,因为重启之后就没人能进去了。最后只能连夜进机房,用单用户模式把root密码重置掉,前后折腾了两个多小时。这事之后我就想把整个思路完整写一遍。
银河麒麟V10目前是国产服务器和桌面环境里出镜率最高的系统之一,基于Linux内核,桌面版和服务器版都是。它和CentOS/RHEL的目录结构、systemd体系、GRUB2引导流程高度接近,所以网上很多CentOS的密码重置方法拿到银河麒麟上大部分是能用的,但有几个细节不同,尤其是SELinux处理、密码策略、以及ARM架构机器上的菜单名称差异。这篇文章会把我实际验证过的几种root密码重置方案、每一步的原理、以及重置之后必须做的收尾工作全部写清楚。
先判断一下你的系统属于哪种情况,这决定了后面走哪条路线。最常见的三种:
-
输入密码提示错误,无法登录图形界面或字符终端。这种最简单,系统本身是完好的,只需要在引导阶段进入单用户模式修改密码。
-
SSH远程登录时root被拒绝,但本地控制台还能登录普通用户。这种不用急着重置root密码,大概率是sshd_config里禁用了root远程登录,先排查配置再说。
-
忘记密码之后别人试了太多次,账户被锁定了。登录时会提示账户已被锁定或认证失败,这种情况在单用户模式里除了改密码,还要重置失败计数。
另外还有一种特殊场景:密码完全正确,但图形界面登录后闪退回登录界面,这属于SELinux上下文错乱,跟密码本身无关,不少人在重置密码之后会遇到。我放在后面专门说。
所以在动手之前,你先确认两个信息:
- 系统是桌面版还是服务器版?
- 这块机器是物理机、虚拟机,还是云主机?
这两个信息决定了操作步骤里的几个关键差异。比如云主机一般不建议用GRUB单用户模式强改,因为云厂商的控制台和虚拟化层可能会拦截相关按键;而物理机如果没接显示器,连键盘都够不着,那就只能走救援盘路线了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 重置前的准备工作与关键认知:为什么能重置、用什么重置
很多新手第一次听说“root密码忘了还能重置”都会愣一下:那root密码还有什么意义?这里要澄清一个概念。
root密码.hash存在/etc/shadow文件里,系统校验密码时调用PAM模块读取这个文件。所谓重置root密码,本质就是拿到对这个文件的读写权限,然后强制写入新的密码哈希。日常登录时系统不给你这个权限,但系统自己在启动阶段会提供一个“维修模式”——也就是单用户模式或rescue模式——在这个环境里,系统默认信任操作者是管理员,允许直接挂载根文件系统并修改关键文件。
说夸张一点,物理接触就是最高权限。只要机器在你手上,重置root密码只是时间问题。这跟Windows的PE盘重置密码是同一个逻辑。
银河麒麟有两种重置路线,适用场景不同:
| 路线 | 进入方式 | 适用场景 | 风险程度 |
|---|---|---|---|
| GRUB单用户模式 | 开机时按e编辑内核启动参数 | 有本地控制台,机器能正常启动到GRUB界面 | 低,全程只改一个密码字段 |
| 救援盘模式 | 用系统ISO/U盘启动进入rescue | 系统引导损坏、GRUB丢失、不知道GRUB密码、远程无法操作控制台 | 中,需要挂载文件系统后手动chroot |
实测下来,90%的情况走单用户模式就够了。但如果这台机器被设置了GRUB密码,或者boot分区损坏,单用户模式进不去,那就只能用ISO启动盘走rescue模式。
在动手之前,有几件事必须提前做:
第一,确认有没有磁盘加密。
如果当初装系统时开了LUKS全盘加密,那么无论如何重置,在进入单用户模式之前系统都会要求输入磁盘解密密码。这个密码和root密码是两回事,忘了就连系统都加载不了,唯一办法是找当时的加密恢复密钥,这个我下面不展开,属于另一个话题。银河麒麟默认安装不会开LUKS,但企业内部合规要求有时候会开,先说清楚免得你卡在第一步。
第二,如果有虚拟机快照,先打一个快照。
这个太重要了。虚拟机厂商的Web控制台里点一下快照,整个过程不到十秒,但万一你改出问题,随时可以回滚。物理机就没办法了,建议先把/etc/passwd和/etc/shadow两个文件拷贝到U盘备用,虽然这两个文件一般不会有问题,但图个心安。
第三,搞明白你的机器是什么引导方式。
银河麒麟V10同时支持Legacy BIOS和UEFI引导,GRUB2的启动参数编辑界面在两种模式下略有差异。UEFI机器进入GRUB后,部分主板需要按Esc或者Shift键才能让启动菜单停住;老式BIOS机器开机直接按F8或F11进入引导菜单。如果你不知道自己的机器是什么引导方式,开机时留意屏幕上的提示,虚拟机的话可以直接在固件设置里看。
上面这些准备好之后,就可以进入正题了。
3. 核心路线:通过GRUB菜单进入单用户模式改密码
这是我最推荐的方案,也是实测最稳的路线。整个过程分成几个阶段:进GRUB编辑界面、改内核启动参数、进系统修改密码、触发SELinux重打标签、重启验证。一步一步来。
3.1 进入GRUB菜单并编辑内核启动参数
给机器接通电源后,在屏幕刚出现品牌Logo或主板Logo的时候,按住Shift键(UEFI模式)或者连续按Esc键(部分BIOS模式),让GRUB菜单强制显示出来。如果时机没抓住、系统已经直接进登陆界面了也没关系,重启再来一次就行,GRUB菜单不会因为这次失败就损坏。
看到菜单之后,选择第一项“银河麒麟高级选项”或者直接选中默认的内核选项,然后按e键进入编辑界面。这一步的操作跟CentOS是一样的。
编辑界面会显示一堆GRUB配置内容,不需要逐行读,你只需要找到以linux开头的行。桌面版一般长这样:
code复制linux /boot/vmlinuz-... root=/dev/mapper/klas-root ro crashkernel=auto ...
服务器版可能是:
code复制linuxefi /vmlinuz-... root=/dev/mapper/klas-root ro ...
注意,桌面版和服务器版在这里的写法不完全一样,有的用linux,有的用linuxefi,但找ro这个关键字就行。ro代表以只读方式挂载根文件系统,这是系统的自我保护机制。
把光标移到这一行的末尾,在ro之后追加以下内容:
code复制rd.break console=tty0
追加完之后按Ctrl+X或者F10启动。这时候系统会进入一个临时的switch_root环境,屏幕提示符会变成类似:
code复制switch_root:/#
看到这个提示符就说明第一步成功了。rd.break的意思是:在过渡到真实根文件系统之前,强制停住,给你一个root shell。这个环境里,系统的根目录还不是你原来的根目录,而是内存里的一个临时文件系统,原有硬盘上的根文件系统被挂载在/sysroot目录下。
3.2 在临时环境中挂载原系统并修改root密码
进入了switch_root环境后,执行下面几条命令:
bash复制# 重新以可写方式挂载原系统根目录
mount -o remount,rw /sysroot
# 进入原系统的真实环境
chroot /sysroot
# 修改root密码
passwd root
mount -o remount,rw /sysroot这条命令很多人会漏,漏掉的后果很严重:你在后面执行passwd时系统不会报错,但写入的密码不会真正生效,因为之前文件系统是只读挂载的,写入会失败。所以每次重置完都要确认一下挂载状态。
passwd root执行后会提示输入两次新密码。输入时屏幕上不会有任何显示,这是Linux正常的输入保护机制,不是键盘坏了。注意银河麒麟默认可能会启用密码复杂度策略,如果你的密码太简单(比如纯数字或长度不到8位),系统会提示BAD PASSWORD,但此时还是会让你再确认一次并写入。不过我不建议使用弱密码,既然是管理员账户,至少用大小写字母加数字加特殊符号的组合。
密码改完先别急着重启,还需要处理SELinux的问题。
3.3 SELinux关键处理:触发布尔重标
银河麒麟V10默认开启SELinux,强制模式。/etc/shadow文件有自己固定的SELinux安全上下文标签,如果你用单用户模式直接改密码,写入新内容后文件的时间戳和内容都变了,但SELinux上下文不会自动更新。正常情况下这不会导致系统异常,但一旦SELinux策略认为文件上下文异常,重启后可能会拦截部分服务读取shadow文件,结果就是登录时密码明明正确却反复失败。
解决办法很简单,在chroot环境里执行:
bash复制touch /.autorelabel
这个命令做的事情是:在根目录创建一个标记文件,系统重启时检测到它,会对整个文件系统执行SELinux标签重打,确保所有文件的上下文都正确。重打整个文件系统会花几分钟时间,具体看磁盘速度和文件数量,一般5到15分钟不等,耐心等它完成。
如果你不想等全盘重标,也可以用更快的方式:
bash复制restorecon -Rv /etc
只对/etc目录下的文件做恢复,速度会快很多。但我个人还是建议用touch /.autorelabel兜底,因为单用户模式下你没法保证只动了/etc目录,全盘重标是最稳妥的。
退出环境:
bash复制exit # 退出chroot,回到switch_root环境
exit # 再次退出,系统会继续启动流程
注意不要直接敲reboot,有些版本在switch_root环境中reboot并不会真正重启,反而可能导致文件系统没有正确卸载。用两次exit是最标准的操作。
重启之后系统会先跑SELinux重标进度条,跑完自动重启一次,然后用新密码登录就正常了。
4. 备用路线:救援盘模式下用chroot重置root密码
单用户模式并不是万能的。有一种常见情况:某次系统异常关机之后,GRUB菜单还在,但选择任一内核启动都会直接卡死在文件系统检查阶段,根本到不了rd.break生效的环节。还有一种情况是,某些安全基线加固过的银河麒麟系统会设置GRUB密码,按e编辑菜单时需要先输入GRUB用户名和密码,而这个密码往往和root密码一起丢了。
这两种情况,靠修改启动参数已经走不通了,只能上救援盘。
4.1 制作并启动救援盘
找一台能正常上网的机器,去银河麒麟官网下载对应版本架构的ISO镜像,桌面版和服务器版都行,关键是要跟目标机器架构一致:x86的机器用x86 ISO,ARM(如麒麟990、飞腾)的机器用ARM ISO。
用dd命令把ISO写到U盘:
bash复制sudo dd if=麒麟镜像.iso of=/dev/sdX bs=4M status=progress
注意/dev/sdX是你的U盘设备,千万不要写错,写错就覆盖整个磁盘了。实际操作时可以用lsblk先确认U盘设备名。
插上U盘,开机时按启动菜单快捷键(联想是F12、戴尔F12、惠普F9,服务器一般是F11),选择从U盘启动。银河麒麟ISO启动后,会进入安装界面,此时不要选“安装系统”,而是找“救援系统”或“Rescue installed system”这类选项。有些版本在Installation菜单里有“Troubleshooting”子菜单,展开就能看到。
4.2 挂载原系统并用chroot修改密码
救援模式启动后会问你是自动发现系统还是手动挂载。一般选自动发现,它会把检测到的原系统挂载到/mnt/sysimage目录下。
进入shell之后执行:
bash复制chroot /mnt/sysimage
passwd root
如果你能看到/mnt/sysimage/etc/shadow存在,那基本不会出错。但有一种情况需要手动处理:系统使用了LVM逻辑卷管理,救援模式没有自动激活卷组,导致找不到原系统。这时候需要手动激活:
bash复制lvm vgscan
lvm vgchange -ay
扫描并激活之后,ls /dev/mapper/ 下面会出现类似klas-root的设备,把对应的逻辑卷挂载到/mnt/sysimage:
bash复制mount /dev/mapper/klas-root /mnt/sysimage
mount /dev/mapper/klas-boot /mnt/sysimage/boot
mount /dev/mapper/klas-efi /mnt/sysimage/boot/efi
挂载完成后再执行chroot。这里我建议用mount -o bind把/proc、/dev、/sys也挂进去,否则某些系统命令在chroot环境中会报错:
bash复制mount -o bind /dev /mnt/sysimage/dev
mount -o bind /proc /mnt/sysimage/proc
mount -o bind /sys /mnt/sysimage/sys
chroot /mnt/sysimage
进入chroot环境后,除了改root密码,我建议顺手做几件事:
- 如果之前设了GRUB密码,但你已经不打算保留了,可以用
grub2-setpassword重新设置,或者直接清掉/boot/grub2/user.cfg。 - 检查
/etc/ssh/sshd_config里PermitRootLogin的值,后面会细说。 - 检查
/etc/shadow里root那一行是否被锁,如果密码字段是!!或*开头,说明账户被锁,需要清除锁定标记。
账户解锁的命令:
bash复制passwd -u root
如果之前输错密码次数太多导致pam_faillock锁定,可以清除计数:
bash复制faillock --user root --reset
救援盘模式重置密码后,同样的,必须处理SELinux标签:
bash复制touch /.autorelabel
exit
reboot
拔掉U盘,让机器从硬盘正常启动,等重标完成,新密码就能生效了。
5. 密码重置后的连锁排查:登录、SSH、数据库一个都别漏
密码重置只是一个起点,重启之后往往会暴露出更多历史遗留问题。这一段把我在实际项目中遇到过的后续问题全部整理出来,很多都是热搜词里大家真实卡住的地方。
5.1 开机后仍然登录不上:SELinux上下文和账户锁定
密码重置完成、重启之后,最让人崩溃的反馈就是“还是进不去”。排查方向分两种:
第一种,登录界面循环。输入正确密码后,屏幕闪一下又跳回登录界面。这种情况绝大多数是SELinux上下文错乱,尤其是在上面步骤里漏掉了touch /.autorelabel。现在回到GRUB菜单,在内核启动行末尾追加:
code复制autorelabel=1
重启后系统会自动重打标签,跑完再重启一次。如果这个方法不行,那就是/etc/shadow或/etc/passwd的SELinux属性被改坏了,需要回到单用户模式手动执行restorecon -v /etc/shadow /etc/passwd。
第二种,提示账户已锁定。如果你在重置前尝试了太多次错误密码,PAM的faillock模块会锁住root账户,这种情况即使密码正确也登不进。回到单用户模式或救援模式,执行:
bash复制faillock --user root --reset
清除失败计数。另外检查一下/etc/shadow里root行的密码字段,正常应该是$6$...或$5$...开头,如果看到!!或!符号,说明账户被强制锁定了,用passwd -u root解除。
5.2 本地能登录但SSH远程拒绝:启用root远程登录
重置root密码之后,很多人回到办公位想用SSH连服务器,结果发现Permission denied, please try again。密码明明是对的,为什么连不上?
打开/etc/ssh/sshd_config,重点检查三行:
bash复制PermitRootLogin
PasswordAuthentication
PubkeyAuthentication
银河麒麟服务器版出于安全基线,很多默认配置是PermitRootLogin no,也就是说root用户不允许通过SSH直接登录。想改的话:
bash复制PermitRootLogin yes
PasswordAuthentication yes
然后重启SSH服务:
bash复制systemctl restart sshd
这里注意服务名,有的版本是sshd,有的是ssh,不确定的话先执行systemctl list-units | grep ssh看一下。
个人建议:如果你只是想临时上去干活,别急着在sshd_config里开PermitRootLogin yes,更安全的做法是用普通用户登录再用su -切换到root。如果是内网环境且确保防火墙和白名单到位,再考虑开root直连。热搜词里有一条“设置只有wheel组的用户可以ssh远程登录”,这是更稳妥的做法,在sshd_config里加一行:
bash复制AllowGroups wheel
这样非wheel组的普通用户连SSH服务的机会都没有,root虽然被拒了,但你可以先用某个wheel组的普通用户登录,再切换。
5.3 数据库root密码搞混了:MySQL/MariaDB的重置思路
重置系统root密码后,另一个高频问题马上浮出水面:Navicat连不上数据库,报ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)。
这句话的意思是:MySQL/MariaDB里的root账号密码不对,跟系统root密码没有任何关系。数据库的root账号存储在数据库自己的用户表里,它是独立的一套认证体系。系统root密码重置前后,数据库root密码都不会变。
如果数据库root密码也忘了,需要的是数据库层面的重置。以MySQL 8.0为例:
- 停止数据库服务:
bash复制systemctl stop mysqld
- 以跳过授权表方式启动:
bash复制mysqld_safe --skip-grant-tables &
- 无密码进入数据库:
bash复制mysql -u root
- 重置root密码:
sql复制FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';
FLUSH PRIVILEGES;
- 正常重启服务:
bash复制mysqladmin shutdown
systemctl start mysqld
银河麒麟V10上安装MySQL 8.4.7这类新版本时,初始化方式会跟老版本有区别,比如可能出现需要先找临时密码的情况。安装日志里一般会打出一行[Note] A temporary password is generated for root@localhost: xxxxxxxx,那个就是初始密码。
这里提个醒:如果你是在银河麒麟上装了MySQL但一时半会儿找不到root密码,先去看/var/log/mysqld.log或/var/log/mysql/error.log,里面有没有temporary password。用临时密码登录后再改正式密码,比重置授权表省事得多。
5.4 收尾动作:日志审计、密码策略与权限收敛
密码重置完成、SSH通了、数据库也能连了,事情还没完。作为一个干运维的人,最后几步不能省。
检查认证日志,确认有没有异常登录尝试记录在案。银河麒麟的日志在/var/log/secure:
bash复制tail -n 100 /var/log/secure | grep -i fail
重置密码这个动作本身也会被记录到系统审计日志里,如果这台机器有等保合规要求,日志别乱清。
然后是密码策略。银河麒麟V10默认的密码策略比较严格,如果你在重置时被迫设了一个很长的复杂密码,建议顺手检查一下/etc/security/pwquality.conf和/etc/pam.d/system-auth。如果后续有同事需要定期改密码,这里的参数会直接影响体验。
最后提一下权限收敛:root密码确定之后,建议新建一个普通用户作为日常运维入口,把root密码放进密码保险箱或者交给专人保管,而不是像之前那样裸奔在群聊记录里。这个问题普遍到我都懒得再强调,但每次出事都跟这有关。
6. 实操踩坑记录与高频问题速查
这部分是我在真实环境里翻过车、或者帮别人擦过屁股之后总结出来的,每一桩都对应一个真实的教训。
6.1 几个真实翻车现场
翻车一:漏了touch /.autorelabel,重启后被SELinux拦在门外。
第一次处理银河麒麟密码重置时,我参照的是CentOS的老方法,改了密码直接exit重启,结果系统卡在登录界面怎么都进不去。后来查了半天才发现银河麒麟的SELinux比CentOS默认策略更严格,/etc/shadow的文件上下文在手动修改后没有自动更新,导致PAM读取失败。从那以后,我在任何国产系统上重置密码都会顺手touch /.autorelabel,这个习惯救了我好几次。
翻车二:rd.break参数加错位置,启动报错。
新手常常把rd.break加到GRUB菜单的quiet那一行,或者加到initrd开头的那行,结果系统启动时找不到内核参数,直接卡在Failed to start ...。记住,参数只能加在linux或linuxefi开头的同一行末尾,不是随便哪一行都行。
翻车三:改了密码后又被人连续试错,账户被锁。
有一次我帮客户重置完密码,电话里让对方登录,结果那大哥手速太快,连续输入错三次,root账户直接被faillock锁住,又得麻烦我再跑一趟机房。从那之后我每次重置完密码都会顺手清一次faillock,并且提醒对方确认键盘大小写状态再输入。
翻车四:ARM架构机器上按键时机不同,以为系统坏了。
给一台飞腾CPU的银河麒麟V10 ARM版重置密码时,按Shift键进不了GRUB菜单,试了好几次都是直接进系统。后来发现ARM版机器在开机时需要有节奏地按Esc键,而且必须在BIOS自检画面刚出现时就按,晚一秒钟都不行。这个跟具体主板的固件实现有关,不是系统问题。
6.2 高频问题速查
| 问题现象 | 可能原因 | 处理方法 |
|---|---|---|
| 开机按Shift/Esc进不了GRUB菜单 | 按键时机太晚或主板固件不同 | 重启试多次,改按F11/F12/Esc/F8轮流试 |
| rd.break之后提示文件系统只读 | 忘记remount | 执行mount -o remount,rw /sysroot |
| passwd提示密码过于简单 | 密码复杂度策略 | 使用大小写+数字+符号组合,10位以上 |
| 改完密码重启后登录循环 | SELinux上下文问题 | 启动参数加autorelabel=1或单用户restorecon -Rv /etc |
| 提示账户已锁定 | faillock失败计数超额 | faillock --user root --reset |
| SSH密码正确但连不上 | 服务端禁用root远程登录 | 检查sshd_config中的PermitRootLogin |
| MySQL报ERROR 1045 | 数据库账号密码错误,与系统无关 | 用--skip-grant-tables模式重置MySQL root |
| 救援模式识别不到原系统 | LVM卷组未激活 | lvm vgscan && lvm vgchange -ay后挂载 |
如果你机器的问题是上面表格里没有的,还有一个通用排查出口:去/var/log/messages和/var/log/boot.log里看启动阶段到底卡在哪一步,日志比任何猜测都靠谱。
6.3 如何避免下次再发生同样的事
最后一个建议,也是我在这行干了这么多年最想说的一点:root密码这东西,不要靠记忆,更不要只存在某一个人的脑子里。
给Linux/银河麒麟机器建一个基础台账,至少包括这么几项:
- 机器IP、架构(x86/ARM)、序列号
- 系统版本(V10 SP1还是SP2,桌面版还是服务器版)
- root密码记录的存放位置(密码保险箱、KeePass、Vault)
- 最近一次密码变更日期和经手人
- 是否有开启SELinux、是否有GRUB密码、是否有LUKS加密
台账建好之后,给root账号设置定期强制轮换,轮换周期建议90天以内。密码轮换本身不复杂,就是在单用户模式之外用一个普通管理员账号执行passwd root,然后同步更新台账。如果公司有堡垒机或特权账号管理平台,直接把root托管上去,那就连台账都不用自己记了。
我个人的经验是,密码重置本身不算难事,真正让人头疼的是重置之后暴露出来的配置欠账。每次出一次事故,顺手把SSH配置、SELinux状态、数据库密码策略、日志审计都过一遍,比单纯改一个密码要值钱得多。下次再遇到类似场景,至少不会在同一个坑里摔第二次。
