Chciałbym utworzyć /dev/null
katalog „ ” (lub katalog „blackhole”), tak aby wszelkie zapisane w nim pliki nie były tak naprawdę zapisane, ale po prostu zniknęły.
Mam aplikację, która zapisuje duże pliki tymczasowe do katalogu. Nie mam kontroli nad nazwami plików i tak naprawdę nie dbam o ich zawartość. Mógłbym napisać skrypt, który okresowo blokuje te pliki, ale pliki są zapisywane bardzo szybko i zapełniają mój dysk. Szukam czegoś mądrzejszego. Chcę, aby aplikacja „myślała”, że zapisuje te pliki, podczas gdy w rzeczywistości zapisy są po prostu odrzucane na drugim końcu.
Zobacz także ten stary powiązany wątek.
filesystems
directory
io-redirection
dogbane
źródło
źródło
Odpowiedzi:
Nie jest to obsługiwane od razu po zainstalowaniu na żadnym unixie, który znam, ale z FUSE możesz zrobić prawie wszystko . Istnieje co najmniej jedna implementacja nullfs¹ , systemu plików, w którym każdy plik istnieje i zachowuje się tak
/dev/null
(nie jest to jedyna implementacja, jaką kiedykolwiek widziałem).¹ Nie należy mylić z nullfs * BSD , który jest analogiczny do bindfs .
źródło
g++ -Wall -o nullfs nullfs.c++ `pkg-config fuse --cflags --libs`
pracowała dla mnie.Innym podejściem byłoby opakowanie LD_PRELOAD; w zasadzie mała biblioteka współdzielona, która jest ładowana przed libc.so i przechwytuje wywołania „open” z czymś, co sprawdza przyszłą ścieżkę do pliku i zastępuje „/ dev / null”, jeśli byłaby w katalogu docelowym.
Ma to tę zaletę, że (a) jest całkowicie w przestrzeni użytkownika - nie wymaga hakowania jądra; oraz (b) wpływ tylko na jeden błędny wniosek.
Prostym przykładem jest http://www.noah.org/wiki/LD_PRELOAD_notes , ale w twoim przypadku będziesz chciał przechwycić wywołania systemowe „otwarte” i „twórcze”.
źródło
int 0x80
/syscall
/sysenter
/ cokolwiek innego.Jeśli program jest tak głupi, że nie pozwala ci wyłączyć tych logów, to może nie sprawdza też błędów po otwarciu pliku dziennika? Spróbowałbym zamontować fikcyjny system plików tylko do odczytu (np
mount -o loop
. Używając .)źródło
Mówisz, że okresowe usuwanie plików za pomocą skryptu nie jest wystarczająco szybkie. Czy możesz żyć z wyzwalaczem, który usuwa plik tymczasowy za każdym razem, gdy aplikacja kończy zapisywanie i zamyka go? Jeśli tak, możesz skorzystać z interfejsu API „inotify”.
(Zobacz http://en.wikipedia.org/wiki/Inotify i https://github.com/rvoicilas/inotify-tools/wiki/ )
źródło
stworzyłem moduł jądra oparty na przykładzie ramfs w jądrze Linuksa, jest to w zasadzie system plików blackhole o nazwie nullfsvfs. Implementacja systemu FUSE musi kopiować dane od użytkownika do przestrzeni jądra i jest dość wolna, w porównaniu do prostej implementacji jako modułu jądra. Widzieć:
https://github.com/abbbi/nullfsvfs
źródło
Wystarczy dowiązać symbolicznie do tego katalogu
/dev/null
/dev/null
, nie musi być katalogiem. Jeśli program próbuje pisać do~/.logs/log1.dump
, nadal działa/dev/null
.Robię to dla pamięci podręcznej przeglądarki Google Chrome, ponieważ po chwili staje się ona tak duża, że jej uruchomienie zajmie kilka minut.
źródło
echo hello > ~/.logs/log1.dump
daje~/.logs/log1.dump: Not a directory
.echo hello > ~/.logs
Działa jednak, ponieważ .logs jest plikiem.$ ln -s /dev/null dev-null; touch dev-null/zzz
daje mitouch: cannot touch 'dev-null/zzz': Not a directory