先看结论
- 在
rd.break紧急模式重置root密码后,必须处理 SELinux 标签。 - 最稳妥做法是在
chroot /sysroot后执行touch /.autorelabel。 - 如果漏掉这一步,常见现象是“
passwd root已执行成功,但系统正常启动后仍无法登录”。
适用范围
- 虚拟化平台:PVE(Proxmox VE)
- 客体系统:Rocky Linux 9.x(默认 SELinux 开启)
- 场景:忘记
root密码,且有控制台权限(PVE Console / VNC / iKVM)
为什么会“改了密码还是登不进”
Rocky Linux 9 默认是 SELinux=enforcing。
你在 rd.break 环境里改的是离线根文件系统(/sysroot)。如果只改了密码,不触发重标记,/etc/shadow 等关键文件可能带着不正确的安全上下文。
这会让 login / sshd / pam 在认证时被 SELinux 拦截,最终表现为登录失败。
touch /.autorelabel 的作用是告诉系统“下次启动做一次全盘 SELinux relabel”。
关键细节
touch /.autorelabel要在chroot /sysroot之后执行。
否则你写到的是临时救援环境,不是目标系统根目录。
操作前准备(建议不要省)
- 给虚机做快照(可回滚)。
- 确认你有控制台权限,不要只依赖 SSH。
- 预留维护窗口。首次 relabel 可能明显变慢(磁盘越大越久)。
标准恢复流程(推荐)
步骤 1:进入 rd.break
- 重启虚机并进入 GRUB。
- 选当前内核,按
e编辑启动参数。 - 找到
linux或linuxefi那一行,在行末加rd.break。 - 按
Ctrl + x启动。
步骤 2:在紧急环境里重置 root 密码并设置 relabel
mount -o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel
exit
exit
命令解释:
mount -o remount,rw /sysroot:把目标根分区改为可写。chroot /sysroot:切换到目标系统根目录上下文。passwd root:重置 root 密码。touch /.autorelabel:标记下次启动执行 SELinux 全盘重标记。
步骤 3:等待系统完成首次启动
执行两次 exit 后系统会继续启动。
如果 relabel 被触发,首次启动时间会比平时长,这是正常现象。
常见失败分支与补救
分支 A:已经改过密码,但还是无法登录
多数是遗漏 /.autorelabel,按下面补救:
mount -o remount,rw /sysroot
chroot /sysroot
restorecon -v /etc/passwd /etc/shadow /etc/group /etc/gshadow
touch /.autorelabel
exit
exit
分支 B:提示 root 被锁定
mount -o remount,rw /sysroot
chroot /sysroot
passwd -u root
touch /.autorelabel
exit
exit
分支 C:命令执行失败(只读文件系统)
先确认你已成功执行:
mount -o remount,rw /sysroot
再继续:
chroot /sysroot
验证清单(建议逐项做)
- 控制台登录验证
- 在 PVE Console 使用新 root 密码登录。
- SSH 登录验证(如果你启用了 SSH)
- 再测一遍远程登录,确认
sshd认证链路正常。
- SELinux 状态确认
sestatus
若显示 enforcing 且认证正常,说明修复生效。
- 可选:抽查关键文件上下文
ls -Z /etc/passwd /etc/shadow /etc/group /etc/gshadow
回滚方案
如果你在恢复过程中出现新的异常(比如系统无法正常启动或认证链路异常),直接回滚到维护前快照,再重新按本文流程执行。
常见坑位
- 在
chroot /sysroot之前就执行touch /.autorelabel。 - 忘了
mount -o remount,rw /sysroot,导致修改没落盘。 - 只做
passwd root,没做 relabel。 - 只测 SSH,不测控制台,导致误判问题未修复。
一段可直接复用的最小命令块
mount -o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel
exit
exit
这套命令是“重置 root 密码 + 避免 SELinux 上下文坑”的最小闭环。