早上去工位,打开麒麟系统工作站,密码输了好几遍都提示错误——麒麟系统忘记密码修改这件事,真遇到了非常抓狂。最让人头疼的不是进不去系统,而是很多人第一反应就是“只能重装了”,一想到桌面环境、办公软件、开发工具全都要重新折腾一遍,心态直接崩掉。
其实麒麟系统是典型的 Linux 发行版,只要你能物理接触到设备,密码并不是“绝对恢复不了”的。这篇文章不讲虚的,直接给你三套可以落地的密码重置方案,从最快只需一分钟的单用户模式,到最稳妥的 Live USB chroot 方式,每一步都会解释清楚为什么这样做、底层原理是什么,以及我在实际踩坑中总结出来的注意事项。
先把最重要的前提放在最前面:以下所有操作,只适用于你自己有合法管理权限的设备。如果是公司机器、他人设备、运维交接但未获授权的机器,请务必走正规流程联系管理员,不要用这些技巧去做任何越权的事情。技术本身是中性的,但使用场景是否符合规范,取决于操作者自己。
熟悉 Linux 认证机制的朋友大概已经想到了,密码忘记之后核心思路就是通过物理接触的特权,绕过登录认证这个大闸,直接拿到一个 root shell,或者在外部环境下修改系统的密码文件。接下来我从原理开始讲,一步步带你把方案落地。
1. 项目概述与适用场景
1.1 麒麟系统忘记密码,到底属于哪一类问题
麒麟系统在国产化办公环境、政企内网、服务器运维中都非常常见,很多机器是统一配发的,初始密码往往是一串随机字符,管理员设置完就随手放在某个说明文件里,三个月后要用的时候翻遍抽屉也找不到。还有一种更常见的场景:为了应付密码复杂度要求,给自己设了一个高强度密码,两个月没登录,再登就怎么都想不起来了。
这类问题不算硬件故障,也不一定需要重装系统。它本质上是“身份认证失败”的问题——系统依然健康,数据也都在,只是登录环节卡住了。Linux 从设计之初就为这类情况留了系统性方案,比如单用户模式、内核参数引导阶段干预、Live 环境外部分区挂载等。这些机制原本是给运维人员做故障修复用的,密码恢复只是它们的经典应用之一。
这篇文章适合三类读者:第一类是要维护多台麒麟机器、需要掌握应急处理手段的运维人员;第二类是办公电脑密码遗忘的普通用户,哪怕不太懂命令行,也可以按步骤操作;第三类是想深入了解 Linux 引导、账号体系、文件系统挂载原理的学习者。通过一两次实操,你能把“控制台—GRUB—内核—文件系统—PAM 认证”这条链路彻底打通。
1.2 三种主流方案的取舍
从实际操作角度,我总结了三条最常用的技术路线:
表格里标注一下三条路线的主要差异:单用户模式以零成本、最快著称,但受限于系统本身;Live USB 方式最稳定,能在系统完全无法启动时兜底;图形化恢复模式则适合对命令行不熟的读者。
| 方案 | 核心原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 单用户模式 | 修改 GRUB 内核启动参数,跳过 systemd 和登录认证,直接进入 root shell | 无需外部介质,操作最快 | 需要能重启机器,受磁盘加密影响 | 本地办公机、虚拟机、物理服务器控制台 |
| Live USB chroot | 从启动盘进入临时 Linux 环境,挂载原系统分区后直接修改密码文件 | 最稳定,系统损坏时依然能用 | 需要制作启动盘,操作步骤略多 | 系统崩溃、GRUB 菜单失效、已做加密的分区解锁 |
| 恢复与救援模式 | 通过系统自带的恢复菜单进入 root shell 或自动挂载原系统 | 入口直观,无需手输内核参数 | 部分发行版默认隐藏该菜单 | 安装界面自带“故障排除”入口的版本 |
三种方案看着不同,本质却是一回事:要么绕过登录环节,要么直接修改存放密码哈希的文件。把这条主线记住,后面遇到任何变体都不会慌。
1.3 核心原理:绕过登录认证的三条路
先花两分钟理解一下登录流程。一台麒麟系统正常开机,经过的阶段大致是这样:BIOS/UEFI 自检 → 加载 GRUB 引导菜单 → 内核启动并挂载根文件系统 → systemd 启动各种服务 → 显示登录管理器(图形界面或命令行)→ PAM 认证模块读取 /etc/shadow 里的密码哈希 → 验证通过后才进入桌面。
密码忘记之后,我们要卡住的就是“PAM 认证读取密码哈希”这一环。三种方案本质上都是走向同一条路:不经过这个认证环节,直接获得一个 root 权限的 shell,然后调用 passwd 命令或手动修改 /etc/shadow。
这里有一个非常重要的安全认知:只要物理接触得到机器,Linux 的密码防线就不是绝对防线。你能按电源键、能进引导设置,就能用内核参数干预启动流程。所以企业环境的服务器通常还会叠加好几层防线,比如 BIOS 密码、磁盘加密、TPM 可信引导等,这些不是多此一举,而是防的就是“有人摸到机器就能重置密码”这个漏洞。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动手前必须理解的底层机制
2.1 账号密码到底存在哪里
要修改密码,第一步是搞清楚密码存在哪个文件。Linux 系统里有两个关键文件,一个是 /etc/passwd,一个是 /etc/shadow。
/etc/passwd 是所有人可读的,里面保存用户名、UID、用户组 ID、家目录、默认 shell。以前这个文件直接保存的是密码哈希,后来为了安全,密码哈希被挪到了只有 root 能读的 /etc/shadow。现在 /etc/passwd 里的密码字段通常是一个 x,表示密码实际存放在 shadow 文件中。
/etc/shadow 的内容格式大概是这样的:
code复制user:x:19000:0:99999:7:::
user:$6$abcdefg12345$LmH...:19000:0:99999:7:::
第一段是用户名,第二段就是密码哈希。密码重置的本质,就是把第二段替换成新密码对应的哈希,或者用 passwd 命令自动完成这个替换。如果哈希字段以 ! 或 * 开头,说明账户被锁定,登录时系统会直接拒绝,哪怕密码是对的也会失败。这个细节后面排查会遇到。
早期 Linux 的哈希格式有 $1$(MD5)、$5$(SHA-256)、$6$(SHA-512),新版本还会看到 $y$(yescrypt)。格式不同不影响我们操作,因为 passwd 命令会自动选择当前系统支持的加密方式。手动编辑 shadow 文件时就要小心了,格式不对会导致无法登录,所以正常场景我从不推荐直接改 shadow 文件的哈希,老老实实用 passwd 命令最安全。
2.2 GRUB 引导与内核参数
GRUB 是系统启动时的第一个软件,它把内核加载进内存,并传递一堆启动参数。在 GRUB 界面按下 e 键,就能以文本模式编辑当前选中的启动菜单项。
编辑界面里你会发现几个关键行。以 linux 开头的那一行负责指定内核镜像和启动参数,有的版本显示 linuxefi 或 kernel,本质都是同一行。我们的所有干预几乎都集中在这一行的末尾追加参数。
最常见、最有效的两个参数:
single:让系统直接进入单用户模式。在 systemd 时代,这个参数会映射到 rescue.target,效果是启动一个最简系统,给出 root shell。init=/bin/bash:让内核在加载完后不再执行 /sbin/init,而是直接启动一个 bash。这样连 systemd 都不跑,速度极快,也几乎不受图形登录管理器的干扰。
我实测下来,rw init=/bin/bash 是目前最稳的组合。rw 让内核直接以读写方式挂载根文件系统,省去了后面的 remount 步骤。有时系统会忽略 rw 参数,原因与内核和 initramfs 的处理顺序有关,所以进到 shell 后还要确认一下挂载状态。
2.3 只读挂载与根文件系统
很多第一次操作的人会卡在 passwd 报错这一步,提示什么“Authentication token manipulation error”“Cannot lock /etc/passwd”。这通常是根文件系统只读引起的。
为什么明明是想修改密码,文件系统却是只读的?因为正常引导流程中,根文件系统会先以只读方式挂载,由 init 进程完成检查和 re-mount 读写操作。但你用 init=/bin/bash 直接把 bash 提上来了,本来该做 remount 的 init 进程根本没运行,所以根分区就停留在只读状态。
解决办法非常简单:
bash复制mount -o remount,rw /
这行命令把根文件系统从只读切换成读写。执行完再跑 passwd 就不会报错了。这个知识点一定要记住,后面三种方案里任何单用户/救援模式都会遇到同样的问题。
3. 实操方案一:单用户模式重置密码
这条方案是速度最快、最常被运维使用的。整过过程只要五分钟,而且不需要 U 盘、不需要外接键盘,操作者只需要能在重启时接触到机器。
3.1 进入 GRUB 编辑模式
第一步,重启电脑。如果当前系统已经进不去,直接按电源键强制重启也没问题,但要注意如果是服务器,先确认没有正在运行的关键业务,能走正常重启命令就尽量走正常命令。
在开机画面过去后,会出现 GRUB 菜单。这时候用方向键选中你要进入的内核条目,然后按 e 进入编辑界面。如果你的机器 GRUB 菜单一闪而过甚至直接隐藏了,先别急,常见问题的章节里有专门处理方法。现在假设能正常看到菜单。
在编辑界面里,你能看到类似这样的内容:
code复制load_video
set gfxpayload=keep
insmod gzio
linux /vmlinuz-... root=/dev/sda2 quiet splash
initrd /initrd.img-...
核心就是第二行以 linux 开头的内容。
3.2 追加内核启动参数
把光标移到 linux 那一行的行尾,先按一下空格,然后追加:
code复制rw init=/bin/bash
如果你的系统里有 quiet splash 等参数,不用删,可以直接加在它们后面。如果原来已经有 ro(只读)字样,建议手动改成 rw,或者等下进系统后执行 remount。加完参数后,按 Ctrl+X 或 F10 启动。
我习惯同时保留两个保险:一个是在命令行里明确写了 rw,另一个是进系统后如果发现还是只读,就手动执行 remount。不要嫌重复,现场环境千奇百怪,有时候 GRUB 参数没传递成功,备用手动命令能救你一把。
3.3 在 root shell 中修改密码
正常情况你会看到一段快速滚动的内核输出,然后停在一个 shell 提示符下,通常是 bash-5.1# 或类似形式,不要求输入密码。这说明你已经拿到了 root 权限。
先执行一条命令确认根文件系统的挂载状态:
bash复制mount | grep ' / '
看输出里是 ro 还是 rw。如果显示的是 ro,立即执行:
bash复制mount -o remount,rw /
接下来修改 root 密码:
bash复制passwd root
系统会提示输入两次新密码。这里要注意,终端上不会显示输入内容,很多人以为键盘坏了,其实只是正常的静默回显。如果是想修改普通用户密码,就把命令改成:
bash复制passwd 用户名
比如 passwd zhangsan。在 root shell 里修改普通用户密码不需要知道该用户的原密码,直接覆盖即可。
如果提示 passwd: command not found,说明默认 PATH 没带上 /usr/bin 目录,可以输入完整路径:
bash复制/usr/bin/passwd root
3.4 处理 SELinux 标记
这一步很多教程不会提,但在麒麟系统的部分服务器版本上非常重要。如果系统启用了 SELinux 且处于 enforcing(强制)模式,直接用 passwd 修改密码后,/etc/shadow 文件的 SELinux 安全上下文可能会变得异常。重启后登录时,PAM 会认为 shadow 文件不可信,导致反复跳回登录界面或者认证失败。
最简单的解决方案是让系统在下次重启时重新做文件安全上下文标注:
bash复制touch /.autorelabel
创建了这个文件之后,重启时系统会重新扫描并修正所有文件的 SELinux 标签,耗时几分钟,期间自动执行,不用人守着。如果你的机器没有启用 SELinux,这一行命令不影响任何东西,我一般照做,反正没有副作用。
3.5 重启验证
因为内核是被你直接用 init=/bin/bash 拉起来的,systemd 根本没有运行,这时候直接执行 reboot 可能会遇到“Reached target Shutdown”之类的卡顿,因为系统没有一个完整的 init 体系来配合。我推荐两种收尾方式:
第一种,先回到正常 init 再关机:
bash复制exec /sbin/init
这条命令会把 init 重新拉起来,systemd 恢复正常,然后你再执行 reboot。第二种,直接用强制重启:
bash复制reboot -f
-f 参数跳过正常的关机流程,直接通知内核重启。如果数据没有未保存的写入,用这个没问题。我平时图省事就用 reboot -f,但如果你在刚改完密码后还有其他文件操作,更稳妥的还是 exec /sbin/init。
重启后,用新密码登录。进系统后务必确认一下 shadow 文件权限没有被改错。正常情况应该是 root 所有,权限为 600 或更严格:
bash复制ls -l /etc/shadow
看到输出形如 -rw-r----- root root 就没问题。万一权限不对,执行:
bash复制chown root:root /etc/shadow
chmod 600 /etc/shadow
4. 实操方案二:Live USB chroot 法
单用户模式虽然快,但不是每次都能奏效。比如系统 GRUB 菜单完全消失、内核崩溃、根分区文件系统有毛病、或者磁盘做了 LVM/LUKS 封装,这时候用 Live USB 从外部进入系统是更稳的选择。这套方案稍微多几步,但每一步都不难,适合作为兜底手段。
4.1 制作启动介质
准备一个至少 4GB 的 U 盘,下载麒麟系统的官方安装镜像,或者任何主流 Linux 发行版的 Live 镜像都可以。烧录工具方面,我用过 dd、官方烧录工具、跨平台写盘工具等,效果都差不多。Linux 命令行下的最直接写法:
bash复制sudo dd if=镜像文件.iso of=/dev/sdX bs=4M status=progress
这里 /dev/sdX 是你 U 盘的设备名,注意备份 U 盘数据,因为 dd 会直接覆盖整块 U 盘。如果不想折腾命令行,也可以用带图形界面的烧录工具,选好 ISO 和 U 盘,一键写入即可。
4.2 进入 Live 环境并识别分区
插入 U 盘,开机时通过启动菜单选择从 U 盘启动。不同机器的快捷键不一样,常见的是 F12、F11、Esc、F7,开机画面通常会有提示。
进入 Live 桌面后,打开终端,运行:
bash复制lsblk
这个命令会列出所有磁盘和分区,信息很直观。你要从中找到麒麟系统原来所在的根分区。比如输出里有一个 /dev/sda2 大小几百 GB,挂载点为空,文件系统是 ext4 或 xfs,那八成就是它。如果还不放心,用 blkid 看 UUID 和文件系统类型:
bash复制blkid
拿到根分区设备名之后,就能进入下一步。
4.3 挂载根分区并 chroot
先建一个挂载目录:
bash复制sudo mkdir -p /mnt/sysroot
假设根分区是 /dev/sda2,挂载它:
bash复制sudo mount /dev/sda2 /mnt/sysroot
如果你的系统把 /boot、/var、/usr 放在独立分区,也需要分别挂载到 /mnt/sysroot/boot、/mnt/sysroot/var 等目录下。不过大多数桌面版安装默认都放在同一个根分区,这一步通常可以跳过。
为了让 chroot 环境里的命令(比如 passwd)正常运行,最好再把几个虚拟文件系统绑定进去:
bash复制sudo mount --bind /dev /mnt/sysroot/dev
sudo mount --bind /proc /mnt/sysroot/proc
sudo mount --bind /sys /mnt/sysroot/sys
然后切换到目标系统:
bash复制sudo chroot /mnt/sysroot
执行完这一句之后,终端里的提示符会变化,表示你当前操作已经“进入”了原系统,虽然你现在实际上是从 U 盘启动的,但命令行看到的是原系统的根目录和文件。
4.4 在 chroot 中修改密码
在 chroot 环境中,一切就像在原系统里一样:
bash复制passwd root
或者:
bash复制passwd 用户名
同样输入两遍新密码。这里不需要知道原密码,因为你是用 root 身份在修改。完成后输入 exit 退出 chroot:
bash复制exit
然后依次卸载之前绑定的虚拟文件系统和根分区:
bash复制sudo umount /mnt/sysroot/proc
sudo umount /mnt/sysroot/sys
sudo umount /mnt/sysroot/dev
sudo umount /mnt/sysroot
最后重启:
bash复制sudo reboot
注意把 U 盘拔掉,否则可能又会从 U 盘启动。这套流程比单用户模式安全的地方在于,你始终是在一个完整运行的 Linux 环境里操作,很多依赖 systemd 的功能都正常,不太会出现 reboot 卡住这类问题。
4.5 处理 LVM 与 LUKS 加密分区
如果当初安装系统时用了 LVM 逻辑卷,lsblk 里会看到类似的设备名:/dev/mapper/vg_kylin-lv_root。这种情况直接挂载 /dev/sda2 是看不到文件系统的,需要先找逻辑卷名:
bash复制sudo lvs
然后挂载对应的逻辑卷:
bash复制sudo mount /dev/mapper/vg_kylin-lv_root /mnt/sysroot
如果系统还做了 LUKS 全盘加密,过程就多一步。启动 Live 环境后,先识别出加密分区,然后解锁:
bash复制sudo cryptsetup luksOpen /dev/sda2 luks_sys
命令执行后会要求输入加密密钥,输入正确后,会在 /dev/mapper/ 下生成一个 luks_sys 设备,再挂载这个设备即可。这里要特别提醒:如果你当初的加密密钥也忘记了,物理方式重置密码这条路就是死胡同。磁盘加密的存在意义正是防止物理接触者修改系统文件,所以在部署阶段一定把恢复密钥打印出来放保险柜,避免出现“机器就在面前但什么都做不了”的局面。
5. 实操方案三:恢复模式与救援模式
5.1 使用恢复模式进入 root shell
和 Ubuntu 等发行版类似,麒麟桌面系统安装后,GRUB 菜单里可能在“高级选项”下隐藏了一个带 recovery mode 的内核条目。开机进入 GRUB 后,如果你的菜单里有类似这样的子菜单,选进去:
code复制Advanced options for Kylin
在子菜单里会看到类似 Linux 5.x.x-generic (recovery mode) 的条目。选中进去,不用按 e 手动改参数,系统会引导进入一个文本菜单,里面一般有 resume、clean、dpkg、root 等选项。
选择 root 或 “Drop to root shell prompt”,就会进入一个 root shell。这个 shell 本质上也是单用户模式,但入口更直观,适合不熟悉内核参数的新手。进入后第一步依然是确认根分区读写状态,只读就执行:
bash复制mount -o remount,rw /
然后修改密码、重启,方法与方案一完全一致。
5.2 使用救援模式自动化处理
如果你手头有麒麟系统安装盘,开机从安装盘启动之后,安装界面通常会有一个“故障排除”或“Rescue a Kylin system”的入口。选择救援模式后,系统会先探测磁盘,然后提示你选择要修复的根分区位置。选对了之后,它会自动挂载相关分区,一般把原系统根挂载到 /mnt/sysimage。
接下来你可以直接进入一个 shell,继续执行:
bash复制chroot /mnt/sysimage
passwd root
exit
reboot
救援模式的好处在于它把很多分区挂载和检测的脏活替你干完了,而且每一步都有中文提示,对命令不熟的人非常友好。要说缺点,就是你必须带着安装介质才能用,应急场景下如果手边没有 U 盘,反而不如单用户模式灵活。
6. 常见问题与排查技巧实录
实操过程中真正让人头大的往往是各种“意外”。下面这些现象我基本都亲眼见过,整理成清单,按症状给出解决办法。
6.1 GRUB 菜单不出来怎么办
开机之后直接进入登录界面或者黑屏,根本看不到 GRUB 菜单。通常是系统把启动菜单超时时间设成了 0,或者用了 hide menu 配置。
先尝试开机时按住 Shift 键(BIOS 启动模式)或者反复按 Esc 键(UEFI 启动模式),很多时候能强行把菜单唤醒。如果不行,而你刚好还能用原密码进入系统,就修改 /etc/default/grub:
code复制GRUB_TIMEOUT=5
GRUB_TIMEOUT_STYLE=menu
然后执行:
bash复制sudo update-grub
更新完重启就会显示菜单。如果你现在完全进不了系统,手里又没有 Live 介质,那就只能找另一台电脑做 U 盘了。所以我的建议是:企业里的关键机器,GRUB 菜单不要设成隐藏,保留一个至少三秒的等待时间,应急时能救命。
6.2 根分区只读导致改不了密码
前面反复强调过:passwd 报错 Authentication token manipulation error,或者提示无法锁定 /etc/passwd,基本都是根分区只读。处理方式:
bash复制mount -o remount,rw /
如果执行 remount 还是失败,检查 dmesg 输出有没有 I/O 错误:
bash复制dmesg | tail -30
如果文件系统损坏,单用户模式下可能无法自动修复,需要先执行 fsck。Live USB chroot 也是修复文件系统的好时机,可以对目标分区跑一遍检查。
6.3 密码改成功但登录依然失败
常见原因有三个。
第一个是账户被锁定。查看 /etc/shadow 里对应用户行,密码字段如果以 ! 或 * 开头,就说明账户处于锁定状态。就算你刚用 passwd 设置了新密码,如果之前被锁定过,passwd 可能并没有自动解锁。执行:
bash复制passwd -u 用户名
解锁后再试登录。
第二个原因是密码强度策略。有些系统配置了 PAM 的 pam_pwquality 模块,要求新密码必须满足复杂度、长度、不能与旧密码相似等条件。如果 passwd 直接提示“密码太简单”并拒绝修改,就输入一个包含大小写字母、数字、特殊符号且足够长的新密码。
第三个原因比较隐蔽,系统启用了 pam_faillock 或 pam_tally2。输错太多次之后,即使密码改成正确的,账户也会在锁定期内被拒绝。清除方法:
bash复制rm -f /var/log/faillock/用户名
或者:
bash复制pam_tally2 --reset --user 用户名
各发行版策略不同,具体以 /etc/pam.d/ 下的配置为准。
6.4 root 登录图形界面被拒绝
在多数桌面 Linux 发行版中,root 账户默认是不允许从图形登录界面直接登录的,这是 PAM 策略的限制,也是为了安全。密码重置之后,你可能下意识想用 root 登录桌面,结果发现输入正确的密码也被拒绝。
这时候最佳做法不是去改 PAM 配置放开 root,而是用 root 把普通用户密码重置掉,然后直接用普通用户登录:
bash复制passwd zhangsan
如果确实需要 root 桌面登录,再考虑修改显示管理器和 PAM 配置文件,但不要在刚折腾完密码恢复的时候做这件事,容易把系统搞得更乱。
6.5 忘了的是普通用户密码,不是 root 密码
这两种情况的处理路径其实一模一样。进入 root shell 后,不看 root,而是直接指定用户名:
bash复制passwd 用户名
如果你连 root 密码也忘了,也不用担心。在默认配置下,进入单用户模式或 Live chroot 环境不需要 root 密码,你就是 root。不过有些加固过的系统会给单用户模式也加一道密码认证,这就不是默认行为了,需要 Live USB 绕行。
6.6 速查表
把最常见的问题和排查动作整理成一张表,方便现场对照:
| 症状 | 可能原因 | 处理方式 |
|---|---|---|
| 开机看不到 GRUB 菜单 | 菜单超时 0 或 hidden | 开机按 Shift/Esc,进系统后改 GRUB_TIMEOUT |
| passwd 报 token 错误 | 根分区只读 | mount -o remount,rw / |
| passwd 命令找不到 | PATH 不完整 | 输入 /usr/bin/passwd |
| 登录提示 Authentication failure | 账户锁定 | passwd -u 用户名 |
| 改完密码仍反复跳登录页 | SELinux 上下文异常 | touch /.autorelabel |
| 密码太简单被拒绝 | PAM 密码强度策略 | 输入更复杂强密码 |
| root 无法登录图形界面 | PAM 禁止 root 登录 | 改普通用户密码或用普通用户登录 |
| 修改成功后无法记住 | 强制重启导致写入未落盘 | 确认 rw 挂载后再改,退出时 exec /sbin/init |
| 磁盘加密导致找不到分区 | LUKS 未解锁 | cryptsetup luksOpen |
7. 踩坑经验与安全建议
7.1 我踩过的几个坑
第一个坑是在只读文件系统上盲目执行 passwd。那次我进单用户模式很快,结果 passwd 一直报错,我以为是 shadow 文件损坏,反复对比文件内容,浪费了大概二十分钟,最后才发现根分区还挂着 ro。后来我养成习惯,不管用什么方案进去,第一件事永远是看挂载状态、做 remount,这个顺序不能乱。
第二个坑是 SELinux。有台服务器改完密码后重启,界面回到登录页但输入新密码却一直不对,换了另外一台机器用相同步骤做就没问题。后来查资料才意识到是 SELinux 强制模式下的安全上下文问题。现在凡是遇到改 shadow 文件的操作,我都会顺手建一个 /.autorelabel,成本极低,却能省掉一次返工。
第三个坑是在 Live USB 环境里改完密码后忘记卸载挂载,直接关机拔了 U 盘。重启后原系统因为根分区的日志没有干净卸载,跑了一次完整文件系统检查,虽然说没有造成数据丢失,但等 fsck 跑完那几分钟确实很吓人。所以现在每次收尾我都会严格按照先卸载、再关机的顺序。
第四个坑是键盘布局。在图形桌面下用的是一个键盘布局,到了控制台或者单用户模式,layout 可能变成别的语言,输入 y 和 z 正好颠倒。这会导致密码输错,看起来像功能问题,其实只是你输错字符了。遇到这种情况,先输入几个字符确认一下输出内容,或者在输入密码时放慢速度。
7.2 为什么物理安全和系统密码同样重要
我把这一小节放在文章的后面,是因为很多人做完整套密码重置,会有一种“系统很脆弱”的错觉。实际上要澄清一个概念:这一操作不仅是对普通用户开放的“最后一扇门”,也是系统设计给管理员预留的修复通道。但同时你要清楚,谁摸得到物理机,谁就摸得到这扇门。
所以真正安全的企业环境,不会只靠 Linux 登录密码。常见的加固手段包括:BIOS/UEFI 管理员密码,防止别人修改启动顺序;磁盘加密 LUKS,防止硬盘拆走之后被读取;TPM 可信引导,防止引导参数被篡改;串口控制台访问限制等。如果你的机器不在绝对受控的机房里,至少设置一个 BIOS 密码,成本几乎为零,但在“有人私自重启重置密码”这条路径上能多一道硬墙。
从我维护过的机器来看,最容易出问题的不是技术方案无效,而是制度上没做好预防。密码忘了不可怕,可怕的是所有机器都用一个密码、没有备用入口、唯一的密码还写在Windows记事本里且没备份。这种环境下一旦忘记,恢复成本非常高。
7.3 怎么避免下次再忘记密码
经验说完了,给几条实用的预防建议。
第一,用密码管理器。系统管理员永远不该把五花八门的各类密码记在脑子里或者桌面的 txt 文件里。挑一个跨平台的密码工具,数据库加密备份,以后麒麟系统的密码也直接往里面存。
第二,为关键机器准备一个备用管理员账号。比如日常用 zhangsan,应急备用账户 admin-rescue,密码单独特立,只有需要时才会使用。平时不会被触发,真正出事时它就是你的救命通道。
第三,服务器尽量配置 SSH 公钥登录。即使忘记密码,只要还能从网络到达这台服务器,并且 SSH 服务正常,你就可以通过公钥登录进去,然后用 sudo 重置其他密码。这个方案适合机房里的机器,办公桌面机不太适用。
第四,如果实在不习惯用密码管理器,可以打一份密码记录,装在信封里放到保险位置。一份密码记录挑一个你最信任的存放点,比如家里的保险柜、单位的保密柜,降低被无关人员看到的概率。
最后再强调一遍合规边界:这篇文章讲的是系统管理员处理自己管理的合法设备。我在实际工作中,凡是遇到不是本部门在责任人、没有接口人授权的情况,一律拒绝操作,先走审批。技术能力是用来提高效率的,不是用来越权的。
我个人在处理这么多起“麒麟系统忘记密码”案例之后,最大的体会是:密码重置本身并不难,真正值钱的是搞懂背后的引导、挂载、认证逻辑。只要思路清晰了,今天聊到的三个方案你完全可以举一反三,哪怕是换了其他 Linux 发行版,底层原理也一模一样。遇到密码卡住别急着重装系统,先冷静下来,判断自己能重启吗、手里有启动介质吗、系统有没有加密,然后照着这篇文章的路径走下去,大概率能平稳解决。
