文件修改、移动和重命名的 ZFS 快照行为处理

J C*_*ins 6 samba zfs btrfs

由于 ZFS 被描述为更像数据库而不是文件系统,因此我们有理由期望它的行为也更像版本管理系统,智能地管理文件修改、移动和重命名。这些问题专门询问有关快照的问题,但是快照与克隆有很多共同点

\n\n
    \n
  1. 当快照后在 ZFS 中修改文件时,快照的大小是相同且仅存在差异,还是整个文件?
  2. \n
  3. 当文件在快照之后移动到 ZFS 中时,快照\n的大小是否基本上保持为零?
  4. \n
  5. 当快照后在 ZFS 中重命名文件时,快照的大小是否基本上保持为零?
  6. \n
  7. 当文件在快照后具有其自身的硬链接副本时,快照是否基本上保持为空?

  8. \n
  9. 有人建议 BTRFS 的设计目的与 ZFS 大致相同,那么在这些条件下它是否会具有相同的行为?

  10. \n
  11. 当 Windows 计算机通过 SAMBA 远程访问 ZFS 共享时,上述相同行为是否成立,或者 SAMBA 是否是标准驱动器指令的子集(即移动变为复制+删除)?

  12. \n
  13. 是否可以笼统地回答上述问题,或者答案都是特定于实现的?

  14. \n
\n\n

根据评论者的要求,以下是对所描述的操作执行的测试:

\n\n

系统信息:

\n\n
    \n
  • CentOS 7 内核 3.10.0
  • \n
  • ZFS v0.6.5.9-1
  • \n
\n\n

\n\n
                  `zpool list`           `zfs list`\n      POOL        SIZE  ALLOC   FREE    USED   AVAIL  REFER\n
Run Code Online (Sandbox Code Playgroud)\n\n

创建池:zpool create -m /test/mnt FILE-TEST /test/1.img /test/2.img

\n\n
      FILE-TEST   224M  80.5K    224M    73K    192M    19K\n
Run Code Online (Sandbox Code Playgroud)\n\n

快照:zfs snapshot FILE-TEST@1

\n\n
      FILE-TEST   224M   122K    224M    73K    192M    19K\n      FILE-TEST@1                          0       -    19K\n
Run Code Online (Sandbox Code Playgroud)\n\n

创建文件:echo \xe2\x80\x98test\xe2\x80\x99 > /test/mnt/test.txt

\n\n
      FILE-TEST   224M   132K    224M    95K    192M    21K\n      FILE-TEST@1                        17K       -    19K\n
Run Code Online (Sandbox Code Playgroud)\n\n

