Linux root密码忘了?从GRUB到live CD的密码重置全攻略
发布时间:2026/10/9 12:33:31 锦皓数字建站

晚上十一点测试环境的一台CentOS机器突然联系不上远程排查半天才发现是root密码不知道什么时候被改掉了。这种root密码忘了的突发状况做Linux的人迟早都会撞上一次。很多人第一反应是重装系统其实只要你能接触到机器的控制台Linux密码重置的常规路线就那么几条十几分钟就能把root密码改回来。这篇文章把我这些年亲测有效的重置方法按场景整理出来从最通用的GRUB引导参数方式到单用户模式、live CD救援再到云主机、虚拟机里的特殊处理最后补充MySQL、MariaDB等应用层root密码的重置思路。内容以能直接照做的步骤为主适合刚入行的运维、测试同学也适合自己在家折腾虚拟机时忘了密码的朋友。1. 动手之前先定位机器形态、引导器和加密状态1.1 重置密码的本质拿到一个绕过认证的shellLinux的登录认证最终都由PAM负责root密码的校验依据是/etc/shadow里保存的密码哈希。所谓重置密码本质上就是想办法在系统完全启动之前插入一个不经过登录认证的shell然后把root对应的哈希改掉。整个过程可以拆成三步进入紧急shell、把根文件系统挂载为可写、执行passwd。只要理解了这条主线后面各种方法看起来就不会乱哪怕遇到没见过的发行版也能自己推断出操作方向。1.2 动手前先回答三个问题第一机器是什么形态物理机、VMware/VirtualBox虚拟机、云主机还是容器这决定了你有没有控制台权限以及能不能在引导阶段打断启动流程。第二引导器是GRUB 2还是老版GRUBBIOS还是UEFIGRUB 2通常按e进编辑模式老版本和UEFI下的交互细节略有差别。第三磁盘有没有做LUKS全盘加密如果做了加密并且你连加密盘的passphrase也不知道那问题的性质就完全变了root密码重置帮不上忙得先解决解密密钥的问题。把这三个问题理清楚再对照后面的章节操作基本不会跑偏。1.3 云主机和物理机的控制台差异说明云主机通常有网页VNC控制台部分厂商还直接提供重置root密码的入口这是厂商层面的功能不在本文通用方法的讨论范围。物理机则要注意一个很容易混淆的点BIOS/EFI密码和root密码是两个完全不同的东西。BIOS密码在开机自检阶段拦截root密码在系统起来之后拦截重置root密码并不能解决BIOS密码问题这在机房处理物理机时要先分清楚。2. CentOS/RHEL系最常用GRUB里加rd.break参数2.1 为什么在systemd时代优先选rd.breakCentOS 7/8、Rocky Linux这些基于RHEL的发行版网上提到init/bin/bash的教程很多但我在实际环境里试过这个方法在systemd下有时会翻车根文件系统只读、挂载状态异常甚至启动过程直接卡住。而rd.break是让内核在initramfs阶段停下来在root还没真正切换过去之前给你一个shell环境相对干净。原理上是利用了dracut生成的initramfs自带的调试断点功能比硬塞一个init参数要贴合系统的真实启动流程所以我默认推荐这一条路线。2.2 rd.break完整操作步骤在GRUB菜单界面光标选中要启动的内核行按e进入编辑模式。找到以linux或linux16开头的行一般是linux16 /vmlinuz-... root...这样的格式。在行尾先把rhgb quiet删掉然后追加rd.break。按Ctrl-x或F10启动。系统会在initramfs阶段停下出现一个shell提示符。此时真正的root文件系统挂在/sysroot下先重新挂载为可写mount -o remount,rw /sysroot切换进去chroot /sysroot修改密码passwd root按提示输入两次新密码看到all authentication tokens updated successfully就说明写入成功。如果机器的SELinux处于Enforcing状态在退出前执行touch /.autorelabel退出chroot再退出紧急shellexit exit系统继续启动下次登录用新密码即可。2.3 关键细节为什么先remount、为什么touch autorelabel很多人卡在第一步chroot进去后passwd报错提示只读文件系统。原因就是/sysroot默认是只读的passwd这类写操作必须先让文件系统变成rw状态。至于touch /.autorelabel是因为你在initramfs环境下生成的/etc/shadow等文件带的SELinux安全上下文可能不正确不修正的话重启后SSH登录、部分服务都会出奇怪的问题。autorelabel会让系统在下次启动时对整个文件系统做一次重新打标虽然会多等几分钟但能避免后续一串莫名其妙的安全报错。注意rd.break还可以带更细的断点参数比如rd.breakpre-udev、rd.breakpre-mount分别是在udev启动前、挂载root前停下。常规问题用默认rd.break就够只有遇到硬件驱动加载异常时才需要更早的断点。2.4 连GRUB菜单都进不去怎么办GRUB菜单不一定每次都显示。BIOS机器可以在开机后持续按Shift键调出菜单UEFI机器通常按Esc或某个功能键具体看固件。如果机器被设置成GRUB_TIMEOUT0默认直接进系统可以在开机瞬间连按方向键或Esc碰运气。实在进不去就用后面第4章的live CD方法绕开引导器直接救援。3. Debian/Ubuntu系init/bin/bash与recovery模式3.1 Ubuntu系和RHEL系的差异Debian/Ubuntu的GRUB编辑逻辑类似但内核行通常以linux开头而不是linux16而且不少版本默认带了recovery mode菜单比手动改参数更省事。另外Ubuntu默认不开SELinux用的是AppArmor所以基本不用考虑autorelabel改完密码直接重启就行。3.2 init/bin/bash的完整流程在GRUB菜单选中内核行按e。移动到linux那一行的行尾删掉quiet splash追加init/bin/bash。按Ctrl-x启动会直接进到一个root的bash没有登录提示符。先挂载根文件系统为可写mount -o remount,rw /修改密码passwd root输入exec /sbin/init或exec /sbin/reboot重启。有个小细节如果机器有独立的/boot分区有时候还要先mount /boot再remount /否则设备状态不对。另外新版Ubuntu如果开了Secure Boot改内核参数后可能因为签名校验失败启动不了需要临时在BIOS里关掉Secure Boot重置完再开回来这个属于纯技术配置按机器实际情况处理即可。3.3 recovery模式的偷懒方法如果GRUB菜单里能看到Advanced options for Ubuntu子菜单里面每个内核版本下都有recovery mode。选中进去会出现一个功能菜单选择root / Drop to root shell prompt就直接拿到root shell。然后执行mount -o remount,rw / passwd root这个方法的好处是不用手动改内核参数不容易改错缺点是多点几次菜单。注意recovery模式下根文件系统同样可能是只读的先remount再改密码顺序别反了。3.4 没有图形界面的精简系统怎么处理有些精简安装的Debian/Ubuntu没有标准GRUB菜单黑屏几秒直接进系统。这种环境可能用的是systemd-boot或别的引导器思路是一样的在引导器界面找到启动项追加单用户参数或init/bin/bash。比如systemd-boot通常在启动项界面按e也能编辑参数格式略有不同但打断启动、进入紧急shell、改密码这条主线永远不变。4. 老系统single模式与live CD救援没有GRUB机会时的退路4.1 single模式的适用边界在SysVinit时代也就是CentOS 6、Debian 7及更早的系统给内核追加single或数字1系统会进入单用户模式。这个运行级别只挂载基本文件系统、不启动网络和多用户服务init直接给你一个root shell。操作步骤和前面类似编辑内核行、追加single、启动后mount -o remount,rw /、再passwd。但这套机制在systemd下已经高度边缘化新系统里single模式经常只是把网络关了并不保证给你干净的root环境所以新系统还是优先用rd.break或init/bin/bash老系统再用single。4.2 live CD/USB救援几乎所有场景的最后一招无论GRUB被覆盖、内核参数改坏、还是系统完全起不来只要手头有安装镜像或一个可启动的Linux USB都能用救援方式改密码。本质和chroot一样只是把进入紧急shell换成了用一个正常启动的系统去操作目标磁盘。具体流程用U盘/ISO启动到live环境或者进入安装盘的Rescue模式。用lsblk或fdisk -l查看磁盘布局找到原系统的根分区比如/dev/sda3。挂载根分区mount /dev/sda3 /mnt如果/boot是独立分区也挂上mount /dev/sda1 /mnt/boot绑定虚拟文件系统mount --bind /dev /mnt/dev mount --bind /proc /mnt/proc mount --bind /sys /mnt/sys切换环境chroot /mnt修改密码passwd root退出chroot卸载所有挂载点重启。4.3 卡在挂载哪个分区怎么办实际救援时最容易翻车的就是认错根分区。我自己的习惯是先lsblk -f看文件系统标签和UUID根分区一般会带/或root标识再不济就逐一挂载后用ls判断目录结构——有/etc、/usr、/var这些典型目录的就是根分区。还有一点挂载的根分区如果之前有损坏mount会提示错误这时先fsck修复再挂载不要硬来。5. 特殊场景LUKS加密盘、虚拟机快照与国产系统5.1 LUKS全盘加密root密码和磁盘密码是两道门如果系统盘做了LUKS加密一个容易忽略的事实是你面对的其实有两道密码锁——开机的LUKS口令和登录的root密码。重置root密码的前提是你能先解开第一道锁。GRUB里的rd.break断点发生在initramfs阶段此时加密分区可能还未解锁处于这个shell里手工解锁再挂载属于进阶操作命令不熟很容易卡住。更务实的路线是先正常启动并输入LUKS口令进入系统或者用live CD解开加密分区在已解锁的前提下再去改root密码。如果你的问题恰恰是LUKS口令本身忘了那root密码重置帮不上忙只能靠LUKS备份密钥或recovery key文件恢复。所以我一直建议做了全盘加密的机器一定要把LUKS recovery key单独备份并且和root密码分开保管。5.2 虚拟机快照最快的重置可能不是改密码如果机器是VMware、VirtualBox或KVM上的虚拟机而且之前做过快照那么回滚快照往往比敲一长串命令更快。但这个方案有代价快照之后产生的数据变化会全部丢失。我建议先评估快照时间点和数据丢失的严重程度快照很新、丢得起就直接回滚丢不起则用前面第2、3章的GRUB方法。还有个小提醒VMware的虚拟BIOS密码是另一回事在虚拟机设置里看到启动时进入固件并不等于能改root密码那是BIOS层面的东西别混在一起。5.3 麒麟等国产系统的处理思路用银河麒麟、中标麒麟这类基于RHEL/Debian的国产发行版时root密码重置的核心思路和上游版本一致基于rpm包管理、能用yum/dnf的就走rd.break路线基于deb包管理、能用apt的就走init/bin/bash路线。区别主要在内核参数名和默认安全配置上。两个实操提醒这些系统的GRUB界面可能是中文但按e进去之后的参数格式和标准Linux内核参数完全一样另外部分版本默认隐藏GRUB菜单开机时要按Esc或Shift调出。判断发行版到底基于哪个上游版本比自己记一堆特例更高效。6. 密码改完不等于结束SELinux、SSH限制与账号锁定6.1 验证SELinux状态和autorelabel是否必要在RHEL系上改完密码后第一步确认SELinux模式。用getenforce能看到Enforcing、Permissive、Disabled三种状态。如果是Enforcing并且你刚才在chroot里没有执行touch /.autorelabel建议手动补一次重新打标或者临时切换到Permissive模式跑一遍关键服务否则登录后可能遇到各种诡异的permission denied。我个人习惯是干脆在chroot里touch /.autorelabel一劳永逸代价只是重启时多等几分钟。6.2 检查SSH配置改了密码却登不上很多人改完密码后兴冲冲地ssh登录发现还是被拒绝。此时要分两种情况一是/etc/ssh/sshd_config里设置了PermitRootLogin noroot用户本来就不允许通过SSH登录这是很多Linux服务器出厂的安全默认值二是改密码过程中不小心动了PAM相关文件。第一种情况可以在chroot里临时改成PermitRootLogin yes并重启sshd确认密码可用后再改回更安全的配置。第二种情况更麻烦通常会伴随认证报错需要对照系统的认证日志逐项排查。6.3 检查账号本身有没有被锁定或过期有时候root密码忘的不是密码本身而是账号被锁定或密码过期。passwd -S root可以查看root账号状态如果显示LK标记说明账号被锁了用passwd -u root解锁如果显示密码过期重新passwd设置一次即可。这个细节很多人忽略尤其是交接过的机器前任管理员可能做了安全加固把root密码设置成了立刻过期。6.4 重置过程留下的痕迹日志与时间如果机器是生产环境重置密码这件事本身会留下不少痕迹/var/log/secure下的登录失败记录、grub参数变更、autorelabel触发的文件系统重新打标等。这是好事事后可以反查到底发生了什么。我自己在处理完密码问题后还会顺手检查一下这个时间段内有没有异常的登录尝试确认不是被人改了密码导致的事故。7. 应用层root密码MySQL/MariaDB等场景延伸7.1 MySQL 8.0的root密码重置这里的root是数据库账号不是系统账号重置思路完全不同。以MySQL 8.0为例停止服务systemctl stop mysqld用跳过授权表的方式启动mysqld_safe --skip-grant-tables --skip-networking 加上--skip-networking是为了防止在无认证状态下通过网络连进来安全考虑必须加。 3. 连接mysql -uroot 4. 刷新权限后修改密码FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY 新密码;退出杀掉mysqld_safe进程用正常方式启动mysqld。注意MySQL 8.0不建议直接UPDATE mysql.user表改密码哈希因为默认认证插件是caching_sha2_password手工改哈希容易改出不可用的状态用ALTER USER最稳。7.2 MariaDB的root密码重置和小差别MariaDB步骤类似systemctl stop mariadb之后用mysqld_safe --skip-grant-tables 启动连接后同样可以用ALTER USER但老版本支持UPDATE mysql.user SET PasswordPASSWORD(...)的方式。如果ALTER USER语法报错说明版本较老用UPDATE方式即可改完记得FLUSH PRIVILEGES。这里和MySQL 8.0的差异主要就体现在认证插件和处理方式上原理都是临时跳过授权表改完再恢复。7.3 Artifactory等应用系统的管理员密码重置思路Artifactory这类Java应用没有系统root账号的说法它的管理员密码存在自己的配置文件或内嵌数据库里。处理思路是先找到应用的用户信息存储位置数据库表、配置文件、LDAP配置等再找到官方提供的恢复入口——很多应用会提供初始化/恢复模式或者一个默认的绕过机制最后才是直接操作存储内容。具体命令因版本差异很大建议按对应版本的官方文档操作。我强调这个思路是因为不少人把应用管理员密码和系统root密码混为一谈用系统级的思路去处理应用级账号结果越搞越乱。8. 防遗忘的运维习惯从根上减少这类事故8.1 用团队密码管理而不是个人密码本密码这种东西写在个人文档里等于没写。团队环境建议统一用密码管理工具存root等高权限账号并且每次变更都要留记录。我遇到过最坑的情况是前任管理员把密码放在一个加密压缩包里压缩包密码又写在另一个没人能找到的地方。从那以后我的原则就是密码管理工具的访问权本身就是最高机密root密码可以定期轮换但绝不能只存在于一个人的脑子里。8.2 用sudo授权替代频繁使用root与其天天担心root密码忘了不如从权限设计上减少root的暴露面。日常操作用普通用户加sudo授权只有确有必要才切换到root。这样即使root密码出了问题普通用户依然可以工作排查和重置的窗口期也会更从容。sudo的授权配置保持在visudo里维护不要手动编辑/etc/sudoers格式错了会直接让sudo体系崩溃。8.3 定期巡检密码状态和引导器可用性我建议每季度做一次基础巡检检查root账号状态、密码过期时间、GRUB菜单是否正常显示、有没有设置独立的恢复密钥等。这些检查都不需要花太多时间但能在真正出事的时候帮你省掉半夜加班的痛苦。另外给关键机器做快照或备份也是密码遗忘保险的一部分——很多时候一条回滚命令比读十篇教程都快。最后说一个实际发生在我自己身上的教训有一次我改完密码直接重启结果发现密码里有个字符在键盘布局切换后输入错误白折腾了一次。后来我的习惯是改完密码后不急着重启先在新会话里su -验证一次登录确认没问题再收工。密码这种东西当场验证比事后排查省太多时间。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。