干了几年国产化系统运维,被“密码忘了”这件事找上门的情况真不少。银河麒麟V10算是目前政企、教育、金融项目里出镜率最高的国产操作系统之一,很多人在现场遇到用户说“密码想不起来了”,第一反应是重装系统,这其实是最下策。系统里往往有业务数据、数据库实例、调度任务,重装一遍代价太大。密码重置在Linux系系统里有成熟套路,银河麒麟V10虽然做了不少定制,但底层依然是标准内核,方法完全走得通。这篇文章我把自己在飞腾、鲲鹏、x86几种架构的麒麟V10上实际验证过的密码恢复方案整理出来,从最常用的单用户模式到特殊分区场景下的备用手段,再到几个容易让人卡住的坑,一次性讲透。
1. 适用范围与核心思路:先搞清楚你要面对的是哪种情况
1.1 三类常见场景的判断方法
接到“密码忘了”的报障,别急着动手。先花几分钟判断属于下面哪种情况,因为处理路径完全不同:
第一类是普通用户密码遗失,但root密码还知道。这类最简单,root登录后一条passwd 用户名直接改掉,完全不用重启机器。
第二类是root密码和普通用户密码都不知道,或者root账号被锁定。这时必须进单用户模式或者借助Live系统去重置。这也是本文的核心场景。
第三类是机器放在机房或者异地,手上只有远程管理卡(比如BMC、iDRAC),没有物理控制台直接操作。这种情况需要先通过管理卡的远程控制台或者KVM进入引导界面,方法相同,但要注意远程控制台的键盘响应偶尔会卡顿,输内核参数时容易多打字符。
另外还要留意一个细节:银河麒麟V10存在多个版本分支,最常见的桌面版和国际版(或叫服务器版)在内核参数上有细微差异。我实测过SP1、SP2、SP3,内核大版本从4.19到5.10不等,但进入重置流程的入口基本一致,只是屏幕提示和菜单英文显示略有区别。判断自己手里是什么版本,可以在正常人登录时执行cat /etc/os-release查看VERSION_ID字段。如果已经进不了系统,那就直接从引导界面操作,不需要这个信息。
1.2 重置密码的底层原理:为什么不需要重装系统
很多人不理解,为什么一个Linux系统忘了root密码,改一下内核启动参数就能绕过去。这背后的逻辑和Windows的“PE系统改密码”类似,但机制不一样。
Linux的init进程是所有用户进程的祖先,负责拉起系统中的各种服务。正常情况下,内核启动到最后会执行/sbin/init,然后进入图形界面或者多用户命令行。如果我们告诉内核“你启动后别执行init了,去执行一个shell”,那系统就会启动到一个带root权限的、没有密码验证的shell环境。这个环境里,我们可以把硬盘上的根文件系统以读写方式挂载,直接用passwd命令重写密码哈希,改完后再正常重启,问题就解决了。
银河麒麟V10虽然默认用的不是传统的SysVinit而是systemd,但内核参数这一层完全兼容。init=/bin/bash这种启动方式在它上面依然有效,这也是整个方案里最核心的一步。理解了这个原理,后面遇到各种分支情况都能自己推导出解法,而不是死记命令。干了几年国产化系统运维,被“密码忘了”这件事找上门的情况真不少。银河麒麟V10算是目前政企、教育、金融项目里出镜率最高的国产操作系统之一,很多人在现场遇到用户说“密码想不起来了”,第一反应是重装系统,这其实是最下策。系统里往往有业务数据、数据库实例、调度任务,重装一遍代价太大。密码重置在Linux系系统里有成熟套路,银河麒麟V10虽然做了不少定制,但底层依然是标准内核,方法完全走得通。这篇文章我把自己在飞腾、鲲鹏、x86几种架构的麒麟V10上实际验证过的密码恢复方案整理出来,从最常用的单用户模式到特殊分区场景下的备用手段,再到几个容易让人卡住的坑,一次性讲透。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
1. 适用范围与核心思路:先搞清楚你要面对的是哪种情况
1.1 三类常见场景的判断方法
接到“密码忘了”的报障,别急着动手。先花几分钟判断属于下面哪种情况,因为处理路径完全不同:
第一类是普通用户密码遗失,但root密码还知道。这类最简单,root登录后一条passwd 用户名直接改掉,完全不用重启机器。
第二类是root密码和普通用户密码都不知道,或者root账号被锁定。这时必须进单用户模式或者借助Live系统去重置。这也是本文的核心场景。
第三类是机器放在机房或者异地,手上只有远程管理卡(比如BMC、iDRAC),没有物理控制台直接操作。这种情况需要先通过管理卡的远程控制台或者KVM进入引导界面,方法相同,但要注意远程控制台的键盘响应偶尔会卡顿,输内核参数时容易多打字符。
另外还要留意一个细节:银河麒麟V10存在多个版本分支,最常见的桌面版和服务器版在内核参数上有细微差异。我实测过SP1、SP2、SP3,内核大版本从4.19到5.10不等,但进入重置流程的入口基本一致,只是屏幕提示和菜单英文显示略有区别。判断自己手里是什么版本,可以在正常人登录时执行cat /etc/os-release查看VERSION_ID字段。如果已经进不了系统,那就直接从引导界面操作,不需要这个信息。
1.2 重置密码的底层原理:为什么不需要重装系统
很多人不理解,为什么一个Linux系统忘了root密码,改一下内核启动参数就能绕过去。这背后的逻辑和Windows的“PE系统改密码”类似,但机制不一样。
Linux的init进程是所有用户进程的祖先,负责拉起系统中的各种服务。正常情况下,内核启动到最后会执行/sbin/init,然后进入图形界面或者多用户命令行。如果我们告诉内核“你启动后别执行init了,去执行一个shell”,那系统就会启动到一个带root权限的、没有密码验证的shell环境。这个环境里,我们可以把硬盘上的根文件系统以读写方式挂载,直接用passwd命令重写密码哈希,改完后再正常重启,问题就解决了。
银河麒麟V10虽然默认用的不是传统的SysVinit而是systemd,但内核参数这一层完全兼容。init=/bin/bash这种启动方式在它上面依然有效,这也是整个方案里最核心的一步。理解了这个原理,后面遇到各种分支情况都能自己推导出解法,而不是死记命令。
2. 正常进入系统的前提:GRUB引导是唯一入口
2.1 进入GRUB引导菜单的常用操作
银河麒麟V10使用的引导程序是GRUB2,和CentOS、Ubuntu一样。要在开机时进入GRUB菜单,需要在BIOS自检结束后、系统开始加载内核之前快速按键。我遇到过不少新手在这一步就卡住了,因为麒麟V10默认的GRUB超时时间设得很短,有时候只有几秒。
最可靠的办法是开机后连续按键盘上的上下方向键,在屏幕出现主板的品牌Logo时就可以开始按。按键的具体选择与机器固件有关,常见的是Shift或Esc,但我在联想昭阳、清华同方、浪潮服务器上都试过,最通用的反而是上下方向键。方向键不会触发额外功能,只是让GRUB暂停等待选择,安全性最高。
如果机器启动太快、根本来不及按,还有个办法:在系统里把GRUB的超时时间改大。用root权限编辑/etc/default/grub,把GRUB_TIMEOUT=5改成GRUB_TIMEOUT=20之类的值,然后执行update-grub(桌面版)或grub2-mkconfig -o /boot/grub2/grub.cfg(服务器版)让配置生效。这个操作建议在密码还能用的时候提前做好,属于“平时准备、急时好用”的思路。
2.2 识别引导界面中的内核行
进入GRUB菜单后,默认会看到一个列表,上面是系统内核条目,下面可能有恢复模式或者memtest选项。银河麒麟V10的菜单默认可能隐藏了子菜单,普通条目显示为“NeoKylin Linux (4.19.XX)”。移动光标到第一行(也就是默认启动的内核),不要直接按回车,而是按字母e键进入编辑模式。
如果是服务器版且开启了UEFI安全启动,界面可能显示为linuxefi而不是linux,字段名不同但操作完全一样。ARM架构(飞腾、鲲鹏)的机器里,这行内容的开头通常还是linux,后面跟一串root=UUID=...的参数。找到以linux或linuxefi开头的那一行,这就是我们要改的目标。
2.3 修改内核启动参数:一个最小的最小改动
在编辑模式下,用方向键把光标移到内核行的末尾。这里最关键的是看到ro这个参数,它表示内核启动时先把根文件系统挂载为只读。我们需要做两件事:
第一,把ro改成rw,意思是启动后根文件系统以读写模式挂载。不改这一步,后面执行passwd时会提示“只能以只读文件系统”之类的错误。
第二,在整行的最后加上一个空格,然后输入init=/bin/bash。这个参数告诉内核:启动后不要去找systemd或者传统的init,直接启动一个bash shell。
改完后检查一下整行内容,确保没有把原有参数删除,也不要出现多余的空格或符号。注意init=/bin/bash前面的空格一定要有,否则内核会把它和前一个参数连在一起解析,导致启动失败。
确认无误后,按Ctrl+X(某些机器上可能是F10)启动系统。屏幕上会快速滚动一些内核日志,然后停在bash提示符下,通常是一个#号。这一步成功,就说明我们已经拿到了root权限的shell。
3. 实际操作:进入bash环境后如何修改密码
3.1 挂载根文件系统的正确姿势
进入bash后,看到#提示符,第一件事确认当前环境的位置。有时候系统会直接进入一个临时根目录(initramfs环境),有时候已经切到了真正的根文件系统。最简单的判断方式是执行mount | grep " / ",看输出内容里的挂载点是/dev/mapper/...还是rootfs之类的东西。
如果挂载的不是真实磁盘分区,说明我们还停留在initramfs环境,需要手动挂载。先执行mount -o remount,rw /把当前临时根目录设为可写,然后根据已知的根分区位置挂载真实系统。大多数情况下,执行lsblk能看到所有磁盘和分区,找出挂载点为/的那个分区,假设它叫/dev/sda3,就执行:mount /dev/sda3 /sysroot。然后用chroot /sysroot切换到真实系统环境。
这里有个容易踩的坑:银河麒麟V10在某些版本里默认会在/etc/fstab中定义根分区为LVM逻辑卷或者使用UUID方式定位。如果lsblk看不到分区路径,先执行lvdisplay检查是否存在LVM卷组,再用/dev/mapper/卷组名-逻辑卷名的方式挂载。我在通信行业的一台鲲鹏服务器上就遇到过这种情况,LVM卷组名是cl_root,对应的设备是/dev/mapper/cl-root。
3.2 用passwd命令安全重置密码
文件系统正确挂载后,接下来就是修改密码。执行passwd root,系统会提示输入两次新密码。这里有个体验上的小坑:在bash环境里光标可能不闪烁或者退格键失灵,输入密码时看不到任何字符,这是正常的,终端不会回显。输错只能靠盲输,所以要特别小心。
输入新密码时,银河麒麟V10默认开启了密码复杂度检查。如果密码太简单,比如只有六位数字,系统会拒绝更新并提示BAD PASSWORD。为了确保能一次通过,建议新密码至少包含大写字母、小写字母、数字和特殊符号,长度不低于八位。在应急场景下,先设置一个符合策略的临时密码,进去了再改成业务规定的密码,这是正规做法。
另外,如果你是重置普通用户(比如kylin用户)的密码,命令是passwd kylin,不需要先登录root再切换用户,因为这个bash环境本身就有root权限。如果普通用户的密码忘了但root还在,也可以直接在普通系统里执行sudo passwd kylin,不过那种情况就应该先回到日常操作,而不是走到这一步。
3.3 reboot前必须检查的一件事:SELinux标签
这步容易被忽略,却是现实中导致重置后无法正常登录或者重启卡死的头号原因。银河麒麟V10默认启用了SELinux(安全增强型Linux),每个文件都有安全上下文标签。当我们在bash环境里改密码时,新产生的/etc/shadow临时文件可能被分配了错误的SELinux类型,导致系统重启后登录取权限时被拒绝。
处理方式很简单。执行完passwd命令后,在当前环境里执行touch /.autorelabel,这个操作会让系统重启时自动重新标记所有文件的安全上下文。过程可能比较慢,特别是机械硬盘或者文件多的服务器,可能要等待几分钟甚至十几分钟,但这是最稳妥的方案。
还有更精细的做法:只修改/etc/shadow文件的上下文标签,命令是restorecon -v /etc/shadow。这个方式快得多,但如果密码修改过程中还涉及其他文件(比如/etc/passwd),就可能漏掉。我个人的习惯是,除非明确知道只改了shadow文件,否则一律用touch /.autorelabel。反正等待时间换来的是确定性,值。
3.4 结束会话并重启的三种方式
修改完成并确认无误后,需要退出当前环境并重启。在chroot环境下,先执行exit退出chroot,再执行reboot -f强制重启。但注意,如果文件系统尚未正确卸载,直接重启可能损坏数据。最保守的流程:
第一步,exit退出chroot环境,回到initramfs的bash。
第二步,执行sync命令,把内存中的缓存数据刷到磁盘,避免断电或重启导致数据丢失。
第三步,执行reboot -f强制重启。在部分固件版本里,reboot命令可能因为systemd尚未初始化而找不到可用的重启接口,此时可以按机箱的重启键,或者执行echo b > /proc/sysrq-trigger。SysRq方式是内核级的紧急重启,基本不会卡住。
重启后正常进入GRUB,选择默认的内核启动。此时系统会先跑一遍autorelabel(如果之前执行了touch),之后就能看到正常的登录界面。用刚设置的新密码登录,整个流程结束。
4. 进不了GRUB或者分区结构特殊时的备用方案
4.1 用安装光盘的Live模式或rescue模式
单用户模式虽然通用但在两种情况下会失效:一是GRUB引导菜单本身损坏或密码保护被设置了GRUB密码,二是系统压根无法进入引导阶段,比如EFI分区引导文件丢了。这时候需要借助银河麒麟V10的安装镜像ISO,用它的Live模式或者Rescue模式来重置密码。
制作启动U盘的方法在这里不展开,用官方提供的工具或者Rufus即可。从U盘启动后,在安装界面选择“试用”或者“Rescue a broken system”选项。麒麟V10桌面版的Live模式会进入一个完整的桌面环境,打开终端后执行sudo -i可以获取root权限。
在Live环境里,我们需要把硬盘上的根分区挂载到某个目录下。先执行fdisk -l或lsblk找到根分区,然后执行mount /dev/sda3 /mnt。如果系统有独立的/boot分区,还需要执行mount /dev/sda1 /mnt/boot。挂载完成后,用chroot /mnt切换进去,后续步骤和单用户模式完全一样——passwd root改密码,touch /.autorelabel重新标记SELinux,退出后重启。
这里有个细节:Live环境里没有麒麟V10原本的SELinux策略库,直接chroot进去执行passwd虽然能改成功,但SELinux标签同样会错。所以autorelabel在Live模式下比单用户模式更重要,千万别省。
4.2 LVM逻辑卷和磁盘加密的应对策略
银河麒麟V10服务器版默认分区方案里,根文件系统可能使用LVM逻辑卷。在单用户模式下,设备路径通常不是/dev/sda3而是/dev/mapper/centos-root这样的名称。这种环境下,单用户模式的mount -o remount,rw /通常能正常工作,因为rw参数直接作用于已经挂载的根卷。
如果系统使用了LUKS磁盘加密(这种情况在等保三级要求的项目里偶有出现),启动过程中会提示输入加密密码。这个密码通常由管理员或密钥管理员单独保管,和应用密码区分开。如果这个密码也丢了,单用户模式进不去,Live模式也看不到明文数据。这时唯一的出路是找回加密密码或密钥文件。目前的解决方案都是提前备份LUKS头部信息:cryptsetup luksHeaderBackup,否则数据恢复的概率极低。这也是为什么我一直强调:加密盘是密码恢复的最后底线,没有备份就没有第二路。
4.3 使用initramfs内置的rd.break方案
除了init=/bin/bash之外,还有一个更靠近内核的入口叫rd.break。这个参数会中止initramfs的启动过程,停在一个switch_root执行之前的shell里。这个环境比init=/bin/bash更早,磁盘上的根文件系统还没被真正挂载。
在GRUB编辑内核行,把ro改成rw,然后在行尾加上rd.break,启动后会看到提示符。此时根文件系统位于/sysroot目录下。先执行mount -o remount,rw /sysroot,再执行chroot /sysroot,之后就是熟悉的passwd root流程。
这个方案的优势在于,它绕过了可能出问题的systemd和/bin/bash关联性问题,在某些厂商定制过度的内核里,init=/bin/bash偶尔会因为systemd的某些socket文件而卡住,而rd.break从来不会。缺点是多敲几个命令,而且操作路径稍微绕一些。我个人的偏好是,默认先用rd.break,因为它更可控,特别是在我无法确认机器安装了什么样的显示管理器或者PAM配置的情况下。
5. 真实环境中容易踩坑的五个细节
5.1 联想昭阳系列重装系统后屏幕不亮的问题
结合近期很多朋友遇到的情况,联想昭阳4720j这类笔记本在重新安装银河麒麟V10系统后,会出现一个看似无关实则关联的现象:开机进系统时屏幕不亮。第一次遇到的人会以为系统装坏了,其实这是内核显卡驱动和笔记本屏幕面板的兼容性问题。
密码重置过程中如果看到黑屏,不要立刻认定改坏了。先观察键盘指示灯是否有反应,或者等待十几秒看磁盘指示灯是否闪烁。如果系统其实在运行但屏幕无显示,大概率是显卡驱动没有正确加载。
这种情况下,在GRUB编辑界面里找到内核行,在quiet参数后面(或者行尾)加上nomodeset,然后继续启动。nomodeset让内核不做显卡模式设置,使用基本的VESA显示方式,屏幕就能亮起来。这个方法不影响密码重置操作,只是让你能看到界面。
如果nomodeset也不行,检查一下BIOS里的启动模式。部分昭阳机型默认采用UEFI启动,但重新安装系统时如果用了Legacy方式写入引导,会导致屏幕信号输出选择异常。把BIOS启动模式切换成与安装时相同的方式即可。这些都和密码重置本身无关,但现场排查时容易混淆视听,误以为是密码改坏了系统。
5.2 SELinux导致登录异常还是文件系统只读,怎么区分
重置密码后出现“即使密码正确也无法登录”的情况,很多人第一反应是密码没改成功,其实是SELinux标签错误。判断方法很简单,登录界面输错密码和输对密码的报错不一样。如果密码输对了但反复弹回登录框,而且输入时系统有短暂的卡顿,基本可以断定是SELinux问题,至少核心优化是按“标签错误”来处理。
另一种常见状况是在执行passwd时提示无法写/etc/shadow,这通常是因为没有正确把ro改成rw,或者是在initramfs环境下没有挂载真实根分区。看到Read-only file system这个关键字,回到第3.1节检查挂载步骤。不要重复输入命令做无用功,先看mount输出结果。
5.3 密码策略和PAM配置对重置效果的影响
银河麒麟V10的PAM密码策略比标准CentOS严格不少。即使我们在bash环境里用passwd修改密码,系统依然会调用pam_pwquality模块检查密码强度。如果连续多次设置弱密码,可能会出现passwd命令成功退出但实际密码没变的情况,极其迷惑。
为了避免这个问题,设置的密码一定要满足复杂度要求。我的一个实用经验是:密码里不要使用常见的单词变形或键盘顺序组合(比如P@ssw0rd这种早就进了黑名单),也不要使用和系统当前用户名相关的字符串。用一个类似Kylin2024@OPS的随机组合最稳妥。
修改成功后,建议在普通登录界面先用新密码验证一次再交付给用户。有些机器上PAM配置对密码过期时间有要求,比如chage -d 0会让用户首次登录时必须改密码。如果业务不允许,需要顺手执行chage -d 99999 用户名或者手动调整/etc/login.defs里的PASS_MAX_DAYS。
5.4 备份视角:什么样的情况下单用户模式也会失效
不是所有忘记密码的场景都能靠单用户模式解决。最常见反例就是GRUB设置了口令保护。如果有人为了防止别人进入GRUB编辑模式,在/etc/grub.d/里配置了用户名密码,那么按e编辑前系统就会要求输入GRUB管理员口令。这个口令和系统root口令设置时甚至可以不一样,这也正是它坑人的地方。如果GRUB密码也忘了,就没有软件层面的捷径了,只能通过清空BIOS里的启动器配置或者重写引导扇区来绕过,这已经不在密码重置的范围内了。
还有一个场景,是系统文件和内核没有安装在主硬盘上,而是用了两个独立硬盘组合(比如根分区在SATA盘,/boot在NVMe盘),GRUB启动时如果没有加载NVMe驱动,会直接卡住。这种硬件组合方式虽然在普通PC上不多见,但在我处理过的几台国产化台式机上遇到过。处理方法是在GRUB菜单里通过insmod nvme手动加载模块,或者干脆改把/boot放在主硬盘上,从源头上避免组合复杂度。
5.5 无显示器服务器和远程控制台的注意事项
如果你面对的是机房里的服务器,没有接显示器,通过BMC/iDRAC等管理卡的远程KVM操作,需要注意远程控制台在GRUB阶段可能不显示界面。这不是系统问题,而是BMC视频信号初始化的正常现象。
处理方式:在BIOS里把BMC的显示输出配置为“始终开启”或者“主动输出”,不同品牌的叫法不同。如果实在看不到GRUB界面,也没有提前设置,还有一种野蛮但有效的方式:重启两次系统,在两次之间强制断电。Linux在检测到上次启动不正常后,GRUB会自动显示恢复菜单并等待用户操作,这个行为虽然是意料之外的,但确实能在一些情况下帮你拿到编辑入口。
6. 重置密码后的安全性检查与后续建议
密码改完后不是直接交付就算完,为了不再被同样的问题困住,建议做一次基本的检查和加固。
第一,确认新密码不会再次被业务方遗忘。给用户发密码时附带上密码策略说明,并且提醒首次登录后立即修改。如果有条件,配置企业级的统一身份认证(LDAP或AD域),让密码管理集中化,避免每台机器各自维护一套本地口令。
第二,检查/var/log/secure和/var/log/btmp,看看是否有异常登录记录。密码被遗忘的原因除了单纯忘记,也可能是被恶意篡改。如果发现可疑的节点登录痕迹,需要先处理安全事件,再正常使用系统。
第三,有条件的情况下,给root账户配置SSH公钥登录。这样即使密码丢失,依然能通过私钥从运维跳板机进入系统,不需要重启跑单用户模式。公钥登录的私钥要离线备份,放在密码管理器或专用加密存储器里。
第四,对重要的生产服务器,建议定期做一次密码重置演练。这个操作成本很低,但能确保在真出问题时,团队成员知道完整流程,不会在大半夜手忙脚乱乱试命令。我见过不少项目组,平时没人动备份这回事,等出了故障手忙脚乱,所以这份流程文档值得当成运维资产来维护。
银河麒麟V10的密码恢复流程,本质上就是Linux系统下的标准救援流程,掌握了这套方法,不管是操作麒麟V10还是其他主流Linux发行版,都能触类旁通。真正需要警惕的并不是密码忘记本身,而是忘记后不知道该走哪条路,走了路还不知道路上哪里有坑。上面这些坑,我基本都踩过一遍,希望你能直接越过它们,一次搞定。
