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


81

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

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

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


Похоже, что FUSE может быть вариантом: kerneltrap.org/mailarchive/linux-kernel/2008/2/15/868564/thread
Stefan Lasiewski

Я просто задал себе тот же вопрос и использовал то же имя для каталога, который мне не удалось создать.
ixtmixilix

Ответы:


48

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

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


Фантастика - я использовал это как часть ответа на SO
Фил Лелло

1
примечание для людей, которые в конечном итоге имеют ошибки компиляции в этой программе: g++ -Wall -o nullfs nullfs.c++ `pkg-config fuse --cflags --libs`работал для меня.
ixtmixilix

Можете ли вы указать мне на другие реализации? Потому что я не могу найти
Freedo

@ Свобода Я подозреваю, что многие люди сделали это как учебное упражнение и оставили его без присмотра. Они могут не быть в Интернете больше.
Жиль

7

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

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

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


3
... при условии, что приложение выполняет системные вызовы через libc, а не напрямую через int 0x80/ syscall/ sysenter/ что-либо еще.
Руслан

1

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


этот подход не работает, к сожалению. Приложение умирает, если не может записать в этот файл.
Dogbane

1

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

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


1
Во многих системах удаление файла, открытого процессом, удаляет его запись в каталоге, но сам файл остается на диске до тех пор, пока он не будет закрыт последним процессом, использующим его. Процессы могут записывать файлы, а затем искать в начале и читать их обратно, поэтому ОС не может просто выбросить данные.
15

0

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

https://github.com/abbbi/nullfsvfs


-8

Просто символическую ссылку на этот каталог /dev/null

rm -rf ~/.logs
ln -s /dev/null ~/.logs

/dev/null, не должен быть каталогом. Если программа пытается выполнить запись ~/.logs/log1.dump, она все равно переходит в /dev/null.
Я делаю это для кеша Google Chrome, потому что через некоторое время он становится настолько большим, что запуск Chrome займет несколько минут.


3
Это не сработает, потому что символические ссылки - это файлы, а не каталоги. Попытка echo hello > ~/.logs/log1.dumpдает ~/.logs/log1.dump: Not a directory. Тем не менее, echo hello > ~/.logsработает, потому что .logs это файл.
Dogbane

2
Вы, должно быть, шутите над нами. $ ln -s /dev/null dev-null; touch dev-null/zzzдает мнеtouch: cannot touch 'dev-null/zzz': Not a directory
Алекс

1
Как я уже сказал, это работает для Chrome. Это мешает записи в кеш. Если это вызывает сбой программы запрашивающего, то, очевидно, он не проверяет, имеют ли файловые указатели NULL.
Jonescb

6
Это, вероятно, означает, что Chrome пропускает запись, если при открытии файла произошла ошибка.
Этого

Правда, изменение прав доступа к каталогу, вероятно, имело бы больше смысла.
Jonescb
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.