domfstrim 是什么
virsh domfstrim 让 libvirt 通知 guest 对文件系统执行一次批量 TRIM,相当于在 guest 里跑一遍 fstrim -a。它的用途是回收 guest 内已删除文件占用的空间:当存储侧是精简置备(thin pool、SSD、支持 UNMAP 的阵列)时,guest 删了文件但宿主看不到释放,虚拟磁盘会持续膨胀,domfstrim 就是把这个“空洞”传下去的手段。
基本信息
| 执行 | virsh domfstrim <域> |
|---|---|
| 前提 | guest 内支持 fstrim,且设备声明 discard |
| 盘侧 | domain XML 的 driver 设置 discard='unmap' |
| guest 侧 | mount -o discard 或定期 fstrim |
| 生效范围 | 只对支持 discard / unmap 的存储有效 |
| 校验 | virsh domblkinfo 查看分配容量变化 |
典型使用场景
- 精简置备存储上的镜像长期膨胀,需要回收宿主空间
- 批量删除数据后立即回收,避免存储被空洞占满
- 巡检发现虚机的实际分配远大于 guest 内已用空间
- 删除快照后配合做一次空间回收
- 把回收动作放进日常运维任务,按周期执行
触发与核对
触发与核对
virsh domfstrim vm1 # 对 guest 文件系统触发批量 TRIM
virsh domblkinfo vm1 vda # 对比分配容量(allocation)是否下降
sudo fstrim -av # guest 内手动执行,看每个挂载点释放多少
virsh dumpxml vm1 | grep -A5 'driver name' # 确认驱动是否带 discard='unmap'
mount | grep discard # guest 内确认挂载参数相关设置与效果
| 位置 | 设置 | 效果 |
|---|---|---|
| 盘侧 XML | driver discard='unmap' | 允许 guest 的 TRIM 传到存储层 |
| guest 挂载 | discard 选项 | 实时回收,带来一定额外开销 |
| guest 手动 | fstrim -av | 批量回收,适合定期执行 |
| 存储侧 | 支持 UNMAP 的精简置备 | 才会真正释放宿主空间 |
| 机械盘 | 无 TRIM 收益 | 回收效果有限 |
机械盘与不支持 discard 的存储上收益有限;对精简置备存储收益明显。定期执行比长期挂着 mount -o discard 更可控,开销集中一次做完。
domfstrim 只传 TRIM 信息,不删 guest 内的数据,属于回收动作;但老阵列收到大量 TRIM 后可能在后台集中处理,仍建议放在业务低峰执行。执行后对比 domblkinfo 的分配容量,才能确认回收真的落到存储。