快照剩余空间不能看lv_size,而应关注data_percent字段,它表示快照区已占用的物理空间比例,例如1GB快照data_percent为95%时仅剩约50MB余量,需结合watch或脚本监控并设85%告警阈值。

快照剩余空间不等于 lv_size,要看 data_percent
逻辑卷快照(snapshot)本身是 COW(Copy-on-Write)机制,它不直接显示“剩余可用空间”,而是用已使用比例反映写入压力。运行 lvs 时,data_percent 列才是关键指标——它表示快照区已被占用的比例,而非源 LV 的使用率。
常见错误:误把 lv_size 当成快照还能撑多久。比如一个 1GB 快照,lv_size 永远显示 1.00g,但 data_percent 从 0% 涨到 95%,说明只剩约 50MB 写入余量(1GB × 5%)。
-
lvs -o lv_name,vg_name,lv_size,data_percent,origin --units h:一次性看清快照名、所属 VG、大小、已用百分比、源 LV 名 - 若输出中
data_percent缺失,说明该 LV 不是快照(lvs默认只对快照显示该列),或内核/LVM 版本过旧(RHEL/CentOS 7+、Ubuntu 18.04+ 均支持) - 注意:
data_percent是估算值,实际剩余空间还受 COW chunk size(默认 4KiB)和元数据开销影响,建议留 10% 余量预警
lvs 不显示 data_percent?检查是否真为快照卷
不是所有带 -s 创建的设备都会持久显示为快照——如果源 LV 被删除、快照被合并(lvconvert --merge)或手动破坏了元数据,lvs 就不再识别其快照属性,data_percent 自然消失。
验证方法:
- 运行
lvs -o +lv_attr,查看LV Attr列第 5 位字符:若是s(如swi-a-s---),表示 active snapshot;若是-或l,就不是有效快照 - 确认源 LV 是否仍存在:
lvs | grep "your_snap_name"输出中origin列应有非空值;若为空或unknown,快照已失效 - 检查 LVM 元数据一致性:
vgck your_vg_name,报错则需vgcfgrestore回滚
监控快照膨胀趋势,别等 data_percent 到 100%
快照写满(data_percent 达 100%)会导致 I/O hang 或自动失效(取决于 snapshot_autoextend_threshold 设置),此时无法再写入,且恢复困难。必须提前干预。
- 用
watch -n 10 'lvs -o lv_name,data_percent --noheadings 2>/dev/null | grep -E "^[^[:space:]]+ [0-9]{1,3}%"'每 10 秒刷一次活跃快照使用率 - 设置告警阈值:当
data_percent > 85时触发通知(例如通过if [ $(lvs -o data_percent --noheadings --units % your_snap | tr -d '%') -gt 85 ]; then ...) - 避免长期挂载快照:快照不是备份替代品,生产环境单个快照建议存活不超过 24 小时,尤其在源卷高写入场景下
为什么 df -h 对快照完全无效
df -h 显示的是文件系统级空间,而快照是块设备层的 COW 区域,未格式化、不可挂载(除非显式 lvchange -pr 并 mount 只读)、也不承载文件系统元数据。对快照执行 df 会报 Filesystem not found 或返回空结果。
唯一能关联快照与文件系统的是:快照创建时刻源 LV 上挂载的文件系统状态。之后源 LV 的任何写入都会按需拷贝旧块到快照区——所以快照剩余量只取决于源卷变更频率和快照初始大小,跟挂载点当前 df 结果无关。
真正要盯的是源卷写入压力:iostat -x 1 | grep your_lv_name 中的 %util 和 await,高值意味着快照区正在高频填充。


















