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


18

该问题以前是在堆栈溢出中提出的,但是那里的好人建议我改为在这里尝试社区。

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

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

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

因此,我的问题是

NFS和SMB支持稀疏文件吗?

Answers:


12

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

cd /mnt/nfs
truncate test.img -s 1G
ls -lh test.img

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

du -hs test.img

0 test.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 s,105 MB / s

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

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

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


灿NFS支持稀疏文件如果NFS服务器的底层的文件系统根本支持稀疏文件?
安德鲁·亨利

2
@shodanshok:您的测试无效。在支持稀疏文件的文件系统上执行相同的命令将产生相同的结果。dd逐块读取数据,以及基础文件系统是否支持稀疏文件,操作系统会将空洞变为零。在ext4上尝试,您将看到相同的数字。
2015年

如果基础FS不支持稀疏文件,则@ AndrewHenle,NFS如何公开不存在的支持?无论如何,如今很难找到没有稀疏文件支持的文件系统,因为所有最新的(ext3 / 4,xfs等)Linux文件系统都支持该功能。
shodanshok 2015年

1
@abligh你错了。dd在本地的稀疏文件上执行命令将获得更快的结果。参见示例:,root@hubble:~# truncate -s 1G test.img root@hubble:~# dd if=test.img of=/dev/null bs=1M iflag=direct 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB) copied, 0.10478 s, 10.2 GB/s如您所见,读取本地稀疏文件可使I / O速度达到10 GB / s
shodanshok

2
@shodanshok-哦,我明白了,您正在查看的是速度,而不是转账的金额。也许澄清一下您的答案会有所帮助。对以稀疏方式存储文件的规范测试是du -svs ls -l,但是您是正确的,这对网络传输没有帮助;但无论哪种情况(如strace将确认的那样)dd都在读取整个文件,其中包括“空洞”为零,区别仅在于“零”的起源(服务器或客户端)。但是请注意(根据我的回答),NFS 4.2 确实完全支持稀疏文件。
2015年

10

NFS

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

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

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

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.

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

中小型企业

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.