首页/云/云平台与虚拟化速查/domfstrim:回收 guest 释放的空间
虚拟化操作94 条

domfstrim:回收 guest 释放的空间

对支持 TRIM 的存储(thin pool、SSD、支持 unmap 的阵列),guest 内删除文件后空间不一定归还宿主;virsh domfstrim 触发 guest 文件系统执行批量 TRIM。

云平台与虚拟化速查云更新于 2026-10-13

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 内确认挂载参数

相关设置与效果

位置设置效果
盘侧 XMLdriver discard='unmap'允许 guest 的 TRIM 传到存储层
guest 挂载discard 选项实时回收,带来一定额外开销
guest 手动fstrim -av批量回收,适合定期执行
存储侧支持 UNMAP 的精简置备才会真正释放宿主空间
机械盘无 TRIM 收益回收效果有限
机械盘与不支持 discard 的存储上收益有限;对精简置备存储收益明显。定期执行比长期挂着 mount -o discard 更可控,开销集中一次做完。
domfstrim 只传 TRIM 信息,不删 guest 内的数据,属于回收动作;但老阵列收到大量 TRIM 后可能在后台集中处理,仍建议放在业务低峰执行。执行后对比 domblkinfo 的分配容量,才能确认回收真的落到存储。

易错点

  • 需要读取 guest 文件系统信息的路径:未装 qemu-guest-agent 时相关操作受限
  • 把 domfstrim 当压缩镜像体积的万能手段:不支持 discard 的存储上什么也释放不了
  • 长期挂着 mount -o discard 而未评估开销,写入性能受影响
  • 回收后未核对分配容量变化,误以为已生效,实际盘侧没开 discard
  • 存储阵列侧关闭了 UNMAP 还反复执行回收,只带来后台开销没有实际收益
  • 把回收动作放在业务高峰执行,集中 I/O 与 TRIM 处理叠加拖慢业务

数据来源与参考

  • virsh 手册:domfstrim
  • QEMU 文档:guest-fstrim
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