十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

忘记 Linux root 密码别慌!一文搞懂单用户救援:CentOS/Rocky/Ubuntu 全覆盖,3 种方案原理 + 步骤 + 避坑

忘记 Linux root 密码别慌!一文搞懂单用户救援:CentOS/Rocky/Ubuntu 全覆盖,3 种方案原理 + 步骤 + 避坑 忘记 root 密码服务器就进不去了其实只要物理接触机器就能通过 GRUB 进入单用户模式直接重置密码。本文整理 3 种经过验证的方案init/bin/sh、rw single init/bin/bash、rd.break讲清每一步背后的原理覆盖CentOS 7 / RHEL 8-9 / Rocky / Alma / Ubuntu / Debian等主流发行版的差异并给出 SELinux、GRUB 加密等高频避坑点收藏备用。一、原理速览为什么单用户模式能绕过密码Linux 开机流程是BIOS → GRUB → 内核 → init 进程。GRUB 是启动引导菜单在这里按e编辑启动参数、追加initxxx就能让内核不再启动正常的 init/systemd而是直接启动一个指定的 shell——这个环境里没有登录验证、没有权限校验passwd改密码畅通无阻。启动参数用法速查表启动参数作用说明init/bin/shinit指定 1 号进程让内核用/bin/sh代替正常的 init 进程直接进 shellinit/bin/bash同上指定用 bash比 sh 功能更全支持方向键、Tab 补全rwreawrite可写方式挂载根分区直接以读写挂载省去后面 remount 一步roreadonly只读挂载不写rw时根分区默认只读single单用户模式等价于运行级别 1只启动最基本的系统环境Debian/Ubuntu 下会要 root 密码见第六章rd.breakrdinitramfs 阶段中断在内核交接真实根分区之前停下落入 initramfs 的 shellCentOS 7 官方推荐记忆点三个方案的本质都是在 GRUB 里改内核启动参数区别只在停下的时机和拿到的 shell不同。二、方案一追加init/bin/shCentOS 7 通用1. 进入 GRUB 编辑界面启动系统在开机选择界面把光标停留在第一项按e进入编辑界面。CentOS Linux (XXX) (Core) CentOS Linux (XXX) (Core) Use ... Press e to edit... -- 屏幕出现这个提示时就可以按 e 了2. 修改启动参数在编辑界面移动光标找到以linux16开头的那一行linux16表示以 16 位模式加载内核UEFI 机器上这一行叫linuxefi在行尾追加init/bin/sh注意追加在linux16这一行行尾中间用空格隔开不要改到其他行。3. 进入单用户模式按Ctrl X启动进入单用户模式。4. 重新挂载根分区为可写# 单用户模式下根分区默认只读必须先改成可写mount-oremount,rw /[!note]为什么默认只读因为不写rw参数时内核以只读方式挂载根分区——这是正常启动的保守做法启动过程中做 fsck 检查更安全。不重新挂载为可写passwd写不了/etc/shadow改密码会失败。5. 修改密码# 直接修改 root 密码按提示输入两次新密码passwd6. 处理 SELinux关键不能跳# 创建 SELinux 自动打标签标记文件touch/.autorelabel若系统开启了 SELinuxpasswd直接改写了/etc/shadow绕过了 SELinux 的安全上下文管理文件标签会不对。touch /.autorelabel让 SELinux 在下次启动时全盘重新打标签放行本次修改。[!warning]跳过这一步重启后可能因为 SELinux 策略阻止而依然无法登录——密码明明改成功了却登不上是最常见的翻车点。7. 重启# 用 init 进程替换当前 shell走正常关机流程exec/sbin/init为什么不直接敲reboot此时的 shell 本身就是 1 号进程init/bin/sh没有真正的 init 在背后调度reboot可能卡住不动。exec用当前 shell替换自己为/sbin/init让系统走正常初始化流程重启。重启完成后即可用新密码登录。三、方案二追加rw single init/bin/bash1. 进入 GRUB 编辑界面重启系统在开机界面出现时按e键进入编辑界面。2. 修改启动参数按方向键↓找到设置语言的地方例如LANGen_US.UTF-8在其后追加rw single init/bin/bash然后按Ctrl X重启系统。[!note]三个参数一次带齐rw直接可写挂载无需再执行mount -o remount,rw /single单用户模式init/bin/bash指定用 bash比方案一的 sh 好用。3. 修改密码进入 bash 界面后直接执行# 根分区已是可写直接改密码passwd4. 处理 SELinux# 同方案一必须打标签否则改了也登不上touch/.autorelabel5. 重启系统# 替换为 init 走正常流程重启exec/sbin/init6. 再次重启可选安全起见用新密码进入系统后可再执行一次reboot完整重启一次确保 SELinux relabel 已完成重打标签过程可能较慢第一次登录等待属于正常现象。四、方案三rd.breakCentOS 7 官方推荐前两种方案改的是真实根分区启动后的 shellrd.break则是在内核还没交接真实根分区时initramfs 阶段就中断这是 CentOS 7 官方文档推荐的救援方式优点是不依赖系统盘上的 shell 是否完好。1. 进入 GRUB 编辑界面并追加参数开机按e同样找到linux16开头的行在行尾追加rd.break按Ctrl X启动。2. 重挂载 sysroot 并切换根此时会落入 initramfs 的 shell真实根分区以只读方式挂在/sysroot下# 把真实根分区/sysroot改成可写mount-oremount,rw /sysroot# 切换根目录到真实系统chroot/sysroot3. 修改密码并处理 SELinux# 已 chroot 进真实系统直接改密码passwd# SELinux 标记三种方案里这步一个都不能少touch/.autorelabel4. 退出并重启# 退出 chroot 环境exit# 退出 initramfs shell系统继续正常启动exit两次exit后系统会自动继续启动流程relabel 过程较慢耐心等待完成后用新密码登录即可。[!note]rd.break方案还有一个额外好处如果在第 2 步chroot之前执行load_policy -i和setenforce 0可以跳过 relabel但对新手来说touch /.autorelabel是最稳妥的通用做法。五、三种方案横向对比项目方案一init/bin/sh方案二rw single init/bin/bash方案三rd.break修改位置linux16行尾追加LANGxxx后追加linux16行尾追加停下的时机内核启动后替换 init内核启动后单用户模式initramfs 阶段最早期进入的 shellshbash更好用initramfs 的 sh需 chroot真实根分区路径///sysroot是否需重挂可写需要mount -o remount,rw /不需要参数已带rw需要且对象是/sysroot是否需 chroot不需要不需要需要chroot /sysrootSELinux 处理touch /.autorelabeltouch /.autorelabeltouch /.autorelabel重启方式exec /sbin/initexec /sbin/init两次exit自动续启推荐场景通用想要 bash 环境更顺手系统盘 shell 异常 / 官方推荐记忆口诀改密三步走——进 GRUB 追参数 → 挂可写改密码 → SELinux 打标签。三套方案只是在哪个阶段停、在哪个目录下干活的区别。六、其他常见发行版怎么救前面章节以 CentOS 7 为例思路在任何 Linux 上都通用GRUB 改内核参数但内核行名称、initramfs 实现、是否用 SELinux三点差异决定了具体写法。先看差异速查表发行版差异速查表发行版GRUB 里的内核行rd.break可用SELinux 重打标签推荐方案RHEL 7 / CentOS 7linux16/linuxefi✅dracut✅ 必须方案一/二/三均可RHEL 8/9、CentOS 8/Stream、Rocky、Almalinux/linuxefi✅dracut✅ 必须方案三rd.breakFedoralinux/linuxefi✅dracut✅ 必须方案三rd.breakDebian / Ubuntulinux❌initramfs-tools非 dracut❌ 无 SELinuxinit/bin/bash记忆点红帽系含 Fedora都用 dracut 生成 initramfs所以rd.break全系可用Debian/Ubuntu 用 initramfs-tools没有rd.break参数只能走init/bin/bash。RHEL 8/9 系CentOS 8/Stream、Rocky、Alma、Fedora与 CentOS 7几乎完全一样只有两处小改动内核行从linux16变成了linuxUEFI 下仍是linuxefi参数照样追加在行尾SELinux 处理一模一样touch /.autorelabel依然不能少。直接套用方案三rd.break即可步骤原样照做。Ubuntu / Debian用init/bin/bashUbuntu 的 GRUB 菜单按e后找到以linux开头的行行尾通常已有ro quiet splash在其后追加init/bin/bash按Ctrl X启动后# 根分区默认只读先改成可写mount-oremount,rw /# 直接改密码Ubuntu 没有 SELinux改完无需 /.autorelabelpasswd# 替换为 init 正常重启exec/sbin/init[!warning]为什么 Ubuntu 不推荐追加singleDebian 系的 systemd 会把single映射到rescue.target而 rescue 模式要求输入 root 密码才能继续——你就是因为忘了密码才来的这条路走不通。这是 Debian 系和红帽系最大的行为差异记住直接用init/bin/bash就不会踩坑。[!note]Ubuntu 桌面版还有条捷径GRUB 菜单里自带Advanced options → (recovery mode)选中后进入恢复菜单选root即可直接拿 root shell适合不想手敲参数的场景但服务器版/自定义安装的 GRUB 不一定有这个入口手敲参数的方法永远可用。通用避坑各发行版都适用LUKS 磁盘加密如果装机时启用了全盘加密GRUB 之后要先输磁盘加密口令才能继续引导——加密口令忘了任何软件手段都救不了只能重装务必与 root 密码分开保管。键盘布局init/bin/bash阶段键盘映射可能不完整尤其非美式布局密码里少用y/z互换、特殊符号这类容易错位的字符改完登录成功后再passwd改成正式密码。云服务器没有物理控制台上述操作要走厂商提供的VNC 控制台部分云厂商还有重置密码后台按钮优先用它更省事。改完记得恢复如果是临时改了 GRUB 参数rw、init等它们只对本次启动生效不会写进配置重启自动还原但grub2-setpassword这类加固配置是永久的要记进密码管理工具。七、避坑与加固GRUB 加密风险本质单用户模式可以绕过所有权限校验任何人物理接触服务器就能改 root 密码。所以救援方法同时也是安全隐患——生产环境必须做两道锁BIOS 口令防止直接改启动顺序、从 U 盘引导其他系统GRUB 口令防止按e编辑启动参数也就是本文所有方案的前置条件。设置 GRUB2 加密口令# 交互式设置 GRUB 用户口令输入两次grub2-setpassword# 重新生成 GRUB 配置使口令生效grub2-mkconfig-o/boot/grub2/grub.cfg设置后开机菜单默认不再出现Press e to edit提示需按e时会先要求输入 GRUB 用户名root和口令编辑功能只留给知道口令的人。[!warning]GRUB 口令一旦遗忘救援会变得麻烦需要引导盘 / LiveCD请务必把口令记录在安全的密码管理工具中不要随手贴在服务器上。总结忘记 root 密码的本质GRUB 阶段改内核启动参数跳过登录验证直接拿 shell三种方案对应三个介入时机init/bin/sh替换 init、rw single init/bin/bash单用户可写一步到位、rd.breakinitramfs 最早阶段官方推荐共同的三要素根分区可写 passwd改密 touch /.autorelabel少一步都可能前功尽弃——但/.autorelabel只在 SELinux 系统红帽系/Fedora需要Ubuntu/Debian 改完即走发行版记忆点红帽系找linux16/linux行都能用rd.breakDebian/Ubuntu 找linux行只能用init/bin/bash别追single能救密码的通道也是漏洞生产环境记得上BIOS GRUB2 双重口令。如果这篇帮到了你点赞、收藏、评论三连支持一下也欢迎评论区交流你踩过的救援坑
返回列表