☰
Linux忘记root密码?从GRUB到救援模式的完整重置指南
2026/10/17 17:55:37 网站建设 项目流程

忘了root密码这事儿,谁摊上都头疼。尤其是那种大半年没碰过的测试服务器,或者交接文档里根本没写root密码的旧机器,你坐在终端前面,sudo用不了,su又不知道密码,第一反应往往是“完了,只能重装了”。先别急,Linux从设计上就给你留了本地密码重置通道,只要你能接触到机器的控制台或者虚拟化管理界面,这事儿就还有救。

这篇文章就从实际运维角度,把Linux里最常见、最靠谱的几种重置root密码的路数掰开讲清楚。从原理到底层机制,从GRUB菜单到紧急Shell,从RHEL系到Debian系,我会把每条路径的适用场景、完整步骤和坑点都整理出来。不管你是刚接触Linux的新手,还是被生产环境困住的老手,照着下面这几套逻辑走,基本都能把密码捞回来。

1. 场景复盘与核心原理:为什么忘掉root密码不用重装系统

1.1 密码存在哪里:从 /etc/passwd 到 /etc/shadow

在动手之前,先把基本概念捋清楚,这不只是理论,直接影响后面每一步。

Linux系统中用户账户信息传统上记录在/etc/passwd文件里,早期这个文件第二字段就是用户密码的哈希值。但这样不安全,因为/etc/passwd是所有用户都可读的,于是现代系统把真正存放密码哈希的文件挪到了/etc/shadow,并且把它设置为只有root可读写、部分程序可读。/etc/passwd里的密码字段只留一个x占位,表示“真正的密码在shadow文件里”。

所以root密码的本质是什么呢?就是/etc/shadow中root那一行第二个冒号后面那串哈希字符串。当我们重置密码的时候,本质上就是让系统重新生成一个合法的哈希,替换掉旧的那一串。你可以用passwd命令来做这件事,也可以直接编辑shadow文件来改,但后者风险更大,容易出格式问题。

1.2 重置密码的本质:在特殊环境中修改哈希值

想修改/etc/shadow,必须要有root权限。这就形成了一个死锁:你想改root密码,但改密码需要root身份,而root身份又恰恰被密码锁住了。

破局思路只有一个:绕过正常登录流程,在系统启动早期进入一个特殊环境,在这个环境里直接以root身份操作,或者通过挂载等手法获得对磁盘的读写控制权。GRUB引导菜单就是最常见的“后门入口”。你可以把它理解成:你把钥匙锁屋里了,但窗户没锁,从窗户爬进去把钥匙换了。

进入这个特殊环境的常见路线有三条:

  • 编辑GRUB的启动参数,临时加一个参数让系统进入紧急Shell或单用户模式。
  • 使用系统安装镜像(ISO)启动,进入救援模式。
  • 把硬盘拆下来挂到另一台Linux机器上,修改shadow文件。

这三条路线本质相同,都是想办法在系统正常“门禁”之外,直接获得一个能修改文件的Root Shell。理解了这一点,后面所有的操作都是这个思路的具体落地。

1.3 三条常见重置路径的定位与取舍

不是说哪条路一定最好,而是要看你的具体环境和手头资源。

GRUB参数法依赖你能在开机时看到引导菜单,并且能编辑参数,适合物理机、带控制台的虚拟机、部分云服务器的VNC界面。优点是快,不用准备安装介质;缺点是有一些系统细节需要注意,比如SELinux、只读挂载等。

救援模式法适合你在手头有同版本系统安装镜像的场景,或者你不想碰GRUB、对参数记忆不熟。它启动时会自动检测磁盘并挂载到一个固定目录下,操作直观,容错率高。缺点是得准备ISO镜像或U盘,需要通过某种方式引导它,对云服务器来说就是厂商提供的“救援模式”入口。

离线修改shadow文件法适合前面两种都走不通的情况,比如GRUB彻底坏了、引导记录完全丢失,或者你手头只有另一台正常Linux机器。缺点是需要把硬盘物理拆下来或至少能附加到另一台机器上,在云环境里基本做不到。但作为兜底方案,依然值得掌握。

2. 方法一:GRUB临时参数 rd.break 强制进入紧急Shell

2.1 前置条件与适用系统

