一、磁盘空间不足的初步诊断
1. 确认磁盘使用概况
当服务器出现性能下降或服务异常时,首先需检查磁盘空间使用情况。可通过以下命令快速获取整体磁盘状态:
df -h:以人类可读格式显示所有挂载点的磁盘使用情况,重点关注Use%列。若某分区使用率超过90%,需立即处理。du -sh /:查看根目录总占用空间,辅助判断是否为根分区问题。
典型场景:若df显示/dev/vda1(根分区)使用率98%,而其他分区(如/boot、/home)空间充足,则问题集中在根分区。
2. 识别关键挂载点
若服务器存在多个挂载点(如独立的数据分区、日志分区),需进一步定位具体分区:
mount | grep '^/dev':列出所有磁盘挂载点及对应设备。lsblk:以树状结构显示磁盘分区信息,直观查看分区大小及挂载路径。
示例:若df显示/var分区使用率过高,通过lsblk确认/var是否为独立分区,或属于根分区下的子目录。
3. 检查inode耗尽问题
磁盘空间不足不仅可能由存储容量耗尽引起,还可能是inode(索引节点)用尽导致。inode用于存储文件元数据(如权限、时间戳),每个文件占用一个inode。当inode耗尽时,即使磁盘有剩余空间,也无法创建新文件。
df -i:查看各分区inode使用情况。若某分区IUse%接近100%,需清理小文件或临时文件。
案例:某服务器/var/log分区inode使用率100%,但df -h显示空间剩余20%。经排查发现大量微小日志文件(如每分钟生成的1KB日志),导致inode耗尽。
二、精准定位磁盘占用源头
1. 分析目录空间占用
确定问题分区后,需进一步定位具体目录或文件。常用工具包括:
du命令:du -h --max-depth=1 /var:显示/var下一级子目录的空间占用,按大小排序。du -sh /var/log/*:统计/var/log下各子目录的总大小。
ncdu工具(需安装):交互式磁盘使用分析器,支持按大小排序、导航目录树,效率高于du。
技巧:结合sort命令对du结果排序,如du -h /var | sort -rh | head -n 10,快速找出Top 10占用目录。
2. 识别大文件与临时文件
find命令查找大文件:find /var -type f -size +100M -exec ls -lh {} \;:查找/var下大于100MB的文件。find /tmp -type f -mtime +7 -delete:删除/tmp下7天前的临时文件。
- 日志文件清理:
- 检查
/var/log下的日志文件(如messages、syslog、nginx/access.log),使用tail -n 100查看最新日志确认是否可清理。 - 对于轮转日志(如
.log.1、.log.2.gz),可删除旧版本或调整日志轮转策略(如logrotate)。
- 检查
3. 检查隐藏文件与备份文件
- 隐藏文件:以
.开头的文件(如.bash_history、.cache)可能积累大量空间。通过ls -la /home查看用户目录下的隐藏文件。 - 备份文件:检查
/backup、/data/backup等目录,清理过期备份或压缩旧备份(如.tar.gz文件)。
4. 分析文件类型占比
若无法确定具体文件,可按文件类型统计空间占用:
file命令结合du:bash1find /var -type f | xargs file | grep "text" | cut -d: -f1 | xargs du -ch
(注:此命令为逻辑示例,实际需根据需求调整)baobab工具(图形化):提供可视化磁盘分析,按文件类型(如图片、日志、压缩包)分类展示空间占用。
三、高效清理磁盘空间的策略
1. 清理日志文件
日志是磁盘占用的主要来源之一,需定期清理:
- 手动清理:
- 清空日志文件:
> /var/log/syslog(慎用,需确认服务无需历史日志)。 - 删除旧日志:
rm /var/log/nginx/access.log.1。
- 清空日志文件:
- 日志轮转:
- 配置
logrotate自动轮转日志,设置压缩、保留周期(如保留7天)。 - 示例配置片段:
1/var/log/nginx/*.log { 2 daily 3 missingok 4 rotate 7 5 compress 6 delaycompress 7 notifempty 8 create 0640 www-data adm 9 sharedscripts 10 postrotate 11 [ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid` 12 endscript 13}
- 配置
2. 清理缓存与临时文件
- 系统缓存:
apt-get clean(Debian/Ubuntu):清理/var/cache/apt/archives下的软件包缓存。yum clean all(RHEL/CentOS):清理/var/cache/yum下的缓存。
- 应用缓存:
- 数据库缓存:如MySQL的
tmp_table_size过大可能导致临时表占用空间,需调整参数并重启服务。 - Web缓存:清理Nginx/Apache的
proxy_cache目录(如/var/cache/nginx)。
- 数据库缓存:如MySQL的
- 用户临时文件:
- 清理
/tmp目录:find /tmp -type f -atime +1 -delete(删除1天内未访问的文件)。 - 清理用户缓存:如
~/.cache/、~/.thumbnails/。
- 清理
3. 删除无用的大文件
- 备份文件:删除旧的数据库备份(如
.sql.gz)、镜像文件(如.iso)。 - 核心转储文件:清理
/var/crash下的核心转储(core dump)文件。 - 废弃的安装包:删除
/usr/src下的源码包或未使用的软件包。
4. 调整磁盘分区与挂载点
若清理后空间仍不足,需考虑调整分区结构:
- 扩展分区:通过LVM(逻辑卷管理)在线扩展分区(需未分配空间或新增磁盘)。
- 迁移数据:将大目录(如
/var/lib/docker)迁移至独立分区或挂载新磁盘。 - 符号链接:将非关键目录(如
/opt)链接至其他分区。
四、预防磁盘空间不足的最佳实践
- 监控告警:
- 部署监控工具(如Prometheus+Grafana)实时监控磁盘使用率,设置阈值告警(如85%触发预警,95%触发严重告警)。
- 日志管理:
- 统一日志收集(如ELK Stack),避免日志分散在各服务器。
- 限制单日志文件大小(如
maxsize 50M),避免单个日志文件过大。
- 定期清理任务:
- 编写Cron脚本定期执行清理命令(如每周清理
/tmp、每月清理日志)。
- 编写Cron脚本定期执行清理命令(如每周清理
- 容量规划:
- 根据业务增长预测磁盘需求,预留20%-30%的缓冲空间。
- 对大文件存储(如视频、图片)使用独立存储系统(如对象存储)。
五、总结
Linux服务器磁盘空间不足的排查与清理需遵循“定位-分析-清理-预防”的闭环流程。通过df、du、find等工具快速定位问题,结合日志轮转、缓存清理、大文件删除等策略释放空间,最终通过监控与容量规划避免问题复发。开发工程师应掌握这些核心技能,确保服务器稳定运行,避免因磁盘问题导致业务中断。