这类问题我又碰上了一次。一台 40G 系统盘写满的 CentOS 7,ssh 输完密码有认证成功的日志,随后连接被断开,secure 日志里只有一行提示写 wtmp 失败和 Could not write utmp。
第一反应是「根分区满导致 /var/run 下的临时文件无法创建」,验证下来不成立。
这类报错背后常见的原因有几处,逐个排除就行。wtmp 和 btmp 无法追加,sshd 在会话初始化阶段依赖写记录,失败后退出;PAM 的 pam_lastlog 要读 wtmp,文件损坏或写不进去同样会让会话中止;rsyslog 也写不进去,日志队列在内存里堆积,进一步放大故障现象。
动手时先用不依赖登录的方式确认磁盘状态
df -h / /var && df -i /
释放根分区上可安全清理的内容
journalctl --vacuum-size=200M && du -xsh /var/* | sort -h | tail
修复被写坏的登录记录文件
truncate -s 0 /var/log/wtmp /var/log/btmp && chmod 664 /var/log/wtmp
剩下的就是重启 sshd 重新验证登录
systemctl restart sshd && ssh -v ops@127.0.0.1 true
改完先别撤,确认这几项。df 根分区使用率降到八成以下,wtmp 有新的登录记录写入,ssh 登录后能正常进入 shell 且不会再被立刻断开。
磁盘满时连救援都可能进不去,最好提前配好带外控制台;清空间优先挑日志和缓存,不要动正在被进程写的文件。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
