Linux 根分区占满排查与 SSH 暴力破解日志清理记录

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,btmpsecure 就不会继续暴涨。

这是最直接、最有效的止血方式。


十四、可选:安装 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。
必要时扩容根分区或使用对象存储保存上传文件。
相关推荐
xingfujie1 小时前
第2章:服务器规划与基础环境配置
linux·运维·微服务·云原生·容器·kubernetes·负载均衡
shizhan_cloud1 小时前
华为云核心服务运维知识点与高频实操问题总结
运维·华为云
l1t1 小时前
DeepSeek总结的Quack:DuckDB 客户端-服务器协议(二)
运维·服务器·duckdb
xugyw1 小时前
window获取安全码SHA1、SHA256和jks文件
运维·服务器·安全
杨浦老苏2 小时前
开源服务器监控工具Checkmate
运维·docker·群晖·网站监控
yyyyy_abc2 小时前
docker学习笔记
运维·docker·容器
2301_780789662 小时前
多层级 CC 防护体系:前端验证与后端限流的协同配置实践
运维·服务器·前端·网络安全·智能路由器·状态模式
秋92 小时前
Windows 环境下 Redis 部署详解:从选型、安装到生产级配置与运维
运维·windows·redis
一起逃去看海吧2 小时前
Dify-01-docker安装 和 dify部署
运维·docker·容器