ZFS 如何对大文件进行写时复制工作

Hub*_*NNN 5 zfs cp file-copy copy-on-write

假设我有一个example.log在 ZFS 上调用的大文件 (8GB) 。我做cp example.log example.bak一个副本。然后我在原始文件中添加或修改几个字节。会发生什么?

ZFS 会复制整个 8GB 文件还是仅复制更改的块(以及从文件描述符指向该块的所有 inode 链)?

dha*_*hag 4

据我所知,FreeBSD ZFS 不支持使用 cp 进行写时复制;本机 cp 似乎没有此类轻量级副本的选项,并且--reflink在 ZFS 系统上尝试 GNU cp 时出现错误,我尝试使用错误消息“cp:无法从 'example.log' 克隆 'example.bak':操作不支持”。

评论者提到 Solaris cp 有一个-z开关可以执行此类复制。

但是,我希望这能回答您的根本问题,写入时复制用于文件系统快照:假设您在 1000GB 可用空间中使用了 900GB,没有什么可以阻止您制作该文件系统的快照,快照不会占用900GB ; 事实上,它最初根本不会占用任何新的数据块。

创建包含 的原始文件系统的快照后 example.log,您最终会得到两个“副本”:快照中的只读版本和原始位置中的实时版本。当副本被修改时,无论是通过附加还是就地更改,会发生什么?这就是奇迹发生的地方:只有那些被更改的块才会被复制并开始耗尽空间。情况并非是一旦更改整个文件就会被复制。