it-swarm-eu.dev

Jak mohu vytvořit adresář typu "blackhole" podobný / dev / null?

Chtěl bych vytvořit "/dev/null "adresář (nebo" blackhole "adresář) takový, že žádné soubory zapsané do něj nejsou skutečně zapsány, ale prostě zmizí.

Mám aplikaci, která zapisuje velké dočasné soubory do adresáře. Nemám kontrolu nad názvem souborů a opravdu se nestarám o obsah těchto souborů. Mohl bych napsat skript, který tyto soubory periodicky zatváří, ale soubory se velmi rychle zapisují a vyplňují disk. Hledám něco chytřejšího. Chci, aby aplikace „myslela“ na to, že tyto soubory zapisuje, zatímco ve skutečnosti jsou zápisy právě vyřazeny na druhém konci.

Viz také this staré související vlákno.

84
dogbane

Toto není podporováno v jakémkoli unixu, který znám, ale s Fuse můžete dělat téměř cokoli. Existuje alespoň jedna implementace nullfs¹ , souborový systém, kde každý soubor existuje a chová se jako /dev/null (toto není jediná implementace, jakou jsem kdy viděl).

¹ Nesmí se zaměňovat s * BSD nullfs , což je analogické s bindfs .

Dalším přístupem by byl obal LD_PRELOAD; v podstatě malá sdílená knihovna, která je načtena před libc.so, a zachycuje volání na „open“ s něčím, co kontroluje potenciální cestu k souboru a nahrazuje „/ dev/null“, pokud by byla v cílovém adresáři.

To má tu výhodu, že je (a) zcela v uživatelském prostoru - nevyžaduje se hackování jádra; a (b) ovlivňující pouze jedinou žádost o udělení oprávnění.

Jednoduchý příklad je na http://www.noah.org/wiki/LD_PRELOAD_notes , ale ve vašem případě budete chtít zachytit systémová volání „otevřený“ a „vyzvednout“.

8
Martin Kealey

Pokud je program tak hloupý, že vám nedovolí tyto protokoly vypnout, je možné, že po otevření souboru protokolu nekontroluje chyby? Zkusil bych připojit nějaký fiktivní systém souborů jen pro čtení (např. Pomocí mount -o loop.)

1
alex

Říkáte, že pravidelné odstraňování souborů skriptem není dost rychlé. Mohli byste žít s triggerem, který odstraní dočasný soubor, kdykoli aplikace dokončí zápis a zavře jej? Pokud ano, můžete použít API „inotify“.

(Viz http://en.wikipedia.org/wiki/Inotify a https://github.com/rvoicilas/inotify-tools/wiki/ )

1
Elliot Nelson

vytvořil jsem modul jádra založený na příkladu ramfs v linuxovém jádře, je to v podstatě blackhole souborový systém zvaný nullfsvfs. Implementace systému Fuse musí kopírovat data od uživatele do jádra a je poměrně pomalá ve srovnání s přímou implementací jako modul jádra. Vidět:

https://github.com/abbbi/nullfsvfs

1
michael