Linux 根分区占满排查与 SSH 暴力破解日志清理记录
一、问题背景
服务器执行 df -H 后发现根分区已经满了:
bash
[root@VM-4-6-centos ~]# df -H
文件系统 容量 已用 可用 已用% 挂载点
/dev/vda1 85G 81G 0 100% /
/dev/vdb 53G 38G 13G 76% /data2
其中关键问题是:
bash
/dev/vda1 85G 81G 0 100% /
说明根分区 / 已经 100% 占满,可用空间为 0。
这类问题会导致很多异常,例如:
text
无法上传文件
无法解压文件
应用写日志失败
MySQL / Nginx / Java 服务异常
yum / dnf 安装失败
临时文件创建失败
之前解压 dist.zip 时报错:
bash
End-of-central-directory signature not found
这个错误可能是压缩包本身损坏,也可能是磁盘满了导致上传或写入不完整。
二、初步查看各目录占用
先查看根目录下各一级目录大小:
bash
du -h --max-depth=1 / | sort -hr
输出类似:
bash
111G /
53G /home
35G /data2
19G /var
3.1G /usr
447M /root
303M /boot
202M /etc
34M /tmp
这里需要注意:
/data2 是单独挂载的数据盘,但执行 du / 时也会被统计进去,所以 / 显示 111G 并不代表根分区实际用了 111G。
更准确地查看根分区自身占用,建议加 -x,避免跨文件系统统计:
bash
du -x -h --max-depth=1 / | sort -hr
三、定位主要占用目录
继续查看 /home 和 /var:
bash
du -h --max-depth=1 /home | sort -hr
du -h --max-depth=1 /var | sort -hr
输出:
bash
53G /home/ruoyi
53G /home
198M /home/backend
102M /home/selectAccountBackend
11M /home/www
9.4M /home/selectAccountFront
5.4M /home/app
bash
19G /var
14G /var/log
4.2G /var/lib
444M /var/www
107M /var/cache
88M /var/crash
此时可以判断主要占用来自:
text
/home/ruoyi
/var/log
四、继续排查 /home/ruoyi
查看 /home/ruoyi 目录:
bash
du -h --max-depth=1 /home/ruoyi | sort -hr
结果:
bash
53G /home/ruoyi
52G /home/ruoyi/upload
40M /home/ruoyi/web
21M /home/ruoyi/logs
4.0K /home/ruoyi/sqlbackup
说明 /home/ruoyi/upload 占用了 52G,是根分区占满的最大原因。
继续查看大文件:
bash
find /home/ruoyi -type f -size +500M -exec ls -lh {} \; 2>/dev/null
没有查出超过 500M 的单个文件。
再查看前 30 个大文件:
bash
find /home/ruoyi -type f -exec du -h {} + 2>/dev/null | sort -hr | head -30
结果发现,大部分是 9M 左右的图片文件,例如:
bash
9.9M /home/ruoyi/upload/upload/2026/03/IMG_5179_20260331203232A863.webp
9.9M /home/ruoyi/upload/upload/2026/03/IMG_0038_20260320213042A986.webp
9.8M /home/ruoyi/upload/upload/2026/04/IMG_4244_20260405195724A366.webp
结论:
text
不是单个大文件导致磁盘满,而是大量上传图片累计占用了 52G。
五、排查 /var/log 日志目录
查看 /var/log:
bash
du -h --max-depth=1 /var/log | sort -hr
初始结果:
bash
14G /var/log
4.0G /var/log/journal
1.8G /var/log/nginx
132M /var/log/mysql
40M /var/log/audit
34M /var/log/sssd
其中 /var/log/journal 是 systemd journal 日志。
可以使用下面命令清理,只保留指定大小:
bash
journalctl --vacuum-size=500M
清理后:
bash
11G /var/log
1.8G /var/log/nginx
497M /var/log/journal
132M /var/log/mysql
40M /var/log/audit
34M /var/log/sssd
journal 日志从 4G 降到了约 500M,说明清理成功。
六、为什么 /var/log 总大小和子目录加起来不一致?
执行:
bash
du -h --max-depth=1 /var/log | sort -hr
这个命令只会展示 /var/log 的总大小,以及 /var/log 下一级子目录大小。
但是 /var/log 目录下面直接存放的普通文件不会逐个显示出来,例如:
text
/var/log/btmp
/var/log/secure
/var/log/messages
/var/log/cron
/var/log/wtmp
因此会出现:
bash
11G /var/log
1.8G /var/log/nginx
497M /var/log/journal
132M /var/log/mysql
子目录加起来明显不到 11G。
要查看普通文件,需要加 -a:
bash
du -ah --max-depth=1 /var/log | sort -hr | head -50
排查结果:
bash
11G /var/log
4.2G /var/log/btmp
3.7G /var/log/secure
1.8G /var/log/nginx
497M /var/log/journal
132M /var/log/mysql
128M /var/log/btmp-20241001
40M /var/log/audit
34M /var/log/sssd
16M /var/log/messages
5.6M /var/log/cron
这就解释了为什么 /var/log 总大小为 11G。
真正的大文件是:
bash
4.2G /var/log/btmp
3.7G /var/log/secure
七、btmp 和 secure 是什么?
1. /var/log/btmp
/var/log/btmp 记录失败登录信息。
比如:
text
SSH 密码输错
root 登录失败
被暴力破解扫描
不存在的用户尝试登录
可以使用下面命令查看失败登录记录:
bash
lastb | head -50
实际输出:
bash
lt ssh:notty 174.138.16.244 Thu May 14 23:52 - 23:52 (00:00)
root ssh:notty 222.89.169.98 Thu May 14 23:51 - 23:51 (00:00)
root ssh:notty 49.232.193.149 Thu May 14 23:50 - 23:50 (00:00)
test ssh:notty 45.148.10.116 Thu May 14 23:47 - 23:47 (00:00)
nagios ssh:notty 178.20.210.186 Thu May 14 23:43 - 23:43 (00:00)
lxh ssh:notty 174.138.16.244 Thu May 14 23:42 - 23:42 (00:00)
可以看出,有大量 IP 正在尝试登录:
text
root
test
nagios
lxh
lt
这就是典型的 SSH 暴力破解扫描。
2. /var/log/secure
/var/log/secure 记录安全认证相关日志,包括:
text
SSH 登录成功 / 失败
sudo 操作
认证失败
权限相关记录
可以查看最近日志:
bash
tail -100 /var/log/secure
secure 文件很大,通常也和 SSH 暴力破解有关。
八、清理日志释放空间
这些日志属于历史记录,不是业务数据,可以清理。
推荐使用 truncate 清空,而不是直接 rm 删除。
bash
truncate -s 0 /var/log/btmp
truncate -s 0 /var/log/secure
rm -f /var/log/btmp-20241001
如果 nginx 日志也比较大,可以清空当前日志:
bash
truncate -s 0 /var/log/nginx/access.log
truncate -s 0 /var/log/nginx/error.log
清理 journal:
bash
journalctl --vacuum-size=500M
清理后查看空间:
bash
du -ah --max-depth=1 /var/log | sort -hr | head -50
df -H
九、根因分析
这次磁盘占满主要有两个原因。
1. 业务上传文件过多
bash
52G /home/ruoyi/upload
这里是最大占用,主要是大量上传图片文件累计导致。
如果这些文件是业务数据,不能直接删除,否则可能导致前端图片访问 404。
处理方式包括:
text
迁移到数据盘
迁移到对象存储,例如 COS / OSS
定期清理过期文件
增加上传文件压缩逻辑
扩容根分区
2. SSH 暴力破解导致日志暴涨
bash
4.2G /var/log/btmp
3.7G /var/log/secure
从 lastb 结果看,服务器公网 SSH 正在被大量扫描和尝试登录。
如果不加固,清理完日志后还会继续增长。
十、处理 /home/ruoyi/upload 的建议
方案一:按月份查看占用
bash
du -h --max-depth=2 /home/ruoyi/upload/upload | sort -hr | head -50
如果确认某些历史月份文件不再需要,可以删除。
例如查看 2025 年文件:
bash
du -h --max-depth=2 /home/ruoyi/upload/upload/2025 | sort -hr
确认后删除:
bash
rm -rf /home/ruoyi/upload/upload/2025
方案二:删除超过指定天数的旧文件
先查看 60 天以前的文件:
bash
find /home/ruoyi/upload/upload -type f -mtime +60 -exec ls -lh {} \;
确认无误后删除:
bash
find /home/ruoyi/upload/upload -type f -mtime +60 -delete
注意:这个命令会真实删除文件,执行前必须确认业务允许。
方案三:迁移 upload 到数据盘
如果 /data2 空间足够,可以迁移上传目录。
创建目录:
bash
mkdir -p /data2/ruoyi
停止应用:
bash
ps -ef | grep ruoyi-admin.jar | grep -v grep
pkill -f ruoyi-admin.jar
迁移:
bash
mv /home/ruoyi/upload /data2/ruoyi/upload
建立软链接:
bash
ln -s /data2/ruoyi/upload /home/ruoyi/upload
确认:
bash
ls -l /home/ruoyi
应该看到:
bash
upload -> /data2/ruoyi/upload
然后重新启动应用。
注意:本次 /data2 只有 13G 可用,而 upload 有 52G,因此不能直接整体迁移,除非先清理或扩容 /data2。
十一、SSH 安全加固建议
1. 查看当前 SSH 配置
bash
grep -E "^(Port|PermitRootLogin|PasswordAuthentication)" /etc/ssh/sshd_config
如果没有输出,说明很多配置仍是默认值。
2. 建议修改 SSH 配置
编辑:
bash
vi /etc/ssh/sshd_config
建议配置:
conf
Port 22222
PermitRootLogin no
PasswordAuthentication no
含义:
text
Port 22222 修改 SSH 默认端口
PermitRootLogin no 禁止 root 远程登录
PasswordAuthentication no 禁止密码登录,只允许密钥登录
注意:关闭密码登录前,必须先确认 SSH 密钥可以正常登录,否则可能把自己锁在服务器外面。
十二、稳妥的 SSH 加固流程
第一步:创建普通用户
bash
useradd admin
passwd admin
usermod -aG wheel admin
测试 sudo:
bash
su - admin
sudo whoami
如果输出:
bash
root
说明普通用户具备 sudo 权限。
第二步:配置密钥登录
本地生成密钥:
bash
ssh-keygen -t ed25519 -C "your_email@example.com"
服务器上配置公钥:
bash
mkdir -p /home/admin/.ssh
chmod 700 /home/admin/.ssh
vi /home/admin/.ssh/authorized_keys
chmod 600 /home/admin/.ssh/authorized_keys
chown -R admin:admin /home/admin/.ssh
第三步:新开终端测试登录
不要关闭当前 root 连接。
新开一个终端测试:
bash
ssh -p 22222 admin@服务器IP
确认能登录后,再关闭密码登录和 root 登录。
第四步:重启 sshd
bash
systemctl restart sshd
十三、云服务器安全组限制
如果服务器是腾讯云、阿里云等云服务器,最推荐在安全组中限制 SSH 来源。
例如只允许自己的公网 IP 访问:
text
协议:TCP
端口:22 或 22222
来源:你的公网 IP/32
这样外部扫描器根本连不到 SSH,btmp 和 secure 就不会继续暴涨。
这是最直接、最有效的止血方式。
十四、可选:安装 fail2ban
fail2ban 可以自动封禁多次登录失败的 IP。
CentOS / RHEL 系:
bash
yum install -y epel-release
yum install -y fail2ban
systemctl enable fail2ban
systemctl start fail2ban
查看状态:
bash
systemctl status fail2ban
不过从根本上讲,更推荐:
text
安全组限制来源 IP
使用 SSH 密钥登录
禁止 root 登录
关闭密码登录
修改默认 SSH 端口
十五、本次常用命令汇总
查看磁盘空间
bash
df -H
查看目录大小
bash
du -h --max-depth=1 / | sort -hr
du -x -h --max-depth=1 / | sort -hr
查看 /home 占用
bash
du -h --max-depth=1 /home | sort -hr
du -h --max-depth=1 /home/ruoyi | sort -hr
查找大文件
bash
find /home/ruoyi -type f -size +500M -exec ls -lh {} \; 2>/dev/null
find /home/ruoyi -type f -exec du -h {} + 2>/dev/null | sort -hr | head -30
查看日志大小
bash
du -h --max-depth=1 /var/log | sort -hr
du -ah --max-depth=1 /var/log | sort -hr | head -50
查看失败登录
bash
lastb | head -50
清理日志
bash
truncate -s 0 /var/log/btmp
truncate -s 0 /var/log/secure
rm -f /var/log/btmp-20241001
journalctl --vacuum-size=500M
清理 nginx 日志
bash
truncate -s 0 /var/log/nginx/access.log
truncate -s 0 /var/log/nginx/error.log
检查是否有删除后仍被占用的文件
bash
lsof | grep deleted | head -50
十六、最终结论
本次根分区 100% 的主要原因是:
text
1. /home/ruoyi/upload 占用 52G,大量业务上传图片累计导致。
2. /var/log 占用 11G,其中 /var/log/btmp 和 /var/log/secure 占用接近 8G。
3. btmp 和 secure 暴涨的原因是服务器 SSH 暴露在公网后,被大量暴力破解扫描。
短期处理:
text
清理 btmp、secure、journal、nginx 日志,快速释放空间。
长期处理:
text
迁移或清理 /home/ruoyi/upload。
对 SSH 做安全加固。
在云服务器安全组限制 SSH 来源 IP。
必要时扩容根分区或使用对象存储保存上传文件。