Ich möchte ein " /dev/null
" Verzeichnis (oder ein "blackhole" -Verzeichnis) erstellen, so dass alle darauf geschriebenen Dateien nicht wirklich geschrieben werden, sondern einfach verschwinden.
Ich habe eine Anwendung, die große temporäre Dateien in ein Verzeichnis schreibt. Ich habe keine Kontrolle über den Namen der Dateien und kümmere mich nicht wirklich um den Inhalt dieser Dateien. Ich könnte ein Skript schreiben, das diese Dateien regelmäßig blockiert, aber die Dateien werden sehr schnell ausgeschrieben und füllen meine Festplatte. Ich suche etwas Klügeres. Ich möchte, dass die Anwendung "denkt", dass sie diese Dateien ausschreibt, während die Schreibvorgänge am anderen Ende einfach verworfen werden.
Siehe auch diesen alten verwandten Thread.
quelle
Antworten:
Dies wird von Haus aus unter keinem mir bekannten Unix unterstützt, aber Sie können mit FUSE so ziemlich alles machen . Es gibt mindestens eine Implementierung von nullfs¹ , einem Dateisystem, in dem jede Datei existiert und sich so verhält
/dev/null
(dies ist nicht die einzige Implementierung, die ich jemals gesehen habe).¹ Nicht zu verwechseln mit * BSD nullfs , analog zu bindfs .
quelle
g++ -Wall -o nullfs nullfs.c++ `pkg-config fuse --cflags --libs`
Hat für mich gearbeitet.Ein anderer Ansatz wäre ein LD_PRELOAD-Wrapper. Im Grunde genommen eine kleine gemeinsam genutzte Bibliothek, die vor libc.so geladen wird und Aufrufe zum "Öffnen" mit etwas abfängt, das den potenziellen Dateipfad überprüft und "/ dev / null" ersetzt, wenn es sich im Zielverzeichnis befindet.
Dies hat den Vorteil, (a) vollständig im User-Space zu sein - kein Kernel-Hacking erforderlich; und (b) nur die einzelne fehlerhafte Anwendung betreffen.
Ein einfaches Beispiel finden Sie unter http://www.noah.org/wiki/LD_PRELOAD_notes . In Ihrem Fall möchten Sie jedoch die Systemaufrufe "open" und "creat" abfangen.
quelle
int 0x80
/syscall
/sysenter
/ was auch immer.Wenn das Programm so dumm ist, dass Sie diese Protokolle nicht ausschalten können, prüft es möglicherweise auch nicht nach Fehlern, nachdem Sie eine Protokolldatei geöffnet haben? Ich würde versuchen, ein Dummy-Nur-Lese-Dateisystem zu mounten (z
mount -o loop
. B. mit .)quelle
Sie sagen, dass das regelmäßige Entfernen der Dateien mit einem Skript nicht schnell genug ist. Könnten Sie mit einem Auslöser leben, der eine temporäre Datei jedes Mal löscht, wenn Ihre Anwendung mit dem Schreiben fertig ist und sie schließt? In diesem Fall können Sie die API "inotify" verwenden.
(Siehe http://en.wikipedia.org/wiki/Inotify und https://github.com/rvoicilas/inotify-tools/wiki/ )
quelle
Ich habe ein Kernel-Modul basierend auf dem RAMFS-Beispiel im Linux-Kernel erstellt. Es ist im Grunde ein Blackhole-Dateisystem mit dem Namen nullfsvfs. Die Implementierung des FUSE-Systems muss Daten vom Benutzer in den Kernelspeicher kopieren und ist im Vergleich zu einer direkten Implementierung als Kernelmodul recht langsam. Sehen:
https://github.com/abbbi/nullfsvfs
quelle
Verknüpfen Sie einfach dieses Verzeichnis mit
/dev/null
/dev/null
muss kein Verzeichnis sein. Wenn das Programm versucht zu schreiben,~/.logs/log1.dump
geht es trotzdem richtig hinein/dev/null
.Ich mache das für den Cache von Google Chrome, weil er nach einer Weile so groß wird, dass Chrome Minuten braucht, um zu starten.
quelle
echo hello > ~/.logs/log1.dump
gibt~/.logs/log1.dump: Not a directory
. Funktioniert jedoch,echo hello > ~/.logs
da .logs eine Datei ist.$ ln -s /dev/null dev-null; touch dev-null/zzz
gibt mirtouch: cannot touch 'dev-null/zzz': Not a directory