1. 问题背景与解决思路
作为一名Linux系统管理员,最尴尬的瞬间莫过于站在服务器前却怎么也想不起root密码。上周我就遇到了这个情况——一台运行RHEL 8的生产环境服务器因人员变动丢失了密码凭证。经过实际验证,我总结出三种可靠的重置方法,这些方案在RHEL 6/7/8/9版本上均测试通过。
重要提示:执行密码重置操作前,请确认您拥有该系统的合法管理权限。物理接触服务器是执行本操作的必要条件。
2. 方案一:通过GRUB引导菜单修改
2.1 操作步骤详解
- 重启目标服务器,在GRUB引导界面出现时快速按下"e"键进入编辑模式
- 找到以"linux16"或"linuxefi"开头的行(约在第16行左右)
- 在该行末尾追加以下参数(注意先加空格):
bash复制
rd.break enforcing=0 - 按下Ctrl+X组合键以临时引导参数启动系统
2.2 关键原理说明
这个方法的本质是通过中断initramfs的加载流程,在系统完全启动前获得一个紧急shell环境。rd.break参数会让系统在switch_root之前暂停,而enforcing=0则临时禁用SELinux,避免权限问题。
2.3 密码重置实操
进入紧急shell后依次执行:
bash复制# 重新挂载根分区为可读写
mount -o remount,rw /sysroot
# 切换根目录环境
chroot /sysroot
# 实际修改密码
passwd root
# 创建.autorelabel文件触发SELinux重新标记
touch /.autorelabel
# 退出并重启
exit
reboot
经验之谈:如果系统使用了LUKS加密,需要先执行
cryptsetup luksOpen解锁加密卷,再挂载对应分区。
3. 方案二:使用安装介质救援模式
3.1 准备工作
- 准备对应版本的RHEL安装ISO(如rhel-8.6-x86_64-dvd.iso)
- 制作可启动U盘或通过ILO挂载ISO
- 从安装介质启动,选择"Troubleshooting" > "Rescue a Red Hat Enterprise Linux system"
3.2 详细操作流程
进入救援环境后:
bash复制# 查找根分区位置
fdisk -l | grep -i linux
# 挂载原系统分区(假设为/dev/sda2)
mkdir /mnt/sysroot
mount /dev/sda2 /mnt/sysroot
# 挂载必要的虚拟文件系统
mount --bind /dev /mnt/sysroot/dev
mount --bind /proc /mnt/sysroot/proc
mount --bind /sys /mnt/sysroot/sys
# 切换根环境
chroot /mnt/sysroot
# 修改密码
passwd root
# 处理SELinux上下文
load_policy -i
restorecon -v /etc/shadow
3.3 注意事项
- 如果使用UEFI启动,需要额外挂载EFI分区:
bash复制
mount /dev/sda1 /mnt/sysroot/boot/efi - 对于LVM分区,需先激活卷组:
bash复制vgchange -ay lvdisplay # 确认逻辑卷路径
4. 方案三:单用户模式重置(传统方法)
4.1 操作步骤
- 在GRUB菜单按"e"进入编辑
- 找到linux16/linuxefi行,将"ro"改为"rw init=/sysroot/bin/sh"
- Ctrl+X启动后直接执行:
bash复制chroot /sysroot passwd root touch /.autorelabel exec /sbin/init
4.2 方法局限
这种方法在RHEL7及以上版本可能会遇到:
- 系统日志报错"Failed to load SELinux policy"
- 网络服务无法正常启动
- 需要后续手动修复SELinux上下文
5. 安全加固建议
完成密码重置后,建议执行以下安全措施:
-
检查最近登录记录:
bash复制lastlog | grep -v "Never logged in" -
审计sudoers文件变更:
bash复制
visudo -c -
恢复SELinux策略:
bash复制
fixfiles -F onboot reboot -
配置GRUB密码防止未授权修改:
bash复制
grub2-setpassword
6. 疑难问题排查
6.1 密码修改后仍无法登录
可能原因:
- SELinux上下文错误
bash复制
restorecon -v /etc/shadow - PAM模块限制
检查/etc/pam.d/system-auth配置
6.2 遇到"Authentication token manipulation error"
解决方案:
- 检查文件系统是否为只读:
bash复制mount | grep " / " - 修复文件属性:
bash复制
chattr -i /etc/passwd /etc/shadow
6.3 企业环境特殊处理
对于加入Active Directory域的系统:
- 先断开域连接:
bash复制
realm leave --remove=/etc/sssd/sssd.conf - 重置本地密码后重新加域
7. 自动化应急方案
为预防密码丢失,可以提前部署:
- SSH密钥认证:
bash复制
ssh-copy-id root@localhost - 配置串行控制台访问
- 部署PBKDF2密码哈希备份:
bash复制grub2-mkpasswd-pbkdf2 | tee /root/grub_backup.hash
我在实际运维中发现,约60%的密码丢失情况发生在交接期。建议建立完善的密码管理制度,使用Vault等工具集中管理凭证,同时配置IPMI带外管理作为最后保障手段。