我们已经看到操作系统在 fork 进程时进行 Copy on Write 优化。原因是大多数情况下 fork 都在 exec 之前,所以我们不想承担页面分配和从调用者地址空间不必要地复制数据的成本。
那么在带有 ext4 或 xfs(日志)文件系统的 linux 上执行 CP 时,是否也会发生这种情况?如果它没有发生,那为什么不呢?
如果您打开 的defragment
部分btrfs-filesystem(8)
,您将看到以下开发人员留下的不祥铭文:
警告:使用 Linux 内核版本 < 3.9 或 ? 3.14-rc2 以及 Linux 稳定内核版本?3.10.31,?3.12.12 还是?3.13.4 将打破 COW 数据的 ref-links(例如使用 复制的文件
cp --reflink
、快照或去重数据)。根据断开的引用链接,这可能会导致空间使用量的显着增加。
这听起来很可怕。一个卖点btrfs
是它能够在不复制所有内容的情况下创建快照。我主要创建只读快照。
只读快照的文件是否也算作“COW-data”,或者父子卷重复数据删除会在不使磁盘空间膨胀的情况下继续存在吗?
假设我有一个example.log
在 ZFS 上调用的大文件 (8GB) 。我做cp example.log example.bak
一个副本。然后我在原始文件中添加或修改几个字节。会发生什么?
ZFS 会复制整个 8GB 文件还是仅复制更改的块(以及从文件描述符指向该块的所有 inode 链)?