我想知道是否有办法强制块设备绕过 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()。