Answers:
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下它的行为有所不同...
dd
逐块读取数据,以及基础文件系统是否支持稀疏文件,操作系统会将空洞变为零。在ext4上尝试,您将看到相同的数字。
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
du -s
vs ls -l
,但是您是正确的,这对网络传输没有帮助;但无论哪种情况(如strace
将确认的那样)dd
都在读取整个文件,其中包括“空洞”为零,区别仅在于“零”的起源(服务器或客户端)。但是请注意(根据我的回答),NFS 4.2 确实完全支持稀疏文件。
是的,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功能位,我相信它也支持稀疏文件。有关更多信息,请参见此处。