1. 项目概述:当系统密码成为“拦路虎”
在国产化替代的大背景下,麒麟操作系统(包括银河麒麟和中标麒麟)正被越来越多的政府、企事业单位所采用。作为一名长期与各类操作系统打交道的IT运维人员,我经常遇到一个看似基础却非常棘手的问题:用户忘记了系统登录密码。无论是新同事入职、老员工离职,还是日常维护中的权限交接,密码遗忘都可能导致关键业务中断。尤其是在强调安全合规的国产化环境中,直接重装系统往往不是首选,因为这意味着数据丢失和复杂的应用重装。因此,掌握一套在麒麟操作系统上安全、合规地重置或绕过密码的方法,是每一位系统管理员必备的“急救”技能。
这个“合集”并非鼓励任何非法入侵行为,而是聚焦于系统管理员在合法授权范围内,对自有或所管辖的资产进行故障恢复的正当操作。其核心价值在于,当密码这把“钥匙”丢失时,我们能够在不破坏“门锁”(系统完整性)和“屋内财物”(用户数据)的前提下,重新获得访问权限。接下来,我将结合银河麒麟V10、中标麒麟等常见版本,从引导原理到实操步骤,详细拆解几种主流且经过验证的密码重置方法,并深入探讨其背后的技术逻辑与安全考量。
2. 核心原理:从GRUB引导到单用户模式
要理解密码重置,首先必须明白Linux系统(麒麟基于Linux)的启动与认证流程。系统启动后,用户看到的登录界面(如GDM、LightDM)只是整个链条的末端。在此之前,系统已经经历了BIOS/UEFI自检、引导加载程序(如GRUB2)加载内核、初始化内存盘(initrd)、启动系统初始化进程(如systemd)等一系列步骤。密码验证发生在用户空间服务启动之后。
GRUB2是这个链条中至关重要的一环。它不仅仅是一个菜单选择器,更是一个微型的操作系统环境,拥有加载特定内核、向内核传递参数的能力。麒麟操作系统的默认安装通常使用GRUB2作为引导管理器。当我们能够干预GRUB的启动过程,就能向内核传递特殊的启动参数,从而改变系统的初始化行为。
其中最关键的参数就是init。在Linux中,init参数指定了内核启动后运行的第一个进程(PID 1)。默认情况下,这个进程是/sbin/init(通常链接到systemd),它负责拉起所有系统服务,包括图形界面和登录管理器。如果我们通过GRUB将init参数修改为/bin/bash或/bin/sh,内核在完成硬件初始化和加载根文件系统后,将直接跳过一个完整的系统服务启动流程,直接给我们一个拥有root权限的Shell。这个Shell运行在真实的根文件系统上,因此我们可以直接修改系统中的任何文件,包括存储密码的/etc/shadow。
另一种常见的方法是传递single或1参数,这会让systemd进入“单用户模式”。在此模式下,系统仅启动最基础的服务,不启动网络、图形界面和多用户登录,并且会自动或经过简单验证后提供一个root shell。这与修改init参数异曲同工,都是通过改变启动目标来获取高权限操作环境。
注意:这些操作的前提是能够物理接触服务器或虚拟机控制台,并且系统的GRUB菜单在启动时没有被密码保护。如果GRUB被加密,则需要先破解GRUB密码,这涉及另一套流程,且通常需要更高级别的授权。
3. 实操准备:环境与工具确认
在进行任何操作之前,充分的准备和确认是避免意外风险的关键。以下是必须完成的检查清单:
3.1 确认操作系统版本与引导方式
不同的麒麟版本在细节上可能有差异。首先,你需要确认你面对的是银河麒麟还是中标麒麟,以及具体的大版本号(如V10、V7)。
- 查看版本命令(如果还能登录):
cat /etc/os-release或cat /etc/kylin-release。 - 观察启动画面:启动时的Logo和文字信息也能提供线索。
- 确认引导方式:是传统的BIOS+MBR,还是UEFI+GPT?这会影响修复介质的制作和引导。在系统内可以使用
sudo fdisk -l或ls /sys/firmware/efi来判断(如果后者存在目录,则是UEFI)。
3.2 获取必要的物理或虚拟控制台访问权限
这是最重要的前提。你必须能直接操作机器的键盘、显示器和电源(或虚拟机的等效控制台)。远程SSH连接在密码遗忘且无其他可用账户的情况下是无效的。
3.3 准备系统安装镜像或Live CD/USB(备用方案)
虽然本文主要介绍通过GRUB修改启动参数的方法,但准备一个同版本的麒麟系统安装U盘是明智的。如果GRUB损坏、被加密,或者文件系统出现错误导致无法挂载,使用安装镜像的“救援模式”将是最后的救命稻草。你可以从官方渠道下载ISO镜像,并使用Rufus、Ventoy或dd命令制作成启动盘。
3.4 风险评估与数据备份意识
- 授权:确保你的操作拥有系统所有者的明确授权。未经授权修改他人系统密码是违法行为。
- 数据备份:尽管密码重置操作本身通常不涉及数据分区,但任何对系统底层的操作都有潜在风险(如误操作、电源中断)。如果条件允许,在操作前对重要数据进行备份是最佳实践。
- 影响:操作成功后,原用户密码将被清除或修改,其加密存储的文件(如果使用了ECryptfs等)可能因密钥环变化而无法访问,需要额外处理。
4. 方法一:通过GRUB编辑启动参数(最常用)
这是最直接、最快速的方法,适用于绝大多数GRUB未被加密的场景。整个过程在系统重启后的几秒内完成。
4.1 进入GRUB编辑界面
- 重启目标麒麟系统。
- 在主机厂商Logo(或麒麟Logo)出现后,立即快速、连续地按下键盘上的
Esc键(某些机器可能是Shift键或F2、F12,但麒麟默认通常是Esc)。目的是中断GRUB的自动启动流程,进入GRUB菜单界面。 - 你会看到一个蓝色的GRUB菜单,列出了可启动的内核条目(例如“Kylin Linux Advanced Server V10 (4.19.90-23.8.v2101.ky10.x86_64)”)。
4.2 编辑内核启动参数
- 使用键盘上下方向键,将光标移动到你要启动的那个内核条目上(通常是第一个)。
- 按下键盘上的
e键(代表“edit”)。这时,你会进入一个文本编辑界面,显示了该启动项的具体配置内容。 - 在编辑界面中,找到以
linux或linuxefi(UEFI模式下)开头的那一行。这一行非常长,包含了内核镜像路径、root=参数、ro(只读挂载)等。 - 将光标移动到这一行的末尾。你需要进行关键修改:
- 方案A(推荐,直接获取root shell):在行末,先添加一个空格,然后输入
init=/bin/bash。修改后,该行末尾看起来像... quiet splash init=/bin/bash。 - 方案B(进入单用户模式):在行末,先添加一个空格,然后输入
single。或者找到ro参数,将其修改为rw init=/bin/bash(同时改为读写挂载并指定shell)。
- 方案A(推荐,直接获取root shell):在行末,先添加一个空格,然后输入
- 修改完成后,仔细检查一遍,确保没有输错。
4.3 启动修改后的配置
- 按下
Ctrl + X或F10(根据GRUB版本提示)来使用编辑后的配置启动系统。 - 系统将开始启动,但不会进入图形登录界面。你会看到内核信息滚动,最终停留在一个命令行提示符下,这个提示符可能是
bash-5.0#或类似的,并且你已经是root用户(注意提示符是#,而不是普通用户的$)。
4.4 重新挂载根文件系统为可读写
由于启动参数中通常包含ro(read-only),此时根文件系统/是以只读方式挂载的,无法修改文件。你需要将其重新挂载为读写模式:
mount -o remount,rw /执行成功后,可以使用mount | grep ‘ / ’来确认/的挂载选项已包含rw。
4.5 修改用户密码
现在,你可以使用passwd命令修改任意用户的密码。例如,要修改用户kylin的密码:
passwd kylin系统会提示你输入新的密码并确认。输入时屏幕上不会有任何显示(星号也没有),这是正常的,盲输后回车即可。 如果你想直接清空root密码(使其无需密码即可su),可以编辑/etc/shadow文件,找到root用户那一行(以root:开头),将第一个冒号和第二个冒号之间的加密密码字符串删除,使其变为root::。但出于安全考虑,更推荐使用passwd命令设置一个强密码。
4.6 强制重启系统
由于我们绕过了正常的初始化流程,直接杀死了本应是PID 1的进程,所以系统状态是不完整的。不要使用shutdown或reboot命令,它们可能无法正常工作。最可靠的方式是强制重启:
exec /sbin/init 6或者直接使用sync命令同步数据到磁盘后,按下Ctrl + Alt + Del(在虚拟机控制台可能需发送按键组合)或使用硬重启按钮。
实操心得:在虚拟机(如VMware)中操作时,按键捕获可能不灵敏。可以先将虚拟机焦点置于控制台窗口,然后在VMware的“虚拟机”菜单中,选择“电源”->“重新启动客户机”,并在启动过程中立即点击控制台内部,再狂按
Esc键。如果错过了GRUB界面,只需再次重启重试。
5. 方法二:使用安装镜像的救援模式
当GRUB被密码保护、无法进入,或者系统根本启动不了(如内核损坏、文件系统错误)时,使用系统安装U盘启动进入“救援模式”是更通用的方法。此方法也适用于忘记GRUB密码的情况。
5.1 从安装介质启动
- 将准备好的麒麟系统安装U盘插入目标机器。
- 重启系统,并进入BIOS/UEFI启动菜单(按键可能是F12、F2、Del等,依主板而定),选择从U盘启动。
- 进入安装程序的初始界面。
5.2 进入救援模式
在银河麒麟V10的安装界面,你通常不会直接看到“Rescue”字样。你需要这样做:
- 选择“安装Kylin Linux”的选项,但不要点击确认。
- 在大多数Linux安装界面,按下键盘上的
Ctrl + Alt + F2(或F3、F4)可以切换到不同的虚拟终端(tty)。切换到其中一个。 - 你会看到一个命令行登录提示符。此时,你实际上已经在一个基于安装镜像的微型Linux环境中了。这个环境拥有完整的命令行工具。
5.3 挂载原系统根分区
这是最关键也最容易出错的一步。你需要找到原麒麟系统安装的根分区(/)所在位置。
- 使用
fdisk -l或lsblk命令查看所有磁盘和分区。根据分区大小、文件系统类型(通常是ext4或xfs)来判断哪个是系统根分区。例如,你可能会看到/dev/sda2或/dev/nvme0n1p3。 - 创建一个目录作为挂载点,并挂载原系统根分区:
mkdir /mnt/sysroot mount /dev/sda2 /mnt/sysroot # 请将 /dev/sda2 替换为你的实际分区 - 如果原系统使用了独立的
/boot、/home分区,可能也需要挂载。但仅修改密码,通常只需挂载根分区。 - 接下来,为了使用原系统的用户数据库和密码工具,需要将一些重要的虚拟文件系统绑定挂载到刚挂载的根分区下:
mount --bind /dev /mnt/sysroot/dev mount --bind /proc /mnt/sysroot/proc mount --bind /sys /mnt/sysroot/sys
5.4 切换根环境并修改密码
现在,我们可以将当前环境的“根”切换到原系统的根分区下,就像我们真的在原系统中操作一样。
chroot /mnt/sysroot /bin/bash执行成功后,你的命令提示符可能会发生变化。此时,passwd命令修改的就是原系统的用户密码了。
passwd kylin # 修改kylin用户密码 # 或 passwd root # 修改root密码5.5 退出并重启
- 修改完成后,输入
exit退出chroot环境。 - 卸载所有挂载点(顺序很重要):
umount /mnt/sysroot/{sys,proc,dev} umount /mnt/sysroot - 输入
reboot重启,并拔出U盘,让系统从硬盘正常启动。
注意事项:在救援模式下,原系统的根分区有时可能因为文件系统错误而无法挂载为读写(
-o rw)。如果mount时报错,可以尝试先使用fsck检查并修复文件系统:fsck -y /dev/sda2。此外,确保你挂载的是正确的分区,误操作其他分区可能导致数据丢失。
6. 方法三:针对特定场景的变通方案
除了上述两种通用方法,在某些特定配置或问题场景下,可能需要一些变通。
6.1 处理GRUB密码保护
如果GRUB菜单被密码保护,在启动时按e编辑会要求输入密码。这时,方法一失效。你有两个选择:
- 使用安装镜像救援模式:这是最正规的途径。在chroot后,你可以编辑
/etc/grub.d/40_custom文件或直接修改/boot/grub2/grub.cfg(不推荐直接改,因为更新内核后会覆盖),清除或修改GRUB密码。更简单的方法是,在救援模式下直接重置目标用户的密码,然后用新密码登录系统,再在系统内用grub2-set-password命令重新管理GRUB密码。 - 清除CMOS/BIOS密码(物理机):如果BIOS设置了启动顺序锁,禁止从U盘启动,你可能需要打开机箱,通过清除CMOS跳线或拔掉主板电池几分钟来重置BIOS。这需要硬件操作权限。
6.2 图形界面崩溃但命令行可登录
有时,图形登录管理器(如GDM)崩溃,黑屏或循环退回登录界面,但通过Ctrl + Alt + F2切换到文本终端(tty2)后可以正常用密码登录。这本身不是密码问题,但可以通过命令行修改密码或修复图形环境。
- 在tty2登录后,可以用
passwd改密。 - 可以尝试重启图形服务:
sudo systemctl restart gdm(或lightdm)。 - 可以重装图形组件:
sudo yum reinstall gdm(银河麒麟V10通常使用dnf或yum)。
6.3 系统被锁定或账户被禁用
如果账户被锁定(例如多次输错密码),错误信息可能是“Authentication failure”或“Account is locked”。此时,即使你知道密码也无法登录。在通过GRUB或救援模式获取root权限后,你可以:
- 使用
passwd -u <username>解锁用户。 - 或者直接编辑
/etc/shadow,在相应用户行的加密密码字段前删除表示锁定的!或!!符号。
7. 安全加固与问题预防
掌握了“破解”方法,我们更应思考如何防止此类情况发生,或在发生时减少影响。这不仅是技术问题,更是管理问题。
7.1 启用并妥善保管GRUB引导密码
给GRUB菜单设置密码,可以防止非授权人员通过编辑启动参数获得root权限。在系统内,可以使用grub2-set-password命令来设置。密码会加密存储在/boot/grub2/user.cfg文件中。务必牢记此密码,并与其他重要凭证分开保管。否则,你将自己锁在门外,只能使用救援模式。
7.2 强制使用强密码策略与定期更换
通过pam_pwquality模块和/etc/login.defs文件,可以强制用户设置符合复杂性要求的密码(长度、大小写、数字、特殊字符),并设置最短/最长使用期限。定期更换密码能有效降低密码被长期破解或冒用的风险。
7.3 配置sudo权限替代直接使用root
避免日常使用root账户。为管理员配置sudo权限,使其在需要时通过自己的密码提权。这样,即使一个管理员的密码泄露或遗忘,影响的也只是其个人权限,root密码依然安全。可以通过visudo命令编辑/etc/sudoers文件进行配置。
7.4 建立应急响应与密码保管流程
- 应急账户:在系统中创建一个备用的、具有sudo权限的账户,并将其凭证密封保管在保险柜中,仅限紧急情况下授权使用。
- 密码管理:使用专业的密码管理工具(如Keepass、Bitwarden)集中管理服务器密码,并确保有备份和交接机制。
- 操作日志:所有通过GRUB或救援模式进行的密码重置操作,都应被记录在案。由于这些操作发生在系统服务之外,无法被系统日志捕获,因此需要建立手动的纸质或电子审批与记录流程。
7.5 全盘加密与TPM的考量
对于安全性要求极高的场景,可以考虑启用全盘加密(如LUKS)。这样即使通过GRUB进入单用户模式,在挂载根分区时也需要输入加密密码。结合TPM(可信平台模块)芯片,可以实现系统启动与硬件绑定的更高安全级别。但这也会大大增加密码遗忘后的恢复难度,通常需要额外的恢复密钥,该密钥的保管至关重要。
8. 常见问题与排查实录
在实际操作中,你可能会遇到一些意想不到的问题。以下是我和同行们踩过的一些“坑”及解决方案。
8.1 修改密码后,重启依然无法登录
- 可能原因1:文件系统挂载为只读。在方法一中,忘记执行
mount -o remount,rw /,导致对/etc/shadow的修改没有实际写入磁盘。解决方案:重新进入单用户模式,确保先重新挂载为读写模式。 - 可能原因2:SELinux或AppArmor安全模块。某些强制访问控制策略可能阻止了修改。在救援模式chroot后,可以尝试临时禁用SELinux:编辑
/etc/selinux/config,将SELINUX=enforcing改为SELINUX=permissive,然后重启。但生产环境慎用,需评估安全策略。 - 可能原因3:用户家目录加密。如果用户使用了eCryptfs等加密了家目录,密码重置后,登录时可能会因为旧的密钥环不匹配而卡住。此时需要手动迁移或解密密钥环,过程较为复杂。
8.2 进入GRUB编辑界面后,找不到linux那一行
- 可能原因:你选错了启动条目。有些GRUB配置包含多个菜单,比如“正常启动”和“恢复模式”。确保你选择的是默认的、非恢复模式的内核条目进行编辑。
8.3 使用安装镜像时,无法找到原系统的根分区
- 可能原因1:磁盘控制器驱动问题。在救援环境的Shell中,使用
lspci -k查看存储控制器驱动是否加载。可以尝试modprobe ahci(对于SATA)或modprobe nvme等命令加载驱动后再用lsblk查看。 - 可能原因2:使用了LVM逻辑卷。原系统的
/可能在一个逻辑卷上,如/dev/mapper/klas-root。你需要先激活卷组:vgchange -ay,然后逻辑卷设备文件就会出现,再对其进行挂载。 - 可能原因3:使用了非标准文件系统。确认文件系统类型,并使用对应的工具挂载,如XFS文件系统是稳定的,但需要确保内核支持。
8.4 操作完成后,系统服务异常
- 可能原因:在通过
init=/bin/bash启动的Shell中,如果除了改密码还进行了其他不完整的系统操作(如手动启动了部分服务),可能导致系统状态不一致。最佳实践是,在获取root shell后,只做密码修改这一件事,然后立即强制重启。让系统按照正常流程完整启动一遍,大多数问题都会消失。
8.5 虚拟机环境中特殊问题
- VMware:虚拟机启动速度很快,按
Esc键的时机非常短。可以在虚拟机设置->选项中,将“电源”->“启动时进入固件”勾选,这样下次启动会直接进入BIOS/GRUB界面。 - VirtualBox:默认情况下,
Host键(通常是右Ctrl)会捕获鼠标和键盘。在启动瞬间,要确保光标在虚拟机窗口内,并且没有按下Host键,否则按键会被宿主机截获。
这些方法构成了在麒麟操作系统上应对密码遗忘问题的完整工具箱。从快速应急的GRUB编辑,到普适性强的救援模式,再到各种边界场景的处理,理解其原理并能熟练运用,是系统管理员保障业务连续性的基本能力。记住,能力越大,责任越大。所有这些操作都应在严格的授权和监督下进行,并辅以完善的安全管理措施,才能让技术真正服务于业务稳定与安全。