1. 首页 > 服务器系统 > Linux

Linux系统root密码忘记怎么办?能不能重置或者破解?

在Linux系统运维过程中,忘记root密码是常见但不必惊慌的问题。即使完全丢失了root密码,仍然可以通过系统启动时的内核参数调用来重置或破解密码。核心原理是在系统进入完全启动状态前,通过rd.break内核参数或init=/bin/bash进入一个临时的、具有修改权限的环境,从而绕过原系统对root密码的保护机制。本文将详细介绍两种成熟可靠的方案,并补充相关的技术原理、注意事项及未来趋势。

方法一:使用rd.break破解root密码

技术原理:rd.break 是Red Hat/CentOS系列系统中systemd提供的一个内核调试参数,它会在早期引导阶段(ramdisk加载完成后)暂停系统启动,进入一个基于内存文件系统的紧急救援shell。此时系统的根文件系统尚未挂载,需要手动挂载并进行修改。

详细操作步骤

  1. 启动系统并进入编辑模式
    开机后,在GRUB引导菜单界面(通常显示有Linux内核版本列表),使用上下箭头选择要启动的内核条目,然后按下键盘上的 e 键进入编辑模式。

    小技巧:如果GRUB菜单默认隐藏,可以在开机时快速按 Esc 或 Shift 键让它显示出来。

  2. 定位并修改内核参数行
    在编辑界面中,找到以 linux 或 linux16(旧版系统)开头的行——这一行定义了内核的加载参数。使用方向键移动到该行末尾。

  3. 添加rd.break参数
    在行末尾添加一个空格后输入 rd.break,如果需要完全绕过SELinux(避免后续重标耗时),也可以同时添加 selinux=0。
    修改后的示例
    linux16 /vmlinuz-... root=UUID=... ro rd.break selinux=0

  4. 启动临时环境
    编辑完成后,按 Ctrl+X(某些系统可能是 F10)开始以修改后的参数启动系统。

  1. 进入RAM Disk环境后的观察
    系统会进入一个基于内存文件系统的简单shell提示符(通常显示为 switch_root:/#)。此时执行 ls / 会发现内容与正常Linux根目录完全不同,因为当前环境是运行在内存中的临时系统,看不到原本硬盘上的 /home、/etc 等目录
ls
mount
  1. 重新挂载系统根目录
    原本硬盘上的Linux根文件系统此时挂载在 /sysroot 目录下,并且是只读状态(ro)。需要重新以读写模式挂载:
    bash mount -o remount, rw /sysroot
    或者先检查挂载状态:mount | grep sysroot

知识点补充:/sysroot 是dracut(initramfs生成工具)默认使用的硬盘根文件系统挂载点。不同发行版可能略有差异,但CentOS/RHEL/Fedora系列均遵循此规则。

  1. 切换到真实的系统环境
    执行 chroot /sysroot 将当前shell的根目录切换为硬盘上的真实Linux系统。chroot(Change Root)命令会改变进程对文件系统根目录的认知,此后执行的所有命令都将基于 /sysroot 作为新的 /。

  2. 处理SELinux重标问题(关键步骤)
    由于SELinux会为每个文件和进程标记安全上下文,直接修改密码可能导致上下文不一致,从而造成系统启动后无法正常登录。解决方案有两种:
    - 自动重标(推荐首次使用):在 chroot 环境下创建 /autorelabel 文件
    bash touch /.autorelabel
    系统下次启动时会对整个文件系统进行SELinux上下文重新标记。注意:此过程会导致首次重启时间较长(5-20分钟不等,取决于磁盘大小和文件数量)。
    - 临时禁用SELinux(适合调试或懒得等待):编辑 /etc/selinux/config 文件,将 SELINUX=enforcing 改为 SELINUX=disabled。

  3. 修改root密码
    执行经典的 passwd 命令,按提示输入两次新密码(注意:输入时屏幕不会显示任何字符,是正常的安全机制)。

  4. 清理并退出
    执行以下命令安全退出:
    bash exit # 退出chroot环境 reboot # 重启系统
    或者使用 reboot -f 强制重启。

使用的命令及详细解析

mount -o rw,remount /sysroot/                # 重新挂载文件系统,并将其设置为可写
chroot /sysroot/                             # 切换系统根目录
echo "123456" | passwd --stdin root          # 为root用户更改密码为123456
touch /.autorelabel                          # 对于开启selinux的可能需要执行touch /.autorelabel命令,这个是触发系统在下次启动时重新标记selinux安全上下文的命令。这个不执行可能会导致密码修改/重置失效,或在重启系统的时候提示密码错误。
exit
reboot                                       # 重新启动

SELinux相关注意事项

此方法修改密码后,如果创建了 /.autorelabel 文件,系统启动时间会明显延长——这是因为SELinux会递归扫描并重新标记整个文件系统的安全上下文。以下是SELinux的处理对比:

处理方式优点缺点适用场景
创建 /.autorelabel保持SELinux启用,安全性高首次重启慢(5-20分钟)生产环境、需保持安全合规的服务器
临时禁用SELinux重启快,操作简单降低系统安全性测试环境、个人虚拟机、应急恢复
手动修复上下文精确控制,无额外重启操作复杂,需知道具体上下文规则高级用户

禁用SELinux的方法(如需快速重启):

# 在chroot环境下执行
vi /etc/selinux/config
# 将 SELINUX=enforcing 改为 SELINUX=disabled
# 保存后退出,即可跳过重标步骤直接重启
vi /etc/selinux/config

SELINUX=disable

方法二:使用bash破解密码

技术原理:通过 init=/bin/bash 内核参数,系统会直接以bash作为首个进程(PID 1)启动,跳过所有正常的系统初始化服务。这会进入一个没有用户认证、没有网络服务、仅有基本命令的单用户shell环境。

详细操作步骤

  1. 进入GRUB编辑界面(步骤同方法一的第1步)

  2. 修改内核参数
    在 linux 开头的行末尾添加 init=/bin/bash,注意等号两边不要有空格。
    修改后示例
    linux16 /vmlinuz-... root=UUID=... ro init=/bin/bash

  3. 启动进入bash环境
    按 Ctrl+X 启动,系统会直接进入bash提示符(通常为 bash-5.0#)。此时注意:根文件系统以只读方式挂载

  1. 重新挂载根文件系统为读写
    bash mount -o remount, rw /

    与方法一不同,这里的根目录就是实际的 /,无需chroot操作。

  2. 修改root密码
    直接执行 passwd root 设置新密码。

  3. 同步数据并强制重启
    为了确保密码写入磁盘,先执行 sync 命令,然后使用 exec /sbin/reboot -f 强制重启。注意:由于init环境不完整,普通的 reboot 命令可能无法正常工作。

mount -o rw,remount /                     # 重新挂载文件系统,并将其设置为可写
echo "123" | passwd --stdin root          # 为root用户更改密码为123
touch /.autorelabel                       # 对于开启selinux的可能需要执行touch /.autorelabel命令,这个是触发系统在下次启动时重新标记selinux安全上下文的命令。这个不执行可能会导致密码修改/重置失效,或在重启系统的时候提示密码错误。
reboot                                    # 重新启动

重启后的验证与可能问题

重启后使用新密码登录root账户进行测试。常见问题与解决
- SELinux导致的登录失败:如果重启后密码正确但无法登录(反复停留在登录界面),说明SELinux上下文冲突。解决方法:再次进入救援模式(可用方法一)并执行 touch /.autorelabel 或禁用SELinux。
- 键盘布局异常:紧急shell环境下可能不支持非英语键盘布局,建议密码使用纯数字/字母。
- 磁盘完整性检查:强制重启可能导致文件系统脏标志,下次启动可能会自动触发 fsck 检查,属正常现象。

两种方法对比与选型建议

对比维度rd.break方法init=/bin/bash方法
适用系统RHEL/CentOS/Fedora(systemd主导的系统)几乎所有Linux发行版(包括Debian/Ubuntu)
操作复杂度较复杂(需要chroot、处理SELinux)简单(直接remount即可)
SELinux兼容原生支持重标或禁用选项易触发SELinux冲突,需额外处理
环境完整性保留了大量救援工具(如lvm、mdadm)仅有bash内置命令,外部工具有限
风险等级较低,有完善的重标机制中等,强制重启可能造成数据丢失
推荐场景生产环境、启用了SELinux的服务器个人电脑、测试虚拟机、老旧系统

专家建议与安全提示

  1. 备份重要数据:任何对系统引导参数的修改都存在潜在风险,尤其是生产环境操作前务必有近期备份。
  2. 防止物理入侵:上述方法要求攻击者能物理接触服务器或获得控制台访问权限。远程是无法通过此方法破解密码的。因此建议:
    - 对服务器机房进行严格访问控制
    - 开启BIOS/UEFI密码并禁用USB启动
    - 对GRUB菜单设置密码保护(grub2-setpassword)
  3. 日志审计:成功重置密码后,系统日志(/var/log/secure 或 journalctl)中会留下记录,定期审计可发现异常访问。
  4. 密钥认证替代密码:对于远程SSH访问,建议配置SSH密钥对登录并禁用密码认证,既安全又无需记忆复杂密码。

注意事项

  • 🔴 方法一(rd.break)仅适用于使用systemd和dracut的发行版(RHEL 7+、CentOS 7+、Fedora)。对于Debian/Ubuntu,应使用方法二或 rw init=/bin/bash。
  • 🔴 如果系统启用了全盘加密(LUKS),需先解密才能进行上述操作,操作步骤会更复杂。
  • 🔴 使用 init=/bin/bash 后,某些系统可能需要先挂载 /proc 和 /sys 才能正常使用 reboot 命令:
    bash mount -t proc proc /proc mount -t sysfs sys /sys
  • 🔴 修改密码后如果重启卡住或出现内核恐慌,可以尝试使用Live CD/USB启动后挂载硬盘手动修复。

未来趋势与替代方案

随着Linux系统安全性的提升,传统的"破解"方法正在逐渐受限:
- UEFI安全启动(Secure Boot):部分启用了完整安全链的发行版会拒绝启动被篡改的内核参数。解决方法是在BIOS中信任自定义签名或暂时关闭安全启动。
- 全盘加密普及:更多服务器和个人电脑采用LUKS全盘加密,若没有解密密钥,上述方法完全无效。建议企业部署TPM芯片实现自动解密。
- 网络认证集成:大型环境可通过LDAP/FreeIPA集中认证,本地root密码不再是唯一入口。
- 带外管理(iDRAC/iLO):现代数据中心通过带外管理卡提供远程控制台,无需物理接触即可实现系统恢复,但这类通道也应严格保护。

建议运维人员:与其依赖忘记密码后的补救,不如事前采取以下措施:
1. 定期更换密码并存档至密码管理器
2. 配置sudo并保留至少一个其他可sudo的普通用户
3. 使用单点登录(SSO)或公钥认证
4. 为关键系统部署带外管理卡(iDRAC/iLO/IPMI)

重启后测试更改的密码成功!以上方法在实际运维中经过反复验证,建议先在虚拟机中练习熟练后再用于生产环境。

本文由主机测评网发布,不代表主机测评网立场,转载联系作者并注明出处:https:///linux/9558.html

联系我们

在线咨询:点击这里给我发消息

Q Q:2220678578