
做过机房运维的朋友估计都有这种体验一台几个月没碰的服务器突然要上线新业务你满头大汗把它接上显示器和键盘结果屏幕上不是熟悉的登录界面而是一行冷冰冰的GRUB提示符或者干脆卡在引导菜单里要密码。再一问之前配置的人早离职了那双密码——系统用户密码和 GRUB 引导密码——谁也没留下。这个场景在银河麒麟 V10 SP3 上尤其常见。麒麟系统为了安全默认情况下会在 GRUB 引导层再加一道密码锁防止有人通过单用户模式直接改 root 密码。初衷很好但一旦密码本身丢了就成了运维人员的噩梦系统进不去引导也解锁不了整台机器跟砖头差不多。不过别慌这不是无解的题。我最近刚在几台麒麟 V10 SP3含服务器版和桌面版上做过一轮完整救援从“GRUB 菜单还能进”到“GRUB 彻底锁死只能拆机用U盘”各种情况都过了一遍。这篇文章就把我实测可用的救援流程、原理和踩过的坑完整写出来。只要你能物理接触到这台机器而且确认自己有这台设备的合法管理权限那下面的操作基本都能帮你把系统捞回来。1. 先搞清楚麒麟V10 SP3的“双密码”到底锁了什么1.1 启动链路与GRUB密码保护机制要解扣子先得看线怎么穿的。银河麒麟 V10 SP3 基于 RHEL 8 系改造启动链路是标准的 UEFI/Legacy BIOS GRUB2 systemd 结构。开机后固件加载 GRUB2 引导器GRUB2 再加载内核和 initramfs最后由 systemd 拉起整个用户态。在这条链路里GRUB2 承担了“门卫”的角色。它本身支持两种密码保护机制一是password命令写在/boot/grub2/grub.cfg或/etc/grub.d/下的脚本里用于指定某个菜单项需要输入用户名和密码才能启动或编辑。二是superusers机制配合grub2-setpassword生成的哈希文件默认存在/boot/grub2/user.cfg。设置了superusers之后GRUB 菜单的所有交互操作按e编辑启动项、按c进入命令行、甚至直接启动选中的菜单项都需要认证。麒麟 V10 SP3 在安装时如果勾选了“启用引导保护”或类似选项就会往 GRUB 里写入superusers和password_pbkdf2配置。这就是所谓“双密码”里第一道锁的由来。所以你会看到重启后 GRUB 菜单能显示但只要一按e想编辑就弹出一个Username/Password的输入框。这跟你系统里 root 账号的密码完全是两码事属于独立的第二套认证体系。1.2 双密码的两种常见情况我实际救援时遇到过两种典型局面第一种GRUB 菜单压根进不去开机直接跳到grub rescue提示符或者黑屏只有一个光标闪烁。这种情况多半不是密码锁的问题而是 GRUB 引导文件损坏、分区变化、或者系统更新后引导器没装对。密码被锁属于雪上加霜你想手敲命令引导结果命令也要求先认证。第二种GRUB 菜单能正常看到但按e或c需要用户名和密码而你不知道。这种情况下内核和系统文件大概率是完好的只是引导入口被卡住了。分清这两种情况很重要因为救援路径完全不一样。前者往往得用安装盘进救援模式重装引导器后者则有机会在 GRUB 菜单层面直接改启动参数混进去。1.3 准备工作和关键前提不管走哪条路有几件事必须提前确认你必须有这台机器的物理控制权或者至少有 IPMI/BMC 的远程控制台权限。所有 GRUB 救援都绕不开物理键盘和显示器或等效的远程KVM。准备一个麒麟 V10 SP3 的安装U盘或 Live 环境镜像。最好版本和系统一致这样可以避免内核模块版本不匹配的问题。记录好当前磁盘分区情况建议用lsblk或fdisk -l提前看一眼。如果你是盲操作进不去系统可以在 GRUB rescue 下用ls命令试探。心理上要有预期救援过程可能需要反复重启、试错尤其是 GRUB 命令行下手动设置分区时很容易打错设备名别急。重要以下所有操作仅适用于你拥有该设备合法管理权限的运维场景。密码遗忘不代表你可以随意处置别人或单位的服务器。没有授权的前提下任何密码重置都可能涉及违规请务必自行确认操作资格。2. GRUB菜单还能进改内核参数进单用户模式重置密码2.1 进入编辑模式并修改启动参数如果你的 GRUB 菜单能显示而且按e之后弹出的密码框你知道密码或者没设置 superusers 只锁了特定菜单项那最好办。直接进编辑模式找到以linux开头的那一行通常是linux /boot/vmlinuz-4.19.90-XXXX.kylin.aarch64 root/dev/mapper/kylin-root ro crashkernelauto rd.lvm.lvkylin/root rhgb quiet把这一行里的ro改成rw并在行尾追加init/bin/bash或者systemd.unitrescue.target。然后按CtrlX或F10启动。这里有几个细节值得注意必须把ro改成rw否则进去之后根文件系统是只读挂载的你passwd时会报错说无法写 shadow 文件。init/bin/bash的意思是跳过正常的 systemd 启动流程直接让内核拉起一个 bash。这是最直接的“后门”但也是最容易被管理员锁掉的地方。麒麟 V10 SP3 有些安全加固版本会在内核参数里禁止这类操作具体表现是启动后卡住或直接重启那就得走后面的方案。如果设备是 aarch64 架构飞腾、鲲鹏等启动参数和设备路径会略有差异但linux行的修改思路完全一致。2.2 重置root密码与同步SELinux策略进入 bash 之后你会发现当前 shell 的根文件系统就是原来的根分区只是有些虚拟文件系统没挂载。执行mount -o remount,rw / passwd root此时会让你输入两次新密码。这里有个麒麟特有的坑如果系统启用了 SELinux麒麟 V10 默认Enforcing模式你直接改完密码重启可能会因为安全上下文问题导致登录异常。稳妥做法是在改完密码后创建一个.autorelabel标记文件让系统下次启动时自动重置文件安全上下文touch /.autorelabel如果你是通过init/bin/bash进去的SELinux 可能处于 disabled 或 permissive 状态因为内核参数里没有显式加载 SELinux 策略。这种情况下/.autorelabel依然建议做防止后续启动时策略状态不一致。改完密码后输入exec /sbin/init或直接reboot -f重启。正常情况下重启后就能用新密码登录系统了。2.3 为什么“ro改成rw、加init/bin/bash”能生效这事很多人知其然不知其所以然。内核启动时解析linux行里的参数ro表示只读挂载根分区rw表示读写挂载init覆盖了 systemd 的初始化路径。GRUB2 本来就是把这一行参数原样传给内核的所以只要你能编辑这行内核就按你写的来。但是如果 GRUB 里设置了superusers编辑动作本身就需要认证这也是为什么“GRUB密码能进”是这一方案的前提。3. GRUB彻底锁死从grub rescue命令行恢复引导与清密码3.1 识别grub rescue的触发原因如果重启后直接看到GRUB loading. Welcome to GRUB! error: file /grub2/grub.cfg not found. Entering rescue mode... grub rescue或者更简短的grub minimal bash like line editing is supported...那说明 GRUB 虽然还在但它找不到配置文件甚至找不到引导分区。常见原因有/boot分区被误格式化或误删除。系统盘顺序变化比如新增硬盘、拔盘导致(hd0,gpt1)这种设备路径失效。双系统安装其他引导器时覆盖了 GRUB 的核心文件。主板从 UEFI 模式切换成 Legacy 模式或反过来CSM 设置变化导致固件找不到 EFI 引导项。在这种grub rescue环境下GRUB 内置模块不完整很多命令不可用但ls、set、insmod是有的。我们的思路就是手动找到/boot/grub2所在分区告诉 GRUB 该去哪找配置和模块然后加载 normal 模块回到完整 GRUB 环境。3.2 手动设置prefix/root恢复normal模式首先执行ls会输出类似(hd0) (hd0,gpt1) (hd0,gpt2) (hd1,gpt1)每个分区可以进一步查看文件系统类型ls (hd0,gpt1)如果能显示ext4或vfat说明这个分区的文件系统能被识别。接下来要确认哪个是/boot分区。在麒麟 V10 SP3 的默认安装里/boot通常是独立分区也可能直接放在根分区下没有独立/boot。逐个试探找到包含grub2/目录的分区。假设你发现(hd0,gpt2)是/boot那就执行set root(hd0,gpt2) set prefix(hd0,gpt2)/grub2 insmod normal normal如果路径正确你会看到熟悉的 GRUB 菜单。注意grub2目录在麒麟上是grub2而不是 Ubuntu 系的grub这个千万别弄混。如果insmod normal报错说找不到文件试试ls (hd0,gpt2)/grub2/i386-pc/normal.mod确认模块路径是否存在。如果是 UEFI 引导模块目录一般是x86_64-efi或aarch64-efiprefix 也要相应调整。恢复菜单后你可能还是会遇到按e要密码的问题。想清掉这道锁有两个办法一是进完整 GRUB 命令行后挂载分区直接改配置文件二是在 GRUB 命令行里用configfile加载未加密的菜单文件某些场景可行但麒麟默认都会加密关键菜单项所以更可靠的是进系统改。3.3 恢复GRUB菜单后如何重设密码如果 GRUB 菜单恢复出来且能正常启动系统那就简单了。进系统后执行grub2-setpassword这会交互式地要求你输入新的 GRUB 用户名和密码并更新/boot/grub2/user.cfg。如果你压根不想要 GRUB 密码这道锁可以手动清掉rm -f /boot/grub2/user.cfg grub2-mkconfig -o /boot/grub2/grub.cfg不过要注意如果/etc/grub.d/里某个脚本直接写死了superusers或password光删user.cfg不够还得检查/etc/grub.d/00_header、10_linux等文件里有没有相关配置。最粗暴的办法是逐个 grepgrep -r password_pbkdf2\|superusers /etc/grub.d/找到后把相关行注释或删除再重新生成grub.cfg和user.cfg。4. 终极兜底用麒麟安装U盘/Live环境进场chroot重置双密码4.1 制作启动介质并进入救援Shell如果 GRUB 的密码锁死了编辑和命令行而且你连grub rescue都进不去或者开机直接黑屏那最可靠的方案就是用麒麟 V10 SP3 的安装U盘启动进入 Live 环境或安装器的“救援模式”Rescue Mode。制作启动U盘很简单用dd或者 Rufus 把官方 ISO 写进U盘即可。麒麟官网提供 V10 SP3 桌面版和服务器版的 ISO 镜像按你机器的架构选择 x86_64 或 aarch64。以安装U盘启动后安装界面里一般会有“救援已安装的系统”或Rescue installed system选项。选它安装器会自动扫描磁盘上的 Linux 系统然后给你一个 shell。如果没有这个选项也可以选“试用Try”模式进入桌面后用mount手动挂载被救援的磁盘分区。进入救援 shell 后第一件事是确认分区fdisk -l lsblk找到根分区和/boot分区。假设根分区是/dev/sda3/boot是/dev/sda2则mount /dev/sda3 /mnt mount /dev/sda2 /mnt/boot mount --bind /dev /mnt/dev mount --bind /proc /mnt/proc mount --bind /sys /mnt/sys如果启用了 UEFI还需要挂载 EFI 分区一般是/dev/sda1挂到/mnt/boot/efi。4.2 chroot后的密码重置与GRUB密码清理挂载完成后用 chroot 切进去这时的环境就相当于你已经在原系统里了chroot /mnt /bin/bash然后重置 root 密码passwd root此时 GRUB 密码的清理也一样rm -f /boot/grub2/user.cfg grub2-setpassword或者如果你只是想单纯取消 GRUB 菜单密码可以直接删除后再重新生成引导配置grub2-mkconfig -o /boot/grub2/grub.cfg这里有个大坑在 chroot 里执行grub2-mkconfig时如果你的/boot挂载不完整生成的配置可能缺失内核条目甚至把grub.cfg写成空文件。我踩过一次进去之后重启GRUB 菜单只剩一个空白项最后还是重新用安装盘回来手工修好的。所以建议在删除旧配置前先备份一份cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak还有 SELinux 的问题跟前面一样touch /.autorelabel不过 chroot 环境下生成.autorelabel可能不够因为系统下次启动时自动重打标签会导致启动变慢但一般都能正常完成。如果担心也可以在 chroot 里手动执行restorecon -Rv /etc/shadow /etc/gshadow只恢复密码文件的安全上下文。退出 chroot 后记得卸载所有挂载点再重启exit umount -R /mnt reboot4.3 UEFI与Legacy BIOS的路径差异与坑麒麟 V10 SP3 在 UEFI 和 Legacy BIOS 两种引导方式下的文件路径和重装引导器命令有区别这个必须分开讲。Legacy BIOS 模式下GRUB 安装在磁盘的 MBR 区域。如果引导文件完整但 MBR 被破坏可以在 chroot 里执行grub2-install /dev/sda这个命令会重新把 GRUB 核心写入/dev/sda的 MBR。执行时确保/boot分区已被挂载到/mnt/boot否则grub2-install找不到模块文件。UEFI 模式下引导器文件在 EFI 系统分区ESP下的EFI/kylin/或EFI/ubuntu/目录。重装引导器的命令略有不同grub2-install --targetx86_64-efi --efi-directory/boot/efi --bootloader-idkylin注意--efi-directory指向的是 ESP 分区的挂载点不是/dev/sda1--bootloader-id指定的是固件引导菜单里显示的名字。还有一个常见坑如果你原来的系统是用 UEFI 模式安装的现在电脑 BIOS 却设成了 Legacy 模式引导U盘那么你在 chroot 里执行grub2-install时默认会尝试往 MBR 写东西即使你的磁盘是 GPT 分区表也极有可能装出一个既不能用 UEFI 引导、也不能用 Legacy 引导的“四不像”。所以救援一开始就要确认固件引导模式和原系统一致。5. 实操中常踩的坑与排查清单5.1 常见问题速查表下面这些是我救援时实际碰到和从同行那边收集到的问题整理成一张速查表方便你在现场对照排查。症状可能原因处理思路GRUB菜单按e提示Username/Password设置了superusers认证用合法密码进入无密码则走安装盘chroot方案开机进入grub rescueGRUB配置文件丢失或分区路径变化ls试探分区set root/prefixinsmod normalgrub rescue下insmod normal报文件不存在module路径不对或分区找错确认grub2/i386-pc或x86_64-efi路径逐个分区试探修改内核参数后启动卡在黑屏init/bin/bash被安全加固禁用/内核参数不支持改用systemd.unitrescue.target或换安装盘chrootchroot后passwd报错“cannot open /etc/shadow”根分区没以rw方式挂载mount -o remount,rw /mnt 重新挂载重置密码后重启登录失败或提示SELinux问题SELinux上下文错误touch /.autorelabel或restorecon /etc/shadow重生成grub.cfg后菜单为空/boot没有正确挂载或/boot目录为空检查mount状态确认vmlinuz和initramfs文件在UEFI模式下重装引导器后启动时找不到系统ESP分区未挂载或启动项损坏挂载ESP到/boot/efi用efibootmgr或grub2-install重建密码都重置完了但GRUB菜单还是要密码user.cfg删了但grub.cfg里仍写了password配置检查/etc/grub.d/下脚本删除password相关行再重新生成5.2 几个值得养成习惯的经验先说路径问题。麒麟 V10 SP3 的 GRUB 目录是/boot/grub2配置文件名是grub.cfg不是grub.conf。很多从 CentOS 6 时代过来的人习惯性去改/boot/grub/grub.conf在麒麟上会直接找不到文件。我已经见过不止一个同事在这上面浪费了半小时。再说GRUB密码的重置时机。如果你已经通过 chroot 或单用户模式进到系统里了重置普通用户密码和 root 密码之后顺手把 GRUB 密码也重置掉别只改一个。否则下次重启你还是要面对一道锁死的 GRUB 。这个问题在运维交接时特别常见帮忙的人只改了系统账号没管 GRUB结果下次出问题照样进不去。关于/.autorelabel我多说一句。麒麟 V10 SP3 在Enforcing模式下如果你不建这个标记就重启很多服务会启动失败因为 shadow、gshadow 等文件的 SELinux 标签可能已经不对了。之前我在实验室一台机器上图快改完密码直接重启结果 sshd 起不来sshd 的selinux_context_t全乱了最后又重新走了一遍 chroot 才修好。所以这个标记文件真不是可有可无的步骤。还有一个很多人会忽略的如果机器上有 LVM 逻辑卷chroot 之前一定要先激活卷组。麒麟默认安装通常会在/dev/mapper/kylin-root之类的设备名上装载根分区。在 w环境下你要先执行vgchange -ay然后lvdisplay或blkid看逻辑卷路径再挂载。忘了激活卷组会导致你 lsblk 看不到逻辑卷还会误以为系统盘数据丢了。5.3 救援完成后的收尾检查最后把系统捞回来后别急着走收工。我建议做三件事第一检查系统日志和磁盘状态确认之前 GRUB 丢配置是不是磁盘坏道导致的。如果dmesg里大量I/O error或者smartctl -H报错你光修引导是没用的过几天可能又挂了。第二把 root 之外的普通用户密码也确认一遍别留一个自己都不知道的账号。可以用awk -F: $30{print $1} /etc/passwd查看 UID 0 的账号很多时候运维会不小心造出多个 root 权限账号。第三重新核对 GRUB 密码策略。如果你不想让 GRUB 锁住自己那就用grub2-setpassword重新设置一个你知道的密码然后妥善记录在密码管理工具里。如果这就是一台高安全级别的机器那也别彻底删掉密码保护而是把密码交给至少两个人保管。我个人实际体验下来麒麟 V10 SP3 的救援思路和 RHEL 系基本一致但细节差别挺多——比如用户配置文件路径、安全上下文处理、还有模块目录名称。如果之前没在麒麟上救过火第一次难免手忙脚乱。但只要理解了“GRUB 锁的是引导入口并不是磁盘数据”心里就有底了——数据还在系统文件还在剩下的问题就只是怎么绕过那道门的问题。最后说一个土办法也是我压箱底的经验。如果条件允许尽量在每次运维交接时主动重置一次 GRUB 密码然后把密码存进团队共用的密码保险箱。密码遗忘这种事百分之九十九是管理流程问题不是技术问题。技术手段只能帮你兜底一次流程不补下次照样还得拿U盘蹲在机房里折腾。