哪些文件系统支持通过Linux的splice(2)进行拼接?

19
splice系统调用的man页面指出,如果以下情况之一发生,splice可能会失败并将errno设置为EINVAL

目标文件系统不支持splice;两个描述符中没有一个是pipe;或者针对不可寻址设备给出偏移量。

哪些文件系统支持splice?


5
为什么有些人认为这篇文章应该发布在 Serverfault 上? - sigjuice
4
不错的信息。之前不知道splice。系统调用通常由程序员调用和实现。因此,我认为这是一个合理的堆栈溢出问题。 - dmeister
1
如果您有一个程序想要拼接输出文件,并且正在选择要在其上运行该程序的文件系统,那么这是一个系统管理员的问题,而不是一个编程问题。看起来这就是被问到的内容。 - Peter Cordes
2个回答

17

我的原始回答部分不正确,这是一个重大改写。

Linux 2.6.30.10 及以下版本

在 Linux 2.6.30.10 和更早版本中,splice 在源文件系统或目标文件系统不支持 splicing 时会返回 EINVAL。以下是支持 splicing 的文件系统

  • 在读模式下支持:adfs、affs、afs、bfs、btrfs、coda、ecryptfs、exofs、ext2、ext3、ext4、fat、fuse、hpfs、jffs2、jfs、minix、nfs、nilfs2、ntfs、ocfs2、omfs、qnx4、reiserfs、smbfs、sysv、ubifs、udf、ufs。
  • 在写模式下支持:exofs、ext2、ext3、ext4、jfs、ocfs2、reiserfs、ubifs。

详情请参见:do_splice_to() 函数中“文件到管道”情况下和 do_splice_from() 函数中“管道到文件”情况下,对 splicing 的支持是如何确定的。这是通过检查相关的 struct file_operations 是否包含 .splice_read.splice_write 来完成的。我为了产生上述文件系统列表,已经通过 fs/*/file.c 中的 .splice_read.splice_write 进行了 grepped 搜索。

Linux 2.6.31 及以上版本

从Linux 2.6.31开始,所有的文件系统都支持读写模式下的splice操作

详细情况如下:当文件系统的struct file_operations中没有.splice_read.splice_write时,会使用回退函数default_file_splice_readdefault_file_splice_write。请参见do_splice_to()do_splice_from()以了解实现细节。注意:文档中列出的其他原因仍可能导致返回EINVAL错误。


我注意到从Linux 2.6.31开始,每个文件系统都有一个回退拼接。因此需要进行重大改写。 - Bolo
1
那么Linux 2.6.31及以上版本也支持与FUSE文件系统之间的拼接吗? - Daniel Trebbien
1
@Daniel 我已经成功地在我的Linux 2.6.32-23上运行了这个问题的代码:https://dev59.com/lEnSa4cB1Zd3GeqPRdfs,并将fuse文件系统(通过sshfs)作为目标。 - Bolo

0
根据this的说法,EXT3是支持的。看来对于任何FUSE文件系统,你可能运气不佳。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接