> 磁盘空间是无声的战场,一次溢出足以瘫痪整个系统——资深运维的忠告

一、 基础命令:磁盘空间监测的基石

Linux磁盘使用情况查看指南

1. df:文件系统空间概览

作为最常用的磁盘空间查看工具,`df`(disk free)提供文件系统级别的使用概览:

bash

df -h 人性化显示(GB/MB)

Filesystem Size Used Avail Use% Mounted on

/dev/sda2 20G 15G 4.5G 77% /

/dev/sdb1 100G 82G 18G 82% /data

df -i /home 查看/home的inode使用

Filesystem Inodes IUsed IFree IUse% Mounted on

/dev/sda1 1.2M 850K 350K 71% /home

参数点睛

  • `-h`:自动转换单位(避免计算1024与1000的混淆)
  • `-T`:显示文件系统类型(ext4/xfs/btrfs等)
  • `-i`:排查"磁盘未满却无法写入"的inode耗尽问题
  • 2. du:目录空间深度扫描

    当需要定位具体目录的空间占用时,`du`(disk usage)是首选:

    bash

    du -sh /var/log/ 2>/dev/null | sort -hr 按大小排序日志目录

    1.5G /var/log/syslog.1

    800M /var/log/nginx

    高级技巧

    bash

    查找超过100MB的日志文件

    find /var/log -type f -size +100M -exec ls -lh {} ;

    排除特定目录扫描

    du -sh exclude=".cache" /home/

    二、 进阶工具:精准定位空间消耗源

    1. ncdu:终端可视化分析神器

    bash

    ncdu /data 交互式分析/data目录

  • /data
  • 82.5 GiB [] /database_backup

    12.1 GiB [ ] /user_uploads

    4.3 GiB [ ] /temp_files

    核心优势

  • 方向键导航目录树
  • 按大小排序(`d`键删除确认)
  • 显示百分比进度条
  • 2. iotop & iostat:实时I/O监控

    bash

    iotop -oPa 显示实际磁盘I/O进程

    PID PRIO USER DISK READ DISK WRITE COMMAND

    456 be/4 mysql 12.5 M/s 8.2 M/s ~InnoDB log write

    bash

    iostat -dxm 2 每2秒刷新设备利用率

    Device util% await svctm

    sda 85.2 12.3 5.1

    关键指标解读

  • `util% > 70%`:磁盘接近性能瓶颈
  • `await` > 10ms:可能存在I/O队列堆积
  • 三、 特殊文件系统与场景处理

    1. LVM逻辑卷监控

    bash

    vgs 查看卷组空间

    VG PV LV Attr VSize VFree

    vg00 1 2 wzn 1.5t 200g

    lvs units g 逻辑卷详情

    LV VG Attr LSize Pool Origin Data%

    root vg00 -wi-ao 50g

    data vg00 -wi-ao 1.2t

    精简卷(Thin Provisioning)预警

    bash

    lvs -o+data_percent 监控实际数据占比

    data vg00 vt 65.42%

    2. Btrfs/ZFS高级特性

    bash

    Btrfs空间平衡

    btrfs filesystem usage /

    Device size: 20.00GB

    Used: 14.50GB

    Free (estimated): 4.80GB

    ZFS数据集配额

    zfs set quota=10G pool/userdata

    四、 自动化监控与预警策略

    1. Shell监控脚本示例

    bash

    !/bin/bash

    THRESHOLD=90

    ALERT_EMAIL="

    df -h | awk -v ALERT="$THRESHOLD" 'NR>1 {gsub(/%/,""); if ($5 > ALERT) print $6}'

    2. Prometheus+Grafana可视化方案

    yaml

    node_exporter配置示例

  • name: disk_usage
  • rules:

  • alert: HighDiskUsage
  • expr: 100

  • (node_filesystem_avail_bytes{fstype=~"ext4|xfs"} / node_filesystem_size_bytes 100) > 90
  • for: 30m

    labels:

    severity: critical

    五、 专家建议与避坑指南

    1. 警惕"Storage Tetris"陷阱

  • 避免频繁小文件删除/写入(EXT4的`dir_index`可优化)
  • 数据库服务器预留25%空间(防止B-tree分裂失败)
  • 2. 日志管理的黄金法则

    bash

    日志轮转优化(/etc/logrotate.conf)

    /var/log/nginx/.log {

    daily

    rotate 30

    compress

    delaycompress 延迟压缩上月日志

    size 100M

    3. 云环境特殊考量

  • AWS EBS突发余额监控:`iops_credit_balance`
  • 容器存储:`docker system df` + 卷清理策略
  • 4. 文件删除空间未释放?

    bash

    lsof +L1 查找被进程占用的已删文件

    COMMAND PID USER FD TYPE SIZE/OFF NLINK NODE NAME

    java 1234 app 5u REG 1.5G 0 256 /tmp/deleted.log (deleted)

    六、 构建磁盘健康体系

    | 监控层级 | 推荐工具 | 检查频率 |

    | 基础容量 | df -h / du -sh | 每日 |

    | 目录热点分析 | ncdu / baobab | 每周 |

    | I/O性能瓶颈 | iostat / iotop | 实时/按需 |

    | 自动化预警 | Prometheus+Alertmanager | 持续监控 |

    | 长期趋势分析 | Grafana报表 | 月度复盘 |

    终极建议

  • 生产环境保留至少15%的缓冲空间
  • 关键系统采用独立/var分区设计(避免日志塞满根分区)
  • 对Docker/虚拟机实施磁盘配额(`storage-opt size=10G`)
  • 通过本文介绍的工具链与方法论,您不仅能快速定位现有磁盘问题,更能构建预防性的存储健康体系。记住:磁盘空间管理不是救火,而是防火的艺术——精准的数据洞察配合自动化策略,让存储资源成为系统稳健运行的基石而非瓶颈。