根分区满会导致SSH登录失败、服务崩溃、无法进入终端,常见报错如“Could not chdir to home directory”;需通过救援模式或单用户获取操作环境,用df与du结合定位真实占用,重点排查已删除但未释放的文件、/var/log、Docker、/tmp及缓存目录,并清理后验证空间与inode使用率。

根分区满会导致 SSH 登录失败、系统服务崩溃、甚至无法进入终端,常见报错如 Could not chdir to home directory 或直接卡在登录界面。这不是权限或密码问题,而是空间耗尽引发的连锁故障。排查必须快准稳,不能依赖图形界面或完整 shell 环境。
先绕过登录,获取可操作环境
如果已无法正常 SSH 或本地登录:
- 用带救援模式的 Live CD/USB 启动,挂载原系统根分区(如
mount /dev/sda1 /mnt),然后chroot /mnt - 若服务器支持串口控制台或云平台 VNC 控制台,尝试进入单用户模式:重启时在 GRUB 菜单按
e编辑启动项,在linux行末尾加rd.break(RHEL/CentOS)或init=/bin/bash(Ubuntu/Debian),再按Ctrl+X启动 - 部分云主机(如腾讯云、阿里云)提供“救援模式”或“重装系统但保留数据盘”选项,可临时启用只读挂载进行诊断
定位真实占用来源(避开 du 失效陷阱)
登录后第一件事不是删文件,而是确认空间是否真被文件占满——因为 df -h 和 du -sh / 结果常不一致:
- 运行
df -h /确认根分区使用率(关注Use%和Avail) - 立即执行
du -sh /* 2>/dev/null | sort -hr | head -10查一级目录,重点关注/var、/home、/tmp、/root - 若
du总和远小于df显示已用空间,大概率存在“已删除但进程仍在写”的文件:运行lsof +L1 | grep deleted,输出中会列出被删除却仍占空间的大日志(如/var/log/app.log),对应 PID 需重启或kill -USR1切日志
重点检查高频“空间杀手”目录
这些位置最常导致根分区瞬间打满:
-
/var/log:应用日志、journal 日志堆积。查
journalctl --disk-usage;清旧日志用journalctl --vacuum-size=200M;清普通日志前先logrotate -f /etc/logrotate.conf或手动rm -f /var/log/*.log.* -
/var/lib/docker:Docker 镜像、容器、悬空卷、容器日志。运行
docker system df;清理用docker system prune -a --volumes(谨慎);查大日志:find /var/lib/docker/containers -name '*.log' -size +100M -
/tmp 和 /var/tmp:临时文件未清理,尤其 CUDA、编译缓存、安装包解压残留。直接
rm -rf /tmp/* /var/tmp/*(确保无活跃进程依赖) -
/root/.cache 或 /home/xxx/.cache:conda/pip/npm 缓存动辄数 GB。可安全清空
rm -rf /root/.cache/*或迁移至其他分区
释放空间后的关键收尾动作
删完不等于完事,必须验证并防复发:
- 再次运行
df -h /,确认Avail回升到 5% 以上(至少 1–2 GB) - 检查 inode 是否耗尽:
df -i /,若Use%接近 100%,说明小文件过多,用find / -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -nr找出生成大量小文件的目录 - 临时降低 ext4 保留空间(仅应急):
tune2fs -m 1 /dev/sda1(把 root 保留从默认 5% 改为 1%,立即释放约 4% 空间) - 配置日志轮转、Docker 日志限制(
/etc/docker/daemon.json加"log-driver": "json-file", "log-opts": {"max-size": "10m", "max-file": "3"}),避免重复发生


















