Принудительно блокировать устройство (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(), который все равно основан на файлах.

Другие вопросы по тегам