Linux服务器硬盘满了别急着重装或扩容,先用df -h和du -sh逐层定位大文件,优先清理可回收日志和缓存,多数情况能省下一笔扩容费用。
这台跑了两年的轻量应用服务器,系统盘只有40G,昨天下午Nginx突然开始报502,SSH登录后第一眼看到的就是根分区使用率98%,下面把整个处理过程拆成可复用的命令和判断顺序。
Linux磁盘空间满了怎么清理?先定位大文件再动手
很多人一看到磁盘满了就习惯性删文件,结果删了一堆小文件,根分区还是99%,问题不在删得多不多,在于有没有找对地方。
第一步:用df -h确认哪个挂载点满了
登录服务器后先别急着敲删除命令,先看清楚是哪个分区满了:
df -h
输出里重点看Mounted on和Use%两列,常见的是根分区使用率接近100%,也有可能是/home独立分区满了、/var独立分区满了,还有可能是/boot满了导致内核更新失败,挂载点不同,处理路径完全不一样,比如根分区满了不能只盯着/var看,还要查/home、/opt、/tmp和Docker数据目录。
第二步:用du命令逐层排查大目录
从根目录开始看一级目录占用:
du -sh / 2>/dev/null | sort -rh | head -20
这条命令会按大小倒序显示根目录下一级目录的占用,找到最大的那个目录,比如/var占了28G,就继续往下钻:
du -sh /var/ 2>/dev/null | sort -rh | head -20
再定位到/var/log占15G,就继续看/var/log下的具体文件,逐层排查比随机乱翻高效得多,也更容易发现真正的空间黑洞。
第三步:常见可直接清理的安全目标
定位到大目录后,下面这些目录多数情况下可以优先处理:
/tmp和/var/tmp:临时文件,重启后一般不会影响业务,但服务器长期不重启会积累大量残留。/var/cache/apt/archives:Debian/Ubuntu系包管理缓存,清理后不影响已安装软件。/var/cache/yum:CentOS/RHEL系包管理缓存,同理安全。/var/log/journal:systemd日志二进制文件,体积可能非常夸张,可以按时间或大小清理。/root/.cache和部分用户目录下的.cache:应用缓存,需要确认后再清。
注意/var/lib、/etc、/usr、/bin、/sbin这些目录不要为了腾空间直接删除文件,删错一个可能导致系统起不来或服务异常。
Linux服务器硬盘满了如何处理:日志文件清理实操
日志文件是Linux服务器磁盘占满最常见的原因之一,尤其是跑了一两年的Nginx、MySQL、Java应用,日志体积经常比项目代码大几十倍。
系统日志清理命令
systemd的journal日志有时候比普通文本日志还要占空间,先看看它到底占了多少:
journalctl --disk-usage
如果显示几个G甚至十几G,可以按保留时间清理,比如只保留最近3天:
journalctl --vacuum-time=3d
也可以按大小限制,比如最多保留500M:
journalctl --vacuum-size=500M
对于普通文本日志,比如/var/log/syslog、/var/log/messages,先看文件大小:
ls -lh /var/log/syslog /var/log/messages
确认没有排查需求后,可以用find按修改时间批量删除30天前的日志:
find /var/log -type f -name ".log" -mtime +30 -delete
但-delete前建议先去掉-delete跑一遍,看看匹配到哪些文件,避免误删正在写入的日志。
应用日志与历史文件处理
Nginx的access.log和error.log是重点怀疑对象,如果日志文件正在被进程写入,直接用rm删除文件不会立即释放空间,因为进程还持有文件句柄,更安全的方式是清空而不是删除:
> /var/log/nginx/access.log
这条命令会把文件内容清空,但保留文件inode,进程可以继续写,不会造成日志丢失或服务异常,对于MySQL慢查询日志、Redis日志、Java应用日志,也推荐用同样的方式处理。
如果日志必须保留一段时间,可以配置logrotate按天切割并压缩,后面在长期预防部分会讲到具体做法。
清理后记得释放被删除文件占用的空间
有时候你会发现,明明删了很大的日志文件,df -h显示空间却没变化,这种情况多数是因为进程还占用着已经删除的文件,可以用下面的命令排查:
lsof | grep deleted
输出里会列出被进程打开但已经标记为deleted的文件,找到对应进程后,重启该服务或者让进程重新读取文件,空间才会真正释放,最常见的是忘记重启Nginx或Java应用,导致删除文件后空间依然被占用。
Linux根分区满了怎么办?var和home目录分别排查
根分区满了的时候,有两个目录最容易藏着大文件又容易被忽略:/var和/home,处理思路不一样,要分开看。
var目录满了怎么清理:哪些能删哪些不能删
/var目录结构复杂,安全清理的前提是搞清楚每个子目录的用途:
| 路径 | 可否清理 | 风险说明 | |
|---|---|---|---|
/var/log |
系统及应用日志 | 可清理旧日志,保留近期 | 误删当前日志会丢失排查线索 |
/var/cache |
包管理缓存、应用缓存 | 可以清理 | 部分应用缓存清理后会重新生成 |
/var/tmp |
临时文件 | 可以清理 | 个别服务可能依赖临时会话 |
/var/lib |
数据库、容器、软件状态数据 | 不可直接删除 | 删除会导致数据丢失或服务无法启动 |
/var/spool |
邮件队列、打印队列、cron任务 | 谨慎处理 | 业务积压邮件可能仍需投递 |
/var/www |
网站代码 | 不可随意删除 | 删除等于删站 |
在/var下清理时,先跑du -sh /var/ 2>/dev/null | sort -rh | head -10看大头,如果/var/lib占大量空间,往往不是日志问题,而是数据库、Docker镜像或容器卷数据,那需要进入对应应用层面清理,而不是直接删文件,业内专家指出,盲目删除/var下的文件是生产环境事故的常见诱因之一。
home目录空间不足常见于备份和上传文件
/home目录主要存放用户数据和上传文件,如果网站支持上传附件、图片或者有备份脚本把压缩包丢在/home下,几个月不清理就会塞满,查找大文件可以用:
find /home -type f -size +500M -exec ls -lh {} ; 2>/dev/null
这条命令会列出/home下所有大于500M的文件,再进一步查看哪些文件很久没被访问过:
find /home -type f -atime +180 -size +200M -exec ls -lh {} ; 2>/dev/null
半年以上没访问过的大文件,多数可以归档到对象存储或者直接删除,前提是确认不是用户核心数据,如果需要保留,可以迁移到挂载的独立数据盘或OSS,成本通常比系统盘扩容低。
用表格对比各目录风险
除了/var和/home,根分区下其他目录也需要按风险等级处理:
| 目录 | 清理风险 | 操作建议 |
|---|---|---|
/tmp |
低 | 定期清理或设置定时任务 |
/var/tmp |
低 | 同上 |
/var/log |
中低 | 清理旧日志,配置轮转 |
/var/cache |
低 | 可安全清理 |
/home |
中高 | 确认文件归属再删或迁移 |
/root |
高 | 只有管理员能操作,别误删配置 |
/opt |
高 | 应用安装目录,确认应用状态 |
/usr |
极高 | 系统核心文件,不要手动清理 |
表格对比能让新手快速判断哪些操作是安全的,而不是所有目录都用同一套删除逻辑。
Linux磁盘占满原因排查与长期预防
清理完了不代表不会复发,真正让服务器长期稳定的办法,是找出占满的根本原因,再配置自动轮转和监控。
inode耗尽和block占满要分开看
df -h看的是block占用,也就是文件内容占的磁盘空间,还有另一种情况:空间没满,但不能再创建文件,这时候要查inode:
df -i
如果IUse%接近100%,说明是小文件太多把inode用光了,常见场景是缓存目录里积累了几十万个小文件,或者邮件队列、session目录异常增长,处理思路完全不同:需要找到目录下文件数量最多的位置:
find / -xdev -type f | cut -d/ -f2 | sort | uniq -c | sort -rn | head -20
再针对文件密度高的目录做清理或迁移,只清block不解决inode耗尽,这是很多新手容易踩的坑。
用find按时间和大小定位文件
除了前面提到的按大小查,还可以按修改时间批量定位长期没动的文件:
find /var -type f -mtime +90 -size +100M -exec ls -lh {} ; 2>/dev/null
这条命令找/var下90天前修改过且超过100M的文件,通常这些文件就是可以归档或删除的候选对象,再结合业务日志保留周期,就能形成一套固定的清理脚本。
部署监控与日志轮转
长期预防最有效的两条路:监控告警和日志轮转。
监控推荐用轻量脚本定时检查磁盘使用率,超过阈值就发通知:
#!/bin/bash
usage=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$usage" -gt 85 ]; then
echo "disk usage above 85%" | mail -s "disk alert" admin@example.com
fi
这个脚本放到crontab每30分钟跑一次,不同云厂商也有自带的磁盘监控告警,控制台里开启即可。
日志轮转用logrotate,大部分发行版自带这个工具,可以在/etc/logrotate.d/下为Nginx、MySQL等应用添加配置,比如给Nginx日志保留14天并压缩:
/var/log/nginx/.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
sharedscripts
postrotate
nginx -s reload > /dev/null 2>&1
endscript
}
行业共识认为,日志轮转是服务器长期稳定运行的最低成本方案,配置一次之后,日志就不会再无限增长,磁盘告警会大幅减少。
Linux磁盘空间满了相关问题解答
问:Linux磁盘空间满了是否一定要重装系统?
答:多数情况下不需要重装,先按本文的顺序定位大文件和可清理目录,把日志、缓存、临时文件处理掉,再观察使用率,重装只能解决一时的问题,如果业务数据和应用逻辑没变,过一段时间还会再次占满。
问:df -h显示100%但du找不到大文件是什么原因?
答:通常是文件被进程占用但已经被标记删除,用lsof | grep deleted可以找到这类文件,重启对应服务或进程后,空间会被系统回收,另一个可能原因是inode耗尽而非block耗尽,用df -i确认。
问:Linux服务器硬盘满了扩容贵不贵?
答:云服务器系统盘扩容按容量计费,华北地域和华南地域价格差异不大,一般按每GB每月零点几元收费,先清理再评估扩容需求,多数情况能避免不必要的额外费用。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/671304.html




