FUSE I/O 模式

FUSE 支持以下 I/O 模式:

  • direct-io

  • 缓存 + 写直通 + 写回缓存

direct-io 模式可在 FUSE_OPEN 回复中通过 FOPEN_DIRECT_IO 标志选择。

在 direct-io 模式下,读写操作会完全绕过页缓存。不进行预读。共享 mmap 默认禁用。要允许共享 mmap,可以在 FUSE_INIT 回复中启用 FUSE_DIRECT_IO_ALLOW_MMAP 标志。

在缓存模式下,读取可以从页缓存中满足,内核可能会预读数据以填充缓存。对文件进行任何写入后,缓存始终保持一致。支持所有 mmap 模式。

缓存模式有两种子模式,控制写入的处理方式。写直通模式是默认模式,并受所有内核支持。写回缓存模式可在 FUSE_INIT 回复中通过 FUSE_WRITEBACK_CACHE 标志选择。

在写直通模式下,每个写入都会立即作为一个或多个 WRITE 请求发送到用户空间,同时更新任何已缓存的页(并缓存先前未缓存但已完全写入的页)。写入时不会发送 READ 请求,因此当未缓存的页被部分写入时,该页会被丢弃。

在写回缓存模式下(通过 FUSE_WRITEBACK_CACHE 标志启用),写入只进入缓存,这意味着 write(2) 系统调用通常可以非常快地完成。脏页会隐式地(后台回写或内存压力下的页回收)或显式地(由 close(2)、fsync(2) 调用,以及当文件上的最后一个引用在 munmap(2) 上被释放时)写回。此模式假定对文件系统的所有更改都通过 FUSE 内核模块进行(大小和 atime/ctime/mtime 属性由内核保持最新),因此通常不适用于网络文件系统。如果写入部分页,则需要首先从用户空间读取该页。这意味着,即使对于以 O_WRONLY 模式打开的文件,内核也可能生成 READ 请求。