Linux无原生存储池概念,“存储池空间增长趋势”实际指LVM的VG/LV、ZFS的pool或Ceph的OSD/PG三类场景,需定期采样vgs/zpool list/df等命令并时间序列比对,而非单次df或du。

Linux 没有原生“存储池”概念,所谓“存储池空间增长趋势”,实际指向三种常见场景:LVM 的 VG/LV、ZFS 的 pool、或 Ceph 的 OSD/PG。直接用 df 或 du 看单次快照无法反映“趋势”,必须靠定期采样 + 时间序列比对。
查 LVM 逻辑卷组(VG)空间变化
LVM 的空间增长通常来自 LV 扩容或新 LV 创建,但 VG 自身的空闲空间(Free PE)才是关键指标。不能只看 df -h,因为文件系统可能未同步扩容。
- 用
vgs -o vg_name,vg_free,vg_size --units g获取 VG 当前空闲/总大小(单位 GB),比vgdisplay更适合脚本解析 - 真正反映“增长趋势”的是连续多次采样:每 5–30 分钟执行一次该命令,记录时间戳和
vg_free值 - 注意陷阱:如果 LV 已扩容但未执行
resize2fs或xfs_growfs,df显示的空间不会变,但vgs的vg_free已减少 —— 这说明空间已被分配,只是未生效 - 示例采样行:
2026-07-09T05:30:00Z my_vg 12.45g 100.00g
查 ZFS pool 容量历史波动
ZFS 的 zpool list 只给当前值;要看出“趋势”,得依赖其内置的 zpool iostat -y(yesterday)或结合 zpool history 中的 resize 事件,但后者不记录自动增长(如 auto-expand 启用后磁盘热插拔)。
- 可靠方式是定时运行
zpool list -H -o name,size,alloc,free -p(-p输出精确字节数,避免 KB/MB 单位歧义) - ZFS 的 “增长” 往往伴随写入放大或压缩率变化,所以单看
alloc不够,需同步采集zfs get compressratio,used,available到具体 dataset - 常见误判点:
zpool list显示ALLOC上升,但zfs list显示USED不变 —— 很可能是 ARC 缓存抖动或元数据膨胀,不是真实数据增长 - 不要依赖
zpool status,它不输出容量数字
用 cron + awk 做轻量趋势日志(通用方案)
无论 LVM、ZFS 还是普通挂载点,只要目标路径固定,就可用统一脚本持续记录。核心是避免用 du -sh 扫全盘(慢且不准),改用 df --output=source,size,avail,pcent,target(GNU coreutils ≥8.23)提取结构化字段。
- 脚本关键行:
df --output=source,avail,pcent /my/pool | awk 'NR==2 {print strftime("%Y-%m-%dT%H:%M:%S"), $2, $3, $4}' >> /var/log/pool_trend.log -
$2是可用空间(KB),$3是使用百分比,$4是挂载点 —— 三者缺一不可,因为同一百分比在不同总量下意义完全不同 - 采样间隔建议 10 分钟起:太短会淹没 I/O,太长会漏掉突发增长(如日志轮转失败导致单文件暴涨)
- 日志文件本身要监控:别让
/var/log/pool_trend.log成为新的增长源,加 logrotate 或用tail -n 10000截断
真正在意“趋势”,就不能只看数字涨跌。LVM 的 PE 耗尽、ZFS 的 alloc 持续爬升但 compressratio 下降、普通挂载点 pcent 稳定在 85% 但 avail 每小时掉 1GB —— 这些组合信号,比任何单次命令输出都重要。脚本跑起来之后,第一件事是盯住时间戳是否连续,其次才是数值本身。


















