1. Linux磁盘空间统计基础
在Linux系统管理中,磁盘空间监控是最基础也最重要的运维工作之一。想象一下,当你正在部署关键服务时突然遇到"No space left on device"错误,或者数据库因为磁盘写满而崩溃的场景。掌握正确的磁盘空间统计方法,就像给系统装上了油量警报器,能让我们在问题发生前及时预警。
1.1 为什么需要关注磁盘空间
现代Linux服务器通常采用LVM(逻辑卷管理)和多种文件系统组合的存储方案。以典型的Web服务器为例:
- /boot分区通常需要200-500MB
- 根分区/需要20-50GB
- /var分区(存放日志)建议单独划分30GB+
- /home分区根据用户数量配置
当这些分区使用率达到90%以上时,系统性能会显著下降。MySQL等数据库在磁盘空间不足时可能产生数据损坏,而日志轮转(logrotate)机制也会失效。
1.2 核心统计命令对比
Linux提供了多个磁盘统计工具,各有适用场景:
| 命令 | 显示单位 | 递归统计 | 适合场景 | 典型输出示例 |
|---|---|---|---|---|
| df | 块/人性化 | 否 | 查看挂载点剩余空间 | /dev/sda1 20G 15G 5G |
| du | 块/人性化 | 是 | 统计目录实际占用 | /var/log 4.8G |
| lsblk | 人性化 | 否 | 查看块设备层级关系 | sda1 8G part |
| ncdu | 人性化 | 是 | 交互式分析大文件分布 | [图形化百分比] |
经验提示:在脚本中使用df/du时务必加上-P参数(POSIX模式),避免换行符导致解析错误。例如
df -P /var比单纯的df /var更可靠。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. df命令深度解析
作为最基础的磁盘空间检查工具,df(disk filesystem)命令的参数组合能应对各种复杂场景。
2.1 基础用法与输出解读
执行df -h的典型输出:
code复制Filesystem Size Used Avail Use% Mounted on
/dev/nvme0n1p2 476G 312G 140G 70% /
tmpfs 16G 1.2G 15G 8% /dev/shm
关键字段解析:
- Filesystem:实际设备或虚拟文件系统(如tmpfs)
- Size:分区总容量(注意厂商的1GB=1000MB与系统的1GiB=1024MiB差异)
- Avail:普通用户可用的真实空间(比单纯的剩余空间更准确)
- Use%:已用百分比(建议设置80%告警阈值)
2.2 高级使用技巧
场景一:排除tmpfs等虚拟文件系统
bash复制df -h -x tmpfs -x devtmpfs
场景二:只显示特定文件系统类型
bash复制df -h -t ext4 # 仅显示ext4分区
场景三:inode数量监控(处理"磁盘有空间但无法写入"问题)
bash复制df -i /var # 检查inode使用率
避坑指南:当Use%显示95%但Avail还有几十GB时,可能是被删除的大文件仍被进程占用。通过
lsof -nP | grep deleted查找这些"幽灵文件",重启相关服务即可释放空间。
3. du命令实战技巧
如果说df是看"剩余油量",那么du(disk usage)就是检查"哪些部件最耗油"。
3.1 精准统计目录大小
基础命令:
bash复制du -sh /var/log # -s汇总 -h人性化显示
进阶用法:
bash复制# 统计前10大目录
du -h /var | sort -rh | head -n 10
# 排除特定目录(如不想统计/proc中的虚拟文件)
du -h --exclude="/proc/*" /
3.2 时间维度分析
结合find命令实现按时间筛选:
bash复制# 统计/var/log下7天内修改过的文件总大小
find /var/log -type f -mtime -7 -exec du -ch {} + | grep total$
性能技巧:对大目录(如/home)使用
du --apparent-size可以跳过磁盘块检查,速度提升明显但结果略不精确。
4. 自动化监控方案
4.1 Shell脚本实现
创建/usr/local/bin/disk_check.sh:
bash复制#!/bin/bash
THRESHOLD=90
EMAIL="admin@example.com"
df -P | awk -v ALERT="$THRESHOLD" '
NR>1 {
gsub(/%/,"",$5)
if ($5 > ALERT) {
print "Alert: " $1 " is " $5 "% full"
system("echo \"" $6 " is at " $5 "%\" | mail -s \"Disk Alert\" " EMAIL)
}
}'
设置cron任务每天检查:
bash复制chmod +x /usr/local/bin/disk_check.sh
echo "0 9 * * * root /usr/local/bin/disk_check.sh" > /etc/cron.d/diskcheck
4.2 使用Prometheus+Grafana
- 安装node_exporter采集指标
- Grafana配置关键面板:
- 磁盘使用率时序图
- 分区剩余天数预测(基于7天增长趋势)
- inode使用率热力图
关键PromQL查询:
code复制100 - (node_filesystem_avail_bytes{mountpoint="/"} * 100 / node_filesystem_size_bytes{mountpoint="/"})
5. 特殊场景处理
5.1 LVM空间扩展
当发现VG有剩余空间时扩展LV:
bash复制# 检查VG剩余空间
vgs
# 扩展LV并resize文件系统
lvextend -L +10G /dev/mapper/vg-root
resize2fs /dev/mapper/vg-root # 对ext4
xfs_growfs /dev/mapper/vg-root # 对XFS
5.2 磁盘IO过高导致统计卡顿
使用ionice降低磁盘统计操作的优先级:
bash复制ionice -c 3 du -sh /large_dir
5.3 网络文件系统统计
NFS挂载点建议增加-l参数(本地文件系统):
bash复制df -l -h # 避免因网络延迟导致卡住
6. 可视化工具推荐
6.1 ncdu - 终端交互式分析
安装与基本使用:
bash复制yum install ncdu -y # RHEL
apt install ncdu # Debian
ncdu /var
操作快捷键:
n- 按文件名排序s- 按文件大小排序d- 删除选中文件
6.2 Baobab - 图形化工具(GNOME环境)
启动方式:
bash复制baobab &
特点:
- 直观的旭日图或树状图展示
- 支持远程SSH连接分析
- 可导出CSV报告
7. 企业级运维实践
在某电商公司的实战案例中,通过以下组合方案将磁盘故障预警时间从平均4小时提升到72小时:
-
分层监控:
- 80%:企业微信通知
- 90%:自动创建工单
- 95%:触发自动日志清理脚本
-
智能预测:
python复制# 使用线性回归预测磁盘填满天数 import numpy as np from sklearn.linear_model import LinearRegression # 示例数据:过去7天的可用空间(GB) X = np.array([1,2,3,4,5,6,7]).reshape(-1, 1) y = np.array([120, 115, 108, 100, 90, 82, 75]) model = LinearRegression().fit(X, y) days_left = int(model.predict([[8]])[0] / (y[-1] - y[-2])) -
自动修复:
- 日志目录自动轮转
- MySQL表空间自动收缩
- 临时文件定期清理
8. 性能优化技巧
-
统计加速:
bash复制# 使用更快的统计方法(但可能不统计子目录) ls -l --block-size=1 | awk '{sum += $5} END {print sum}' -
避免统计时的权限问题:
bash复制du -sh --time --exclude="/proc/*" / 2>/dev/null -
ZFS/Btrfs特殊处理:
bash复制# ZFS专用命令 zpool list zfs list -o space
9. 容器环境下的磁盘统计
Docker容器会产生大量层叠文件系统,需要特殊处理:
9.1 容器存储分析
bash复制# 查看容器磁盘使用
docker system df -v
# 清理无用数据
docker system prune -a
9.2 Kubernetes节点检查
bash复制kubectl describe nodes | grep -A 10 "Allocated resources"
10. 固态硬盘(SSD)特别注意事项
-
过度写入监控:
bash复制smartctl -A /dev/nvme0 | grep "Percentage Used" -
TRIM支持检查:
bash复制
systemctl list-timers | grep fstrim -
寿命预测:
bash复制nvme smart-log /dev/nvme0 | grep "available_spare"