增加文件大小:`head -c 128K /test/mnt/test.txt

\n\n
      FILE-TEST   224M   678K   223M    490K    192M    148K\n      FILE-TEST@1                        17K       -    19K\n
Run Code Online (Sandbox Code Playgroud)\n\n

快照:zfs snapshot FILE-TEST@2

\n\n
      FILE-TEST   224M   267K   224M    239K    192M    148K\n      FILE-TEST@1                        17K       -     19K\n      FILE-TEST@2                          0       -     48K\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑文件,更改最后 4 个字节。

\n\n
      FILE-TEST   224M  1.07M   223M    386K    192M    148K\n      FILE-TEST@1                        17K       -     19K\n      FILE-TEST@2                       138K       -    148K\n
Run Code Online (Sandbox Code Playgroud)\n\n

快照:zfs snapshot FILE-TEST@3

\n\n
      FILE-TEST   224M   548K   223M    388K    192M    148K\n      FILE-TEST@1                        17K       -     19K\n      FILE-TEST@2                       138K       -    148K\n      FILE-TEST@3                          0       -    148K\n
Run Code Online (Sandbox Code Playgroud)\n\n

重新命名文件mv test.txt test2.txt

\n\n
      FILE-TEST   224M   552K   223M    404K    192M    150K\n      FILE-TEST@1                        17K       -     19K\n      FILE-TEST@2                       138K       -    148K\n      FILE-TEST@3                        10K       -    148K\n
Run Code Online (Sandbox Code Playgroud)\n\n

快照:zfs snapshot FILE-TEST@4

\n\n
      FILE-TEST   224M  1.06M   223M    645K    191M    150K\n      FILE-TEST@1                        17K       -     19K\n      FILE-TEST@2                       138K       -    148K\n      FILE-TEST@3                        10K       -    148K\n      FILE-TEST@4                          0       -    150K\n
Run Code Online (Sandbox Code Playgroud)\n\n

新建文件夹:mkdir /test/mnt/subdir

\n\n
      FILE-TEST   224M   716K   223M    420K    192M    151K\n      FILE-TEST@1                        17K       -     19K\n      FILE-TEST@2                       138K       -    148K\n      FILE-TEST@3                        10K       -    148K\n      FILE-TEST@4                         9K       -    150K\n
Run Code Online (Sandbox Code Playgroud)\n\n

快照:zfs snapshot FILE-TEST@5

\n\n
      FILE-TEST   224M   790K   223M    424K    192M    151K\n      FILE-TEST@1                        17K       -     19K\n      FILE-TEST@2                       138K       -    148K\n      FILE-TEST@3                        10K       -    148K\n      FILE-TEST@4                         9K       -    150K\n      FILE-TEST@5                          0       -    151K\n
Run Code Online (Sandbox Code Playgroud)\n\n

移动文件:mv /test/mnt/test2.txt /test/mnt/subdir/

\n\n
      FILE-TEST   224M   584K   223M    444K    192M    151K\n      FILE-TEST@1                        17K       -     19K\n      FILE-TEST@2                       138K       -    148K\n      FILE-TEST@3                        10K       -    148K\n      FILE-TEST@4                         9K       -    150K\n      FILE-TEST@5                        10K       -    151K\n
Run Code Online (Sandbox Code Playgroud)\n\n

快照:zfs snapshot FILE-TEST@6

\n\n
      FILE-TEST   224M   602K   223M    447K    192M    151K\n      FILE-TEST@1                        17K       -     19K\n      FILE-TEST@2                       138K       -    148K\n      FILE-TEST@3                        10K       -    148K\n      FILE-TEST@4                         9K       -    150K\n      FILE-TEST@5                        10K       -    151K\n      FILE-TEST@6                          0       -    151K\n
Run Code Online (Sandbox Code Playgroud)\n\n

创建硬链接文件:cp -l /test/mnt/subdir/test2.txt /test/mnt/subdir/test3.txt

\n\n
      FILE-TEST   224M   603K   223M    466K    192M    152K\n      FILE-TEST@1                        17K       -     19K\n      FILE-TEST@2                       138K       -    148K\n      FILE-TEST@3                        10K       -    148K\n      FILE-TEST@4                         9K       -    150K\n      FILE-TEST@5                        10K       -    151K\n      FILE-TEST@6                        12K       -    151K\n
Run Code Online (Sandbox Code Playgroud)\n\n

从上述观察:

\n\n
    \n
  • SIZE 和 FREE 非常恒定并且与文件消耗的空间一致
  • \n
  • ALLOC 是随机的
  • \n
  • 快照上的 REFER 似乎等于池上当前的 REFER
  • \n
  • 在大多数操作中,快照上的 USED 大约为 10KB,除了文件更改之外,其中 USED 略大于整个更改的文件大小。
  • \n
  • 池中的USED以不等的跳跃增长
  • \n
  • 每次操作 REFER 逐渐增长到 1K 左右
  • \n
  • 非当前快照的大小保持不变
  • \n
\n

use*_*391 4

  1. 当快照后在 ZFS 中修改文件时,快照的大小是相同且仅存在差异,还是整个文件?

不同的块会增加大小。

这意味着如果一个文件由 100 个块组成,并且您修改单个字节(假设一个字节小于一个块),则最后将添加一个新块(总共 101 个),您的旧文件将引用块 1 到 100(可以从快照中进行只读访问),并且您的新/当前文件将引用块 1 到 37 和 39 到 101(或任何其他组合,具体取决于您的实际修改操作)。

一旦您销毁快照,块 38 将被标记为空闲并且可以被覆盖(只要没有其他快照引用它)。

  1. 当文件在快照后移动到 ZFS 中时,快照的大小是否基本上保持为零?

在同一文件系统内是的,除了元数据(例如,引用必须重新排列)。

在文件系统之间,这是完整的复制+删除操作,即使文件系统位于同一池或彼此的后代上也是如此。

  1. 当快照后在 ZFS 中重命名文件时,快照的大小是否基本上保持为零?

是的,除了元数据(例如您的新名字必须记录在某处)。

  1. 当文件在快照后具有其自身的硬链接副本时,快照是否基本上保持为空?

您能在这里说得更具体一些吗?

  1. 有人建议 BTRFS 的设计目的与 ZFS 大致相同,那么在这些条件下它是否会具有相同的行为?

我不会假设它所做的一切都是一样的。

  1. 当 Windows 计算机通过 SAMBA 远程访问 ZFS 共享时,上述相同行为是否成立,或者 SAMBA 是否是标准驱动器指令的子集(即移动变为复制+删除)?

Windows 文件共享有两种可能的实现 - 要么是 Sun 为 Solaris 开发并通过 OpenSolaris/illumos 开源的 CIFS 服务器,要么是几乎所有 GNU/Linux 发行版和 BSD 系统中使用的 Samba SMB 实现:

  • Solaris 版本更好地适应了 ZFS 功能(例如直接在文件系统上设置共享属性、将 ZFS 快照实现为 Windows 早期版本)。
  • 另一方面,Samba 版本更具跨平台性,并且具有一些更高级的功能,例如(部分)SMB3 支持、IIRC。

我认为在第二种情况下,您的情况与其他系统上的情况几乎相同,尽管我没有测试它。

  1. 是否可以笼统地回答上述问题,或者答案都是特定于实现的?

如果您喜欢阅读 C 代码,您可以根据 illumos/OpenZFS repo(Github 存储库)上的代码具体回答,也可以根据手册页和文档进行一般性回答。例如,其中详细解释了 REFER、USED 等属性。最有趣的联机帮助页是man zpool(硬件、磁盘布局、池属性)、man zfs(文件系统属性、快照、克隆)、man chmod(仅限 Solaris/illumos、文件和共享 ACL)和man zdb(调试和分析)。