CentOS 7 上给虚拟机镜像做快速副本,cp –reflink=always win.img win2.img 直接报 failed to clone,宿主机上 df -T 显示目标目录是 ext4。

真正麻烦的地方在于,几个原因的现象几乎一样。reflink 需要文件系统支持写时复制,ext4 与早期的 xfs 版本都不提供;源和目标不在同一个文件系统上,跨设备拷贝无法共享数据块;XFS 虽然支持 reflink 但需要 mkfs 时启用,老盘上没这个特性;内核版本过低,btrfs 的 clone 接口也存在但行为不同。

上来先确认目标文件系统类型与特性

df -T /data && xfs_info /data 2>/dev/null | grep -i reflink

然后在支持的文件系统上重试并看返回码

cp --reflink=always /data/vm/win.img /data/vm/win2.img && stat -c '%b %n' /data/vm/win*.img

不支持时退回普通拷贝并评估耗时

time cp --reflink=never /data/vm/win.img /data/vm/win3.img

新建盘时启用 reflink 特性

mkfs.xfs -m reflink=1 /dev/vdc

别只看报错消失,验证要多做一步。stat 显示两个镜像占用块数相近而 cp 在秒级完成,df 的已用空间几乎没涨,说明数据块被共享而不是各存一份。

补一句。reflink 只在同一文件系统内有效,跨盘拷贝仍然要真拷数据;删掉其中一个副本不会释放空间,账单要看实际块占用。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189