![NFS](https://linux22.com/image/669495/NFS.png)
这个问题之前是在 stack overflow 中提出的,但是那里的好心人建议我尝试这里的社区。
我正在研究与各种文件系统有关的稀疏文件,并试图找到一些具体的东西来表明网络文件系统(NFS)或服务器消息块(SMB)支持稀疏文件。
据我所知,SMB 在 Windows 中被广泛使用,并且根据入口,即使底层文件系统不支持,SMB 服务器也可以支持稀疏文件。但是,如果我没记错的话,不支持稀疏文件的文件系统只会用零填充“空洞”,这可能会导致性能问题。
关于 NFS,我还没有找到有关使用 NFS 支持稀疏文件的任何信息。
因此,我的问题是,
NFS 和 SMB 是否支持稀疏文件?
答案1
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 测试.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 下它的行为有所不同...
答案2
NFS
是的,NFS 4.2 完全支持稀疏文件(请参阅这份权威文献和本次演讲)。
在 NFS 4.2 之前,NFS 客户端/服务器模型支持稀疏文件,因为 API 支持所有 POSIX 文件操作。这意味着在支持后备文件系统上的稀疏文件的服务器上写入稀疏文件会导致创建稀疏文件(而不是存储大量零)。但读取文件会导致为稀疏元素传输大量零。即答案是“部分”。
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 功能位,它也支持稀疏文件。请参阅这里了解更多信息。