Linux df/du 命令实战:5分钟定位磁盘空间占用超80%的根因
·
Linux磁盘空间排查实战:5分钟精准定位空间占用元凶
1. 磁盘空间告警的紧急排查流程
当服务器突然弹出"磁盘空间不足"的警告时,运维人员需要像急诊医生一样快速定位问题根源。以下是经过实战验证的排查决策树:
- 全局扫描 :使用
df -h查看各分区使用率,锁定问题分区 - 目录级分析 :进入目标分区后执行
du -sh * | sort -hr找出最大目录 - 深度钻取 :对可疑目录执行
du -ah | sort -rh | head -10列出具体大文件 - 特殊文件检查 :用
ls -lhS查看当前目录文件大小排序
典型排查场景示例 :
# 步骤1:确认根分区使用率已达95%
$ df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 47G 1.2G 95% /
# 步骤2:发现/var占用异常
$ cd / && sudo du -sh * | sort -hr
24G var
11G usr
5.2G home
...
# 步骤3:定位到日志文件过大
$ cd /var && sudo du -ah | sort -rh | head -5
18G /var/log/nginx/access.log
1.2G /var/log/syslog
800M /var/log/kern.log
...
2. 高阶排查工具与技巧
2.1 可视化分析工具
对于复杂的空间占用问题,可以借助可视化工具生成直观报告:
# 安装ncdu工具
$ sudo apt install ncdu -y
# 扫描指定目录
$ ncdu /var
ncdu会生成交互式界面,用ASCII条形图显示各目录占比,支持键盘导航深入查看。相比传统命令,它能:
- 实时显示扫描进度
- 允许删除文件而不退出工具
- 按大小或名称排序
- 显示隐藏目录占比
2.2 特殊文件类型处理
某些文件类型需要特殊处理方式:
| 文件类型 | 特征 | 处理命令 |
|---|---|---|
| 日志文件 | 持续增长 | truncate -s 0 filename |
| 核心转储 | 以core开头 | gdb -c corefile 分析后删除 |
| 孤立inode | du与df结果不一致 | lsof +L1 查找被删除的大文件 |
2.3 自动化监控脚本
将以下脚本加入crontab实现每日空间检查:
#!/bin/bash
THRESHOLD=80
CURRENT=$(df / --output=pcent | tail -1 | tr -d '% ')
if [ "$CURRENT" -ge "$THRESHOLD" ]; then
ALERT_MSG="[WARNING] Disk usage on / is ${CURRENT}%"
echo "$ALERT_MSG"
# 生成详细报告
REPORT_FILE="/tmp/disk_usage_$(date +%Y%m%d).log"
echo "Top 10 directories:" > "$REPORT_FILE"
du -h --max-depth=1 / 2>/dev/null | sort -hr | head -11 >> "$REPORT_FILE"
# 这里可以添加邮件发送逻辑
else
echo "[OK] Disk usage: ${CURRENT}%"
fi
3. 典型场景解决方案
3.1 日志文件暴增
Nginx/Apache日志快速增长是常见问题,解决方案包括:
- 日志轮转配置 (以Nginx为例):
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
invoke-rc.d nginx rotate >/dev/null 2>&1
endscript
}
- 实时日志监控 :
# 监控日志文件增长
$ watch -n 60 'du -sh /var/log/nginx/access.log'
# 按时间范围切割日志
$ sudo logrotate --force /etc/logrotate.d/nginx
3.2 数据库空间异常
PostgreSQL数据库可能出现数据目录膨胀:
-- 查询数据库大小
SELECT d.datname AS "数据库名",
pg_size_pretty(pg_database_size(d.datname)) AS "大小"
FROM pg_database d
ORDER BY pg_database_size(d.datname) DESC;
-- 查询表大小(含索引)
SELECT table_schema || '.' || table_name AS "表名",
pg_size_pretty(pg_total_relation_size('"'||table_schema||'"."'||table_name||'"')) AS "总大小"
FROM information_schema.tables
ORDER BY pg_total_relation_size('"'||table_schema||'"."'||table_name||'"') DESC;
对于表膨胀问题,建议定期执行 VACUUM FULL (需停机窗口)或使用pg_repack工具在线重组。
4. 防御性运维策略
4.1 空间预分配机制
通过LVM实现弹性扩容:
# 查看卷组剩余空间
$ vgs
# 扩展逻辑卷
$ lvextend -L +10G /dev/mapper/vg-root
# 调整文件系统
$ resize2fs /dev/mapper/vg-root
4.2 关键目录配额设置
对用户目录设置磁盘配额:
# 1. 编辑/etc/fstab,添加usrquota参数
/dev/sda1 /home ext4 defaults,usrquota 0 2
# 2. 重新挂载并初始化配额
$ mount -o remount /home
$ quotacheck -cum /home
$ quotaon /home
# 3. 为用户设置配额
$ edquota -u username
4.3 自动化清理策略
使用systemd定时器实现智能清理:
# /etc/systemd/system/disk-cleanup.service
[Unit]
Description=Weekly disk cleanup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/cleanup_script.sh
# /etc/systemd/system/disk-cleanup.timer
[Unit]
Description=Run cleanup weekly
[Timer]
OnCalendar=weekly
Persistent=true
[Install]
WantedBy=timers.target
更多推荐


所有评论(0)