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

这个问题以前被问到堆栈溢出,但那里的好人build议我尝试在这里的社区。

我正在研究关于各种文件系统的稀疏文件,并试图find一些具体的说明稀疏文件是由networking文件系统(NFS)或服务器消息块(SMB)支持的。

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

关于NFS,我一直无法find关于使用NFS支持稀疏文件的任何事情。

因此,我的问题是,

NFS和SMB支持稀疏文件吗?

NFS:它有一个稀疏文件的部分支持。 基本上,它支持创build一个稀疏文件,但是在读取时,文件被扩展为包含零。 这意味着,尽pipe您可以通过NFS创build一个稀疏文件,但在读取完全相同的文件时,在途networking数据将包含原始文件中find的任何零。 一个简单的testing表明,行为:

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读取它dd if=test.img of=/dev/null bs=1M iflag=direct显示

1024 + 0的logging
1024 + 0logging
1073741824字节(1.1 GB)复制,10.2269 s,105 MB / s

很明显,在传输稀疏文件时,它将被扩展为包含全零。

NFSv4.2将通过包含对稀疏文件的networking传输的特殊处理来扩展。 换句话说,在NFSv4.2中,上面的dd会立即完成。

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

NFS

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

在NFS 4.2之前,NFS客户端/服务器模型支持稀疏文件,因为API支持所有的POSIX文件操作。 这意味着在支持文件系统上支持稀疏文件的服务器上编写稀疏文件会导致创build一个稀疏文件(而不是存储大量的零)。 但是读取文件会导致稀疏元素传输大量的零。 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. 

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

SMB

我对SMB的了解不多,但是我相信如果设置了相关的FSfunction位,它也支持稀疏文件。 在这里看到更多的信息。