1. 项目概述:当密码成为拦路虎
在国产化替代的大潮下,银河麒麟高级服务器操作系统V10系列(包括SP1、SP2、SP3)已经成为众多关键行业和单位的基础设施核心。无论是运行在飞腾、鲲鹏的ARM架构,还是海光、兆芯的x86架构上,它都承载着重要的业务和数据。作为系统管理员或技术支持工程师,我们都可能遇到一个既常见又棘手的问题:忘记了root用户密码,或者接手了一台前任未留下凭证的服务器。此时,系统仿佛变成了一座坚固的堡垒,而你就是那个被关在门外的管理员。
“破解密码”这个说法在技术圈里听起来有些敏感,但在合法的系统管理和运维范畴内,它指的是一种在物理或虚拟控制台层面,通过引导流程干预来重置本地用户密码的标准故障恢复操作。这并非利用漏洞进行非法入侵,而是操作系统本身为管理员预留的“后门”或“恢复模式”,是每一位Linux系统管理者必须掌握的保底技能。今天,我就结合自己多次在银河麒麟V10各版本(SP1/SP2/SP3)和不同架构(ARM/x86)上的实战经验,为你完整拆解这个过程。你会发现,其核心原理相通,但细节上因版本和架构差异,实操中确有诸多“坑点”。我将不仅告诉你步骤,更会深入解释每一步背后的“为什么”,并分享那些官方文档不会写的排查技巧和注意事项。
2. 核心原理与不同环境下的策略选择
在动手之前,我们必须搞清楚我们在做什么。银河麒麟V10基于Linux内核,其用户认证信息(如密码哈希值)通常存储在/etc/shadow文件中。这个文件对root用户也是只读的,在系统正常运行时无法直接修改。密码重置的核心思路,就是绕过正常的身份验证流程,直接获得一个可以任意修改系统的Shell环境。
2.1 通用技术原理:引导加载器的干预
无论是GRUB 2(x86常见)还是U-Boot/GRUB(ARM常见),它们都是在操作系统内核启动前运行的小程序。我们的机会就在于:在引导加载器阶段,通过修改内核启动参数,让系统进入一个特殊的单用户模式或直接提供一个root shell。
- 单用户模式:通过在内核命令行添加
single、1或s等参数,系统会跳过所有服务启动和多用户登录,直接进入一个以root权限运行的Shell。这是最经典的方法。 - 直接修改init:通过
init=/bin/bash参数,指定系统启动的第一个进程(init)为bash shell。这样系统加载完内核和基础驱动后,不会启动登录管理器或服务,直接给你一个root shell。 - rw权限挂载根文件系统:默认情况下,根文件系统可能以只读(ro)方式挂载。我们必须在内核参数中确保根文件系统以读写(rw)方式挂载,否则无法修改
/etc/shadow文件。
2.2 银河麒麟V10各版本与架构的差异点
虽然原理一致,但不同版本和架构在具体操作上存在关键差异,盲目套用通用Linux教程极易失败。
1. 版本差异(SP1 vs SP2 vs SP3):
- SP1:引导界面相对传统,GRUB菜单编辑模式较为直接。但部分定制版本可能对引导参数有额外校验。
- SP2/SP3:安全增强是重点。你可能发现:
- GRUB菜单加密:启动时按
e键无法直接编辑,需要先输入密码。这个密码通常不是用户密码,而是安装时设置的GRUB引导密码。如果不知道,此路不通,需另寻他法(如后文所述的使用安装介质救援)。 - Secure Boot影响:在启用了Secure Boot的UEFI系统中,修改过的引导项可能无法被签名验证通过,导致启动失败。这在较新的硬件和SP3系统上更常见。
- GRUB菜单加密:启动时按
2. 架构差异(x86 vs ARM):
- x86架构:绝大多数使用GRUB2作为引导加载器。操作流程是:启动时按
e键(若未加密)-> 找到以linux或linuxefi开头的行 -> 修改内核参数。 - ARM架构:情况复杂得多。常见的有:
- U-Boot + GRUB:某些服务器或开发板采用此组合。你可能需要在U-Boot命令行中手动设置内核参数并引导。
- 深度定制的U-Boot:厂商可能封装了引导流程,没有提供交互式界面。此时,通过物理串口连接进行调试可能是唯一途径。
- 直接内核引导:没有GRUB菜单,启动瞬间可能按某个特定键(如
c、ESC)进入Bootloader命令行,但机会窗口极短。
重要提示:本文所述方法仅适用于您拥有合法管理权限但遗忘密码的自有或授权管理的设备。严禁用于任何未经授权的系统访问。
3. 实操准备与环境判断
磨刀不误砍柴工。在重启服务器之前,请先做好以下判断和准备,这能节省你大量时间,避免无效操作。
3.1 判断引导环境与访问方式
物理机还是虚拟机?
- 虚拟机:这是最简单的场景。你可以完全控制虚拟机的电源和“键盘”输入。通过虚拟化管理平台(如VMware vCenter, Proxmox VE, 麒麟云平台)的“打开控制台”功能,可以像操作本地电脑一样捕获启动按键。
- 物理机:你需要物理接触服务器。准备一个USB键盘(某些服务器旧键盘接口可能不灵)和显示器。对于机房远程管理,如果服务器配备了带远程控制卡的BMC/iDRAC/iLO,你可以通过它的虚拟控制台功能远程模拟键盘输入,这是最佳选择。
判断引导加载器类型:
- 如果系统当前能登录,可以通过命令
cat /proc/cmdline查看当前内核参数,也能从侧面了解引导方式。 - 更直接的方法是:重启系统,仔细观察启动初期的屏幕输出。出现“GRUB”字样的是GRUB,出现“U-Boot”字样的是U-Boot。如果屏幕一闪而过直接进入麒麟Logo动画,那可能是隐藏了引导菜单或使用了其他引导器。
- 如果系统当前能登录,可以通过命令
判断是否设置了GRUB密码:
- 重启后,在出现麒麟Logo或GRUB菜单时,立即快速、连续地按下
ESC或e键。 - 如果屏幕顶部或底部出现“请输入密码”的提示,说明GRUB菜单被加密了。如果你不知道密码,3.2节的方法将无法进行,必须跳转到3.3节使用安装介质救援模式。
- 重启后,在出现麒麟Logo或GRUB菜单时,立即快速、连续地按下
3.2 标准操作路径:通过GRUB菜单重置密码(适用于未加密菜单)
这是最常见且快捷的方法。假设你已成功进入了GRUB菜单编辑界面。
操作流程实录:
- 在GRUB菜单,使用上下键选中你要启动的银河麒麟内核条目(通常是第一个)。
- 按下
e键进入编辑模式。此时屏幕会显示详细的配置文本。 - 找到以
linux或linuxefi或linux16开头的行。这一行包含了内核镜像路径和启动参数。 - 将光标移动到这行末尾。你需要进行关键修改:
- 首先,确保根文件系统可写。找到参数中的
ro(只读),将其修改为rw。 - 其次,指定单用户模式或直接给shell。在行末添加
init=/bin/bash或single。我个人的偏好是使用init=/bin/bash,因为它更直接。 - 示例修改后:原始行可能类似
linux /vmlinuz-4.19.90-xxxx ro quiet splash,修改后应为linux /vmlinuz-4.19.90-xxxx rw quiet splash init=/bin/bash。
- 首先,确保根文件系统可写。找到参数中的
- 修改完成后,根据GRUB版本,按下
Ctrl + X或F10来使用这些修改后的参数启动系统。
启动后你会看到:系统不会进入图形界面或正常的登录提示符,而是直接显示一个命令提示符(如bash-5.0#),并且你已经拥有root权限。此时,根文件系统是以读写方式挂载的。
重置密码:在#提示符下,直接使用passwd命令为root用户设置新密码。
passwd系统会提示你输入新的密码,并确认一次。输入时屏幕不会有任何显示(星号也没有),这是正常的,盲输即可。
一个关键步骤:重置密码后,必须执行以下命令,否则重启后可能无法正常引导:
exec /sbin/init或者
exec /usr/lib/systemd/systemd这个命令会以正常的方式重新执行初始化进程,让系统服务正常启动。之后你可以通过reboot命令重启,使用新密码登录。
3.3 备选救援路径:使用安装ISO镜像(当GRUB被加密或无法编辑时)
当GRUB菜单被密码锁定,或者ARM设备没有提供交互式引导界面时,使用银河麒麟服务器版的安装ISO镜像进入“救援模式”是万能的解决方案。
准备工作:
- 下载对应版本和架构的银河麒麟高级服务器操作系统V10 ISO镜像。
- 制作启动U盘(可使用
dd命令或Rufus等工具)。 - 将服务器设置为从U盘启动。
救援模式操作步骤:
- 从安装U盘启动,进入安装程序初始界面。
- 在银河麒麟安装界面,不要选择“安装”,而是寻找“故障排除”或“救援模式”选项(不同版本位置可能略有不同,通常在左下角或需要按
Tab键修改启动参数)。 - 选择进入救援模式。系统会尝试查找并挂载你硬盘上原有的银河麒麟系统。
- 当询问是否将根文件系统挂载到
/mnt/sysimage时,选择“继续”。 - 救援环境会给你一个Shell提示符。此时,你的原系统根目录被挂载在
/mnt/sysimage。 - 使用
chroot命令切换到原系统的环境:chroot /mnt/sysimage - 现在,你就“置身于”原系统之中了。可以直接使用
passwd命令修改root密码:passwd root - 修改完成后,输入
exit退出chroot环境,再输入reboot重启,拔掉U盘。重启后即可使用新密码登录。
4. ARM架构特殊场景与深度排坑指南
ARM平台是密码重置的“重灾区”,因为硬件和引导的定制化程度极高。以下是我在多个国产ARM服务器平台上总结的经验。
4.1 飞腾/鲲鹏服务器常见情况
这些服务器通常有类似x86的BIOS/BMC设置界面,但引导流程可能被简化。
- 情况一:有GRUB菜单。操作方式与x86的3.2节完全一致。注意按键时机,ARM服务器启动速度可能很快。
- 情况二:无GRUB菜单,直接启动。这通常是因为GRUB配置中隐藏了菜单或设置了极短的超时时间。解决方法:
- 在系统还能登录时,修改
/etc/default/grub文件,将GRUB_TIMEOUT的值设为5或10,将GRUB_HIDDEN_TIMEOUT注释掉。 - 运行
grub2-mkconfig -o /boot/grub2/grub.cfg更新配置。 - 如果已经无法登录,那就只能走3.3节的救援模式。
- 在系统还能登录时,修改
4.2 使用串口终端进行调试
对于没有视频输出的嵌入式ARM设备或某些定制板卡,串口是唯一的交互途径。你需要准备一个USB转TTL串口线。
- 连接:找到板卡上的UART引脚(通常是TX, RX, GND三根),用串口线连接至你的笔记本电脑。
- 配置终端软件:在电脑上使用Putty、MobaXterm或
screen命令(Linux/Mac)打开对应的串口(如COM3或/dev/ttyUSB0),波特率通常为115200,数据位8,停止位1,无奇偶校验。 - 捕获启动信息:给设备上电,在终端软件里观察启动日志。在U-Boot阶段,通常会有
Hit any key to stop autoboot的提示,这时快速按下键盘任意键(通常是空格键),即可进入U-Boot命令行。 - 在U-Boot中修改启动参数:
注意:# 查看当前环境变量 printenv # 设置内核启动参数,添加 rw 和 init=/bin/bash setenv bootargs 'console=ttyS0,115200 root=/dev/mmcblk0p2 rw init=/bin/bash' # 保存环境变量 saveenv # 启动内核 bootroot=后面的设备名(如/dev/mmcblk0p2)必须根据你的实际系统分区修改,可以通过printenv查看原来的bootargs来确认。
4.3 针对加密分区的额外步骤
如果系统使用了LUKS全盘加密,情况会复杂一个数量级。在通过上述任何方法获得Shell后,你还需要先解密根分区。
- 系统启动到单用户Shell后,根分区可能还是一个加密的块设备(如
/dev/mapper/luks-xxxx未激活)。 - 使用
cryptsetup luksOpen命令打开加密分区:cryptsetup luksOpen /dev/sda2 cryptroot # /dev/sda2是你的加密分区,cryptroot是映射名 - 系统会提示你输入磁盘加密的密码(注意,这不是用户登录密码)。输入正确密码后,真正的根文件系统才会被映射出来(如
/dev/mapper/cryptroot)。 - 然后你需要手动挂载它,再
chroot进去修改密码:mount /dev/mapper/cryptroot /mnt chroot /mnt passwd exit umount /mnt cryptsetup luksClose cryptroot - 最后再重启。如果你也忘记了LUKS密码,那么任何本地密码重置方法都将失效,只能通过备份恢复。
5. 实战问题排查与安全加固建议
即使按照步骤操作,你也可能会遇到各种问题。这里列出几个我踩过的“坑”及其解决方案。
5.1 常见问题速查表
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
按e键无反应,直接进入系统 | 1. GRUB菜单超时时间设为0。 2. 键盘按键未被捕获(虚拟机需点击进入控制台)。 | 1. 尝试更早、更频繁地按ESC键。2. 在虚拟机设置中确保已连接键盘,物理机尝试其他USB口。 |
| 修改参数启动后,系统卡住或报错 | 1. 内核参数语法错误(如多余空格)。 2. init=指定的路径不存在。3. 根分区设备名错误(特别是x86和ARM差异)。 | 1. 仔细检查修改行,确保格式正确。 2. 尝试使用 single参数替代init=/bin/bash。3. 在GRUB编辑界面,按 Ctrl + C可进入命令行,用ls命令查看磁盘分区,确认根分区(如hd0,gpt2)。 |
| 救援模式找不到硬盘系统 | 1. 硬盘控制器驱动未加载(如RAID卡)。 2. 系统使用了特殊的文件系统。 | 1. 在救援模式选择界面,尝试加载额外驱动或选择“高级选项”。 2. 手动检查 /dev/下的磁盘设备,尝试fdisk -l查看。 |
| 重置密码后,重启仍提示密码错误 | 1. 使用了passwd但未成功执行exec /sbin/init,导致密码文件未正确同步。2. 系统配置了LDAP、AD等外部认证,本地密码无效。 | 1. 确保在单用户Shell下执行了exec命令或正常关机(poweroff)。2. 检查 /etc/nsswitch.conf和/etc/pam.d/下的配置,确认认证源。 |
| ARM设备串口无输出 | 1. 串口线序接错。 2. 波特率不匹配。 3. 内核未配置该串口为控制台。 | 1. 交换RX和TX线序尝试。 2. 尝试常见的波特率:115200, 9600, 57600。 3. 检查设备手册,确认调试串口引脚。 |
5.2 操作中的黄金法则与心得
- 胆大心细,做好记录:在修改GRUB参数前,用手机拍下原始屏幕。一旦改错导致无法启动,你可以对照照片恢复原样。
- 优先尝试虚拟机和测试机:如果条件允许,先在虚拟机上克隆一个环境进行演练。国产化环境复杂,一次成功的概率不高,测试能帮你熟悉流程和特定版本的差异。
- “rw”参数是生命线:忘记将
ro改为rw是最常见的失误。结果就是你能进单用户模式,但无法修改任何文件,功亏一篑。 - 关于SELinux:银河麒麟默认可能启用SELinux。在单用户模式重置密码后,如果SELinux处于强制模式,可能会导致登录失败。如果遇到此问题,在单用户Shell中,可以先执行
setenforce 0临时禁用SELinux,重启登录后再根据策略调整。更稳妥的做法是在重置密码后,创建SELinux文件系统标签:touch /.autorelabel && reboot,系统会在下次启动时重新标记所有文件。 - 防范于未然:
- 设置GRUB密码:为了防止他人轻易使用此方法修改你的系统密码,你应该为GRUB菜单设置密码。编辑
/etc/grub.d/40_custom文件,添加set superusers="root"和password_pbkdf2 root grub.pbkdf2...(密码哈希可通过grub2-mkpasswd-pbkdf2生成),然后更新grub.cfg。这样,在启动时按e编辑就需要输入密码了。 - 启用全盘加密:对于高安全要求场景,在安装系统时就启用LUKS加密。这样即使他人拿到硬盘,也无法通过本文所述方法重置密码(前提是你自己不能忘加密密码)。
- 保管好安装介质和救援密码:将系统的安装ISO和可能设置的GRUB救援密码妥善保管,这是你最后的“钥匙”。
- 设置GRUB密码:为了防止他人轻易使用此方法修改你的系统密码,你应该为GRUB菜单设置密码。编辑
密码重置是系统管理员的终极保险丝。掌握它在关键时刻能救急,但更深层次的意义在于,它提醒我们完善的权限管理和文档记录的重要性。对于生产系统,尽量避免只依赖一个root密码,而是使用sudo权限分配、密钥认证、集中式身份管理(如LDAP)等方式。每次交接,密码清单和系统文档的更新必须作为铁律执行。毕竟,最好的故障恢复,就是不让故障发生。