Принудительно блокировать устройство (NBD), чтобы обойти буферный кеш
Я хотел бы знать, есть ли способ заставить блочное устройство обойти буферный кеш linux (т.е. прямой ввод-вывод) и передать запросы непосредственно нижележащему уровню. Я знаю, что для этого можно открыть файл, используя флаг O_DIRECT, но моя программа - не пользователь блочного устройства, а файловая система. И до сих пор мне не повезло, когда я говорил различным FS об использовании прямого ввода-вывода.
Таким образом, я хочу использовать функциональность необработанных устройств без использования необработанных устройств (поскольку они устарели в моем дистрибутиве Fedora).
Если это имеет какое-либо значение, моим блочным устройством является сетевое блочное устройство. Любая помощь будет оценена.
2 ответа
Вы можете добиться этого, подключив с помощью опции синхронизации.
От mount(8)
Страница человека:
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.
Я не думаю, что возможно иметь прямой ввод-вывод без использования O_DIRECT или необработанных устройств. Использование опции синхронизации при монтировании также не обойдет буферный кеш.
Поскольку вы не можете установить его из файловой системы, вам придется изменить свою программу, чтобы использовать O_DIRECT или mmap() и madvise(), чтобы получить похожее поведение.
"Я знаю, что для этого можно открыть файл, используя флаг O_DIRECT, но моя программа не пользователь блочного устройства, а файловая система".
Не беспокойтесь о том, что ваша программа не является пользователем, O_DIRECT работает для open(), который все равно основан на файлах.