NFS 和 SMB 是否支持稀疏文件?

win*_*ung 18 nfs server-message-block sparse-files

这个问题之前在堆栈溢出中被问到过,但那里的好人建议我试试这里的社区。

我正在研究与各种文件系统有关的稀疏文件,并试图找到一些具体的内容,说明网络文件系统 (NFS) 或服务器消息块 (SMB) 支持稀疏文件。

我知道 SMB 在 Windows 中被广泛使用,根据这个条目,即使底层文件系统不支持,SMB 服务器也可以支持稀疏文件。但是,如果我是对的,不支持稀疏文件的文件系统只会用零填充“漏洞”,这可能会导致性能问题。

关于 NFS,我无法找到有关使用 NFS 支持稀疏文件的任何信息。

因此,我的问题是,

NFS 和 SMB 是否支持稀疏文件?

sho*_*hok 12

NFS:它对稀疏文件有部分支持。基本上,它支持创建一个稀疏文件,但在读取时,文件被扩展为包含零。这意味着,虽然您可以通过 NFS 创建一个稀疏文件,但在读回相同的文件时,传输中的网络数据将包括在原始文件中找到的任何零。一个简单的测试表明该行为:

cd /mnt/nfs
truncate test.img -s 1G
ls -lh test.img
Run Code Online (Sandbox Code Playgroud)

-rw-r--r--。1 根 1.0G 10 月 26 日 11:29 test.img

du -hs test.img
Run Code Online (Sandbox Code Playgroud)

0 测试.img

如您所见,test.img 文件的磁盘大小为 0 字节。然而,回读它使用dd if=test.img of=/dev/null bs=1M iflag=direct节目

1024+0 条记录输入
1024+0 条记录输出
1073741824 字节 (1.1 GB) 复制,10.2269 秒,105 MB/s

很明显,在传输稀疏文件时,它被扩展为包括所有零。

NFSv4.2 将通过包含对稀疏文件网络传输的特殊处理进行扩展。换句话说,使用 NFSv4.2,上述操作dd几乎可以立即完成。

SMB:它具有与 NFS 相同的行为,至少在我的测试环境中,使用带有 CIFS v1 的 Samba v3.6.x 服务器和使用 mount.cifs 的 Linux 客户端。也许在 Windows 下它的行为有所不同......

  • @shodanshok:您的测试无效。在*确实*支持稀疏文件的文件系统上执行相同的命令会产生相同的结果。`dd` 逐块读取,无论底层文件系统是否支持稀疏文件,操作系统都会将空洞归零。在 ext4 上试试,你会看到相同的数字。 (2认同)
  • @shodanshok - 哦,我明白了,你看的是速度,而不是转移的金额。也许在您的回答中澄清这一点会有所帮助。对以稀疏方式存储的文件的规范测试是 `du -s` 与 `ls -l`,但你是对的,这对网络传输没有帮助;但在任何一种情况下(如`strace` 将确认)`dd` 正在读取整个文件,包括作为零的“洞”,区别仅在于“零”的来源(服务器端或客户端)。但是请注意(根据我的回答)NFS 4.2 *确实* 完全支持稀疏文件。 (2认同)

abl*_*igh 10

NFS

是的,NFS 4.2 完全支持稀疏文件(请参阅此规范文档此演示文稿)。

在 NFS 4.2 之前,NFS 客户端/服务器模型支持稀疏文件,因为 API 支持所有 POSIX 文件操作。这意味着在支持后备文件系统上的稀疏文件的服务器上写入稀疏文件会导致创建稀疏文件(而不是存储大量零)。但是读取文件会导致稀疏元素传输大量零。IE 的答案是“部分”。

NFS 4.2 增加了客户端“查看”文件中漏洞的能力,因此服务器不必传输所有这些零。从身份证:

1.4.3.  Sparse Files

Sparse files are ones which have unallocated or uninitialized data
blocks as holes in the file.  Such holes are typically transferred as
0s during I/O. READ_PLUS (see Section 15.10) allows a server to send
back to the client metadata describing the hole and DEALLOCATE (see
Section 15.4) allows the client to punch holes into a file.  In
addition, SEEK (see Section 15.11) is provided to scan for the next
hole or data from a given location.
Run Code Online (Sandbox Code Playgroud)

尽管规范支持稀疏文件,但懒惰的实现者可能会避免在客户端或服务器中实现对稀疏文件的支持。

中小企业

我对 SMB 了解较少,但我相信如果设置了相关的 FS 功能位,它也确实支持稀疏文件。请参阅此处了解更多信息。