这条方法针对的是使用systemd引导的主流RHEL系发行版,比如CentOS 7及以上、Rocky Linux、AlmaLinux、Fedora这些。核心参数就是rd.break,它的意思是“在initramfs阶段中断启动流程,进入一个用于排障的Shell”。

为什么要用这个参数?因为systemd启动流程中,内核先加载initramfs,再由initramfs加载真正的根文件系统并切换过去。如果我们在启动参数里加上rd.break,系统就会在initramfs刚挂载完、还没切到真正根目录之前停下来,给你一个switch_root:/#的提示符。在这个阶段,系统的根目录是一个基于内存的临时文件系统,真正的磁盘根分区会被挂载到/sysroot下面。

所以这条路径非常适合CentOS 7/8/9、Rocky Linux、AlmaLinux等系统。如果你手头是CentOS 6那种老SysV体系,或者Debian/Ubuntu系列,方法要稍微调整,这个后面专门讲。

2.2 五步操作全流程

假设你现在已经站在机器面前,能操作它的显示器和键盘,或者通过VMware/virtualbox控制台、云厂商的VNC窗口看到开机画面。

第一步:开机进入GRUB菜单。如果是多系统,会在列表里看到多个内核版本,随便选一个当前使用的就行,不用纠结。

第二步:在想要启动的内核条目上按e键进入编辑模式。此时你会看到一堆以linux16或linuxefi开头、后面跟着ro crashkernel=auto ...之类的长参数。

第三步:找到以linuxfd16开头的那一行(有的系统是linux或linuxefi),把光标移到该行末尾。在末尾先输入一个空格,然后追加参数:

rd.break

按Ctrl+X或者F10使用修改后的参数启动。系统会走一段正常的启动流程,然后在某个瞬间停下来,进入一个看起来像这样的Shell:

switch_root:/#

第四步:此时执行下面四条命令:

mount -o remount,rw /sysroot chroot /sysroot passwd root

敲完passwd root后,系统会提示你输入新密码并确认,按提示操作。这一步就是最终目的:修改root密码。

第五步:依次执行exit退出chroot环境,再执行一次exit退出临时Shell。系统会继续完成剩余启动流程并进入正常登录界面。此时用新密码登录root即可。

2.3 关键命令逐条拆解:rd.break 为什么能帮你重置密码

先说mount -o remount,rw /sysroot。刚才提到了,在rd.break阶段,/sysroot是只读挂载的。如果你不理解这一点,上来就直接改文件,会碰到 “Read-only file system” 的报错。remount,rw的意思是重新以读写模式挂载这个目录,一步都不能省。

再说chroot /sysroot。在rd.break阶段,当前的根目录/是内存文件系统,里面没有完整的系统目录结构,也没有/etc/shadow。你真正要改的文件在物理硬盘上,现在被挂载在/sysroot。chroot可以把当前Shell的根目录切换到/sysroot,这样你敲passwd root的时候,修改的就是真正的系统账户密码。执行完chroot后,提示符通常会变成类似:

bash-4.2#

这种已经进入真正系统的感觉了。这个命令本质上就是“换了个根”,把自己关进一个能访问真实系统的空间里。

最后是passwd root。这命令会调用系统的密码哈希算法,根据当前系统的/etc/login.defs和PAM配置生成一个新的哈希并写入shadow。在CentOS 7上默认是采用sha512算法,CentOS 9/Rocky 9上默认可能是yescrypt。不管哪种,passwd自己会处理,你不用关心具体哈希长什么样。

2.4 避坑提醒

实际操作中,有几个细节特别容易翻车。

第一个坑:在rd.break里直接敲passwd root却不先remount,系统会卡在只读文件系统上报错,然后你满脑子都是“怎么权限不够”。我见过不少人绕半天,其实问题根本不在于权限,而在于文件系统挂载模式。

第二个坑:执行完passwd之后,如果系统启用了SELinux并且处于Enforcing模式,改完密码后直接重启,有概率出现无法登录的现象。原因是/etc/shadow的安全上下文可能因为直接写入而变了。稳妥的做法是在chroot环境里执行:

touch /.autorelabel

这个命令会让系统在下次启动时自动重新标记所有文件的安全上下文,相当于给SELinux做一次“体检校准”。代价是重启时会多花一些时间,但值得。

第三个坑:有些新版本系统的GRUB界面不再叫linux16,而是叫linux或linuxefi。不管叫什么,你只要找那个以vmlinuz开头、后面跟着一大堆内核参数的大长行就行。

第四个坑:如果你是在云服务器的网页控制台VNC里操作,键盘映射可能不对,输命令时经常把符号敲错。这时候要么切换输入法/键盘布局,要么耐心一点,一次敲完再检查。

3. 方法二:安装镜像救援模式(Rescue Mode)兜底

3.1 什么时候需要这款“坦克”

GRUB参数法虽然速度快,但有个前提:你还能看到GRUB菜单,而且系统内核能正常加载。假如你连GRUB都坏了,或者引导直接丢到了Shell,这时候再用rd.break就无从谈起了。还有一个典型场景是:pattern机本身是LUKS全盘加密,你即使在GRUB里加了rd.break,也未必能顺利进入,因为加密分区还没解锁。这时候安装镜像的救援模式就派上用场了。

救援模式相当于用一张“外置系统”启动机器,然后让这个外置系统识别你的硬盘、挂载原有的Linux分区,并把你放进一个Root Shell。这就像你进不了自己的房子,但有一颗钥匙是专门开备用锁的。

3.2 完整实操步骤

拿一张跟现有系统同版本或更高版本的系统安装镜像(比如RHEL、Rocky、CentOS的ISO),把它写到U盘,或者通过虚拟机挂载的方式让机器从ISO启动。如果是云服务器,很多厂商的“救援模式”本质就是干这个的,你只需要在控制台里选择进入救援系统,它会自动用一个最小化的系统帮你挂载原来的数据盘。

开机后从安装介质启动,你会看到安装引导界面。注意别选直接安装,而是找到类似Troubleshooting(故障排除)这样的入口,进入之后选择Rescue a CentOS system或Rescue installed system,名称因发行版而异。

系统会问你几个基础问题,比如语言、键盘布局,选择默认或中文都行。接着它会扫描磁盘,找到已经安装的Linux。这里通常会出现一个选择界面:

1) Continue 继续,并将原系统挂载到 /mnt/sysimage 2) Read-Only 只读挂载 3) Skip 跳过

选1,Continue。系统会自动把找到的根分区挂载到/mnt/sysimage下。挂载完成后你会进入一个Shell,这时依次执行:

chroot /mnt/sysimage passwd root exit reboot

跟前面一样,passwd root就是重置密码的核心操作。因为有chroot,操作的是原系统环境。执行完exit退出chroot,然后输入exit退出救援模式并重启。重启时记得把ISO摘掉,从硬盘启动,然后用新密码登录。

3.3 没有安装镜像时的离线修改方案

如果你手头没有安装镜像,但能把硬盘拆下来、接到另一台运行着相同或相近版本Linux的机器上,也可以离线修改。

先把原硬盘接好,用lsblk查看分区情况,找到根分区,假设它显示为/dev/sdb2。然后挂载它:

mkdir -p /mnt/root mount /dev/sdb2 /mnt/root

挂载完成后,建议用chroot方式重置密码,这样可以调用原系统里的passwd和PAM库,保证哈希算法兼容:

mount -t proc proc /mnt/root/proc mount -t sysfs sys /mnt/root/sys mount --rbind /dev /mnt/root/dev chroot /mnt/root /bin/bash passwd root exit

这里的proc、sys、dev挂载是为了让chroot环境里的程序能正常工作,尤其是某些服务和管理命令。如果你只是改密码,不做更多操作,其实可以直接用编辑器改shadow文件,但我不推荐。原因很简单:不同发行版、不同版本默认使用的密码哈希算法不一样,你手工生成一个哈希还好说,如果格式不对,或者算法不被系统PAM识别,改完反而更麻烦。用passwd命令最保险。

4. 方法三:单用户模式(single)与 Debian/Ubuntu 变体

4.1 经典 single 模式路径

在RHEL 7之前的SysV时代,单用户模式/sbin/sulogin或者直接在GRUB内核参数里加single,进入的就是一个Root Shell,非常干脆。

现在虽然很多系统转向systemd,但single参数依然有效。在GRUB编辑界面,找到linux那一行,在末尾加上single,然后按Ctrl+X启动。

进入之后,有些系统的根文件系统依然是只读的,所以先执行:

mount -o remount,rw / passwd root

如果已经可写,直接passwd root就行。这种情况下改完密码后,执行reboot重启。

这个方法相比rd.break,进入的系统阶段更靠后一些,也就是说已经加载了initramfs、挂载了真正的根文件系统。好处是环境更接近完整系统,坏处是如果系统本身有某种启动故障导致正常启动卡住,那single也可能进不去。rd.break发生在initramfs更早期,这根“救命稻草”往往更稳。

4.2 Ubuntu/Debian 的 init=/bin/bash 方案

Ubuntu和Debian系列的GRUB参数与RHEL系略有不同,在它们上面最经典的做法是修改启动参数,让内核直接用/bin/bash作为init程序。

具体步骤:开机进入GRUB菜单,按e进入编辑。找到以linux开头的那一行,这一行的末尾通常是:

ro quiet splash

把ro改成rw,然后在行尾追加:

init=/bin/bash

修改后的行大概长这样:

linux /boot/vmlinuz-... ro quiet splash init=/bin/bash

按Ctrl+X启动后,系统不会走正常引导流程,而是直接给你一个root Shell。因为已经改成rw,根文件系统默认可写,所以直接执行:

passwd root

输完密码后重启即可:

exec /sbin/init

或直接reboot。这个方案在Ubuntu 18.04、20.04、22.04上都很常见,也适用于Debian系。要注意的一点是:如果Ubuntu启用了SELinux(默认没有)或者别的新安全机制,可能需要额外处理,但一般情况下不需要。

4.3 注意事项:为什么改完还要处理 SELinux relabel

前文已经提过SELinux,这里再系统地说一下。RHEL系、Fedora、Rocky、Alma这些系统默认是开启SELinux的。SELinux会给每个文件打一个安全上下文标签,/etc/shadow有它自己的标签,正常情况下是system_u:object_r:shadow_t:s0。

如果你在rd.break或者救援模式中直接修改shadow,有可能会破坏标签的一致性。虽然大多数时候passwd命令会正确更新文件内容,不会影响标签,但为了稳妥起见,执行一次touch /.autorelabel是成本极低、收益很高的操作。每次开机时如果存在/autorelabel文件,系统会启动自动重标记流程,整个流程可能耗时几分钟到十几分钟,取决于磁盘里的文件数量。

如果你关闭了SELinux,或者系统本身没启用SELinux,那就不需要这一步。Debian/Ubuntu默认用的AppArmor机制和SELinux不同,处理逻辑也不一样,一般不需要做类似操作。

5. 系统差异对照与方法选型建议

5.1 各发行版推荐重置路径速查表

从实际应用的覆盖面来看,不同系统的推荐路径可以整理成下面这张表,方便你到时候翻出来照着选。

系统类型代表发行版推荐方法关键步骤
RHEL系(Systemd)CentOS 7/8/9、Rocky、AlmaLinux、FedoraGRUB加rd.breakremount rw → chroot /sysroot → passwd root → touch /.autorelabel
Debian系Ubuntu、DebianGRUB改rw init=/bin/bash直接passwd root → 重启
老SysV系统CentOS 6、RHEL 6GRUB加singleremount rw → passwd root → 重启
全盘加密(LUKS)任意发行版安装镜像救援模式解锁加密分区后再chroot/改shadow
云服务器阿里云、腾讯云、华为云等控制台救援模式或VNC参考对应厂商救援文档,本质是Rescue模式
WSL环境Windows Subsystem for Linux不适用常规方法直接通过宿主侧wsl -u root处理

第6行的WSL特殊说明一下:WSL不是传统虚拟机,它没有GRUB,也不能用安装镜像引导。如果你在WSL里忘了root密码,可以在Windows终端执行wsl -u root直接以root身份进入,然后passwd重置。这也是很多开发者的一个扫盲点,因为它会用另一套逻辑运转。

5.2 全盘加密、云服务器等特殊场景的额外提醒

如果你使用了LUKS加密,情况会稍微复杂一点。系统启动时通常会要求你输入密码来解锁根分区,这个密码跟root登录密码是两回事。忘掉root密码还能用上面的办法,但忘掉LUKS解锁密码才是真正的灾难。如果你没忘LUKS密码,只是忘了root密码,那条路也不复杂:在GRUB里加rd.break后会进入一个Shell,此时加密分区已经解锁挂载到/sysroot,你只需要继续执行mount -o remount,rw /sysroot和chroot /sysroot等命令。如果你是在救援模式下,系统检测到LUKS分区后会自动询问LUKS密码,输进去即可正常挂载。

云服务器方面,如果厂商提供了VNC界面,你可以像操作物理机一样进GRUB菜单来用rd.break方法。但有些厂商的GRUB菜单为了加快启动速度会设置超时时间极短,甚至直接跳过,此时你需要在开机画面时狂按方向键把它唤出来。如果实在唤不出GRUB,那就走厂商的救援模式,这通常是最省心的。

还有一个很多人忽略的办法:如果你在系统内部还有一个拥有sudo权限的普通用户,那根本不用去搞GRUB,直接:

sudo passwd root

这行命令同样可以重置root密码。所以平时在每个重要机器上保留一个带sudo权限的普通用户,是非常好的运维习惯。

6. 常见问题与排查技巧实录

6.1 问题速查表

下面这些问题是实际操作中反复出现的典型问题,我直接整理成排查表。

现象常见原因排查与解决
passwd报错 “authentication token lockout”root目录所在文件系统未以读写方式挂载执行mount -o remount,rw /sysroot后再试
文件系统提示 “Read-only file system”根分区挂载为只读模式检查当前挂载状态,使用remount rw重新挂载
chroot /sysroot失败,提示权限不足/sysroot未挂载或当前环境不对先执行ls /sysroot确认可看到etc、usr等目录
重启后卡在SELinux相关界面或无法登录没有执行touch /.autorelabel回到重置环境,创建autorelabel标记,重启等它完成重标记
改完密码后提示 “invalid or corrupt shadow file”手工编辑shadow文件时哈希格式错误尽量用passwd而不是手动改;如果已改坏,从备份恢复shadow文件
救援模式找不到原系统的根分区磁盘驱动未加载或分区加密用lsblk、blkid查看设备,LUKS卷用cryptsetup luksOpen解锁
GRUB菜单里键盘失灵按不动USB键盘驱动在早期未加载尝试换PS/2键盘,或使用救援模式替代
重启后启动停在dracut/initramfs提示符根分区无法挂载或引导参数写错检查GRUB参数,确认root指向正确分区,必要时进救援模式修复

6.2 两个实战细节经验

第一个细节:动手修改之前,先把/etc/shadow备份一份。进入Shell后,马上执行:

cp /etc/shadow /etc/shadow.bak

这样就算改出问题,还能通过临时环境把备份恢复回去,不至于变成锁死状态。我见过太多人一进去就急着改密码,结果因为shadow文件不小心被写坏,导致整个系统直接无法登录,最后只能花更大代价去处理。备份就是一条命。

第二个细节:重置完密码后,不要把GRUB里临时加的启动参数保存到配置文件里。正常来说,e编辑后启动的参数是一次性的,重启后自动恢复。但如果你不小心按了Ctrl+O保存,或者在某些图形版GRUB菜单里选择了“保存修改”,这些临时参数就可能被写进grub配置文件,导致每次开机都启动到紧急模式。如果真的保存了,进系统后用grub2-mkconfig -o /boot/grub2/grub.cfg重新生成一下配置,或者直接手动编辑/etc/default/grub删掉多余参数。

第三个细节:如果机器启用了云监控或自动化配置工具(比如一些自动化运维工具、配置管理平台),你手动改完root密码后,它可能会在下次巡检时把密码又改回去。这不是玄学,而是配置漂移。所以重置密码后,如果有自动化工具在管理这台机器,最好同步更新密码配置,否则你刚改完没几分钟,工具又给你拉回旧状态。

这些方法都是Linux自带的能力,流程不复杂,但每一步都要清楚自己在干什么。把原理理顺了,操作就会稳很多。我自己平时最常用的还是rd.break那条链路,稳定、不用准备额外介质,只要能在GRUB界面动手就够。不过也踩过几次坑,第一次忘了remount rw,直接passwd报错,当时还误以为是系统权限坏了,后来才反应过来是只读挂载的事。现在我的习惯是:进入shell后第一件事先用ls /sysroot确认目录结构没问题,再执行remount和chroot,最后才轮到改密码。另外,如果你接手的是别人管理过的机器,改完密码后最好再看看有没有可用的sudo用户,顺手把机器纳入统一的账户密码管理,别让root又变成“只能靠重置才能进”的状态。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询