it-swarm-ru.tech

Как я могу создать / dev / null-подобный каталог "черная дыра"?

Я хотел бы создать "/dev/null "каталог (или каталог" черная дыра "), так что любые файлы, записанные в него, на самом деле не пишутся, а просто исчезают.

У меня есть приложение, которое записывает большие временные файлы в каталог. У меня нет контроля над именами файлов, и меня не волнует содержание этих файлов. Я мог бы написать скрипт, который периодически забивает эти файлы, но файлы записываются очень быстро и заполняют мой диск. Я ищу что-то умнее. Я хочу, чтобы приложение "думало", что оно записывает эти файлы, тогда как на самом деле записи просто отбрасываются на другом конце.

Также смотрите это старая связанная тема.

84
dogbane

Это не поддерживается в готовом виде на любом Unix, который я знаю, но вы можете делать практически все что угодно с Fuse . По крайней мере, одна реализация nullfs¹ , файловая система, в которой каждый файл существует и ведет себя как /dev/null (это не единственная реализация, которую я когда-либо видел).

¹ Не путать с * BSD nullfs , что аналогично bindfs .

49
Gilles 'SO- stop being evil'

Другой подход - обертка LD_PRELOAD; в основном небольшая разделяемая библиотека, которая загружается до libc.so и перехватывает вызовы "open" с чем-то, что проверяет предполагаемый путь к файлу и подставляет "/ dev/null", если он будет в целевом каталоге.

Это имеет то преимущество, что (а) полностью в пользовательском пространстве - взлом ядра не требуется; и (б) влияет только на одну ошибочную заявку.

Простой пример на http://www.noah.org/wiki/LD_PRELOAD_notes , но в вашем случае вы захотите перехватить системные вызовы "open" и "creat".

8
Martin Kealey

Если программа настолько глупа, что не позволяет отключить эти журналы, может быть, она также не проверяет ошибки после открытия файла журнала? Я бы попытался смонтировать фиктивную файловую систему только для чтения (например, используя mount -o loop.)

1
alex

Вы говорите, что удаление файлов периодически с помощью скрипта не достаточно быстро. Не могли бы вы жить с триггером, который удаляет временный файл каждый раз, когда ваше приложение заканчивает запись и закрывает его? Если это так, вы можете использовать API inotify.

(См. http://en.wikipedia.org/wiki/Inotify и https://github.com/rvoicilas/inotify-tools/wiki/ )

1
Elliot Nelson

я создал модуль ядра, основанный на примере ramfs в ядре Linux, это в основном файловая система blackhole под названием nullfsvfs. Реализация системы Fuse требует копирования данных от пользователя в пространство ядра и является довольно медленной по сравнению с прямой реализацией в качестве модуля ядра. Видеть:

https://github.com/abbbi/nullfsvfs

1
michael