先看结论

  • 在 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 之后执行。
否则你写到的是临时救援环境,不是目标系统根目录。

操作前准备(建议不要省)

  1. 给虚机做快照(可回滚)。
  2. 确认你有控制台权限,不要只依赖 SSH。
  3. 预留维护窗口。首次 relabel 可能明显变慢(磁盘越大越久)。

标准恢复流程(推荐)

步骤 1:进入 rd.break

  1. 重启虚机并进入 GRUB。
  2. 选当前内核,按 e 编辑启动参数。
  3. 找到 linux 或 linuxefi 那一行,在行末加 rd.break。
  4. 按 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

验证清单(建议逐项做)

  1. 控制台登录验证
  • 在 PVE Console 使用新 root 密码登录。
  1. SSH 登录验证(如果你启用了 SSH)
  • 再测一遍远程登录,确认 sshd 认证链路正常。
  1. SELinux 状态确认
sestatus

若显示 enforcing 且认证正常,说明修复生效。

  1. 可选:抽查关键文件上下文
ls -Z /etc/passwd /etc/shadow /etc/group /etc/gshadow

回滚方案

如果你在恢复过程中出现新的异常(比如系统无法正常启动或认证链路异常),直接回滚到维护前快照,再重新按本文流程执行。

常见坑位

  1. 在 chroot /sysroot 之前就执行 touch /.autorelabel。
  2. 忘了 mount -o remount,rw /sysroot,导致修改没落盘。
  3. 只做 passwd root,没做 relabel。
  4. 只测 SSH,不测控制台,导致误判问题未修复。

一段可直接复用的最小命令块

mount -o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel
exit
exit

这套命令是“重置 root 密码 + 避免 SELinux 上下文坑”的最小闭环。