强制块设备 (NBD) 绕过缓冲区缓存

强制块设备 (NBD) 绕过缓冲区缓存

我想知道是否有办法强制块设备绕过 Linux 缓冲区缓存(即直接 IO)并将请求直接传递到底层。我知道可以使用 O_DIRECT 标志打开文件来实现这一点,但我的程序不是块设备的用户,文件系统才是。到目前为止,我还没有成功告诉各种 FS 使用直接 IO。

总之,我想要原始设备功能而不使用原始设备(因为它们在我的发行版 Fedora 中已被弃用)。

如果这很重要,我的块设备是网络块设备。任何帮助都将不胜感激。

答案1

您可以通过使用同步选项进行安装来实现这一点。

来自mount(8)-man 页面:

   sync   All I/O to the filesystem should be done synchronously. In  case
          of  media  with  limited number of write cycles (e.g. some flash
          drives) "sync" may cause life-cycle shortening.

答案2

我认为不使用 O_DIRECT 或原始设备就不可能实现直接 I/O。在挂载时使用同步选项也不会绕过缓冲区缓存。

因为您无法从文件系统设置它,所以您必须修改程序以使用 O_DIRECT 或 mmap() 和 madvise() 来获得类似的行为。

“我知道可以使用 O_DIRECT 标志打开文件来实现这一点,但我的程序不是块设备的用户,而是文件系统。”

不要担心你的程序不是用户,O_DIRECT 适用于基于文件的 open()。

相关内容