it-swarm.it

Come posso creare una directory "blackhole" come / dev / null?

Vorrei creare un "/dev/null "directory (o una directory" blackhole ") in modo tale che tutti i file scritti su di essa non vengano realmente scritti, ma scompaiano.

Ho un'applicazione che scrive file temporanei di grandi dimensioni in una directory. Non ho alcun controllo sul nome dei file e non mi interessa davvero il contenuto di questi file. Potrei scrivere uno script che periodicamente blocca questi file, ma i file vengono scritti molto rapidamente e riempiono il mio disco. Sto cercando qualcosa di più intelligente. Voglio che l'applicazione "pensi" che sta scrivendo questi file, mentre in realtà le scritture vengono scartate dall'altra parte.

Vedi anche questo vecchio thread correlato.

84
dogbane

Questo non è supportato e pronto all'uso su qualsiasi unix che conosco, ma puoi fare praticamente qualsiasi cosa con Fuse . C'è almeno n'implementazione di nullfs¹ , un filesystem in cui ogni file esiste e si comporta come /dev/null (questa non è l'unica implementazione che abbia mai visto).

¹ Da non confondere con * BSD nullfs , che è analogo a bindfs .

Un altro approccio sarebbe un wrapper LD_PRELOAD; fondamentalmente una piccola libreria condivisa che viene caricata prima di libc.so e intercetta le chiamate per "aprire" con qualcosa che controlla il potenziale percorso del file e sostituisce "/ dev/null" se fosse nella directory di destinazione.

Questo ha il vantaggio di essere (a) interamente nello spazio utente - non è richiesto l'hacking del kernel; e (b) riguarda solo la singola domanda errante.

Un semplice esempio è http://www.noah.org/wiki/LD_PRELOAD_notes , ma nel tuo caso vorrai intercettare le chiamate di sistema "open" e "creat".

8
Martin Kealey

Se il programma è così stupido da non consentire di disattivare quei log, potrebbe anche non verificare la presenza di errori dopo l'apertura di un file di log? Proverei a montare un file system fittizio di sola lettura (ad es. Usando mount -o loop.)

1
alex

Dici che la rimozione periodica dei file con uno script non è abbastanza veloce. Potresti vivere con un trigger che elimina un file temporaneo ogni volta che l'applicazione termina di scrivere e lo chiude? In tal caso, è possibile utilizzare l'API "inotify".

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

1
Elliot Nelson

ho creato un modulo del kernel basato sull'esempio di ramfs nel kernel di Linux, è fondamentalmente un filesystem blackhole chiamato nullfsvfs. L'implementazione del sistema Fuse deve copiare i dati dall'utente nel kernelspace ed è piuttosto lenta, rispetto a un'implementazione diretta come modulo kernel. Vedere:

https://github.com/abbbi/nullfsvfs

1
michael