web-dev-qa-db-fra.com

Comment puis-je créer un répertoire "blackhole" de type / dev / null?

Je voudrais créer un "/dev/null "(ou un répertoire" blackhole ") de sorte que tous les fichiers qui y sont écrits ne sont pas vraiment écrits, mais disparaissent simplement.

J'ai une application qui écrit de gros fichiers temporaires dans un répertoire. Je n'ai aucun contrôle sur le nom des fichiers et je ne me soucie pas vraiment du contenu de ces fichiers. Je pourrais écrire un script qui encombre périodiquement ces fichiers, mais les fichiers sont écrits très rapidement et remplissent mon disque. Je cherche quelque chose de plus intelligent. Je veux que l'application "pense" qu'elle écrit ces fichiers, alors qu'en fait, les écritures sont simplement rejetées à l'autre extrémité.

Voir aussi this ancien fil associé.

84
dogbane

Ce n'est pas pris en charge sur la base d'unix que je connais, mais vous pouvez faire à peu près n'importe quoi avec Fuse . Il y a au moins ne implémentation de nullfs¹ , un système de fichiers où chaque fichier existe et se comporte comme /dev/null (ce n'est pas la seule implémentation que j'ai jamais vue).

¹ À ne pas confondre avec le * BSD nullfs , qui est analogue à bindfs .

Une autre approche serait un wrapper LD_PRELOAD; essentiellement une petite bibliothèque partagée qui est chargée avant libc.so, et intercepte les appels à "ouvrir" avec quelque chose qui vérifie le chemin du fichier potentiel et remplace "/ dev/null" s'il se trouve dans le répertoire cible.

Cela a l'avantage d'être (a) entièrement dans l'espace utilisateur - aucun piratage du noyau requis; et b) affectant uniquement la seule demande erronée.

Un exemple simple est à http://www.noah.org/wiki/LD_PRELOAD_notes , mais dans votre cas, vous voudrez intercepter les appels système "open" & "creat".

8
Martin Kealey

Si le programme est tellement stupide de ne pas vous permettre de désactiver ces journaux, peut-être qu'il ne vérifie pas non plus les erreurs après l'ouverture d'un fichier journal? J'essaierais de monter un système de fichiers factice en lecture seule (par exemple, en utilisant mount -o loop.)

1
alex

Vous dites que la suppression périodique des fichiers avec un script n'est pas assez rapide. Pourriez-vous vivre avec un déclencheur qui supprime un fichier temporaire à chaque fois que votre application termine d'écrire et le ferme? Si c'est le cas, vous pouvez utiliser l'API "inotify".

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

1
Elliot Nelson

j'ai créé un module de noyau basé sur l'exemple de ramfs dans le noyau linux, il s'agit essentiellement d'un système de fichiers à trou noir appelé nullfsvfs. L'implémentation du système Fuse doit copier les données de l'utilisateur vers l'espace noyau et est assez lente, par rapport à une implémentation simple en tant que module noyau. Voir:

https://github.com/abbbi/nullfsvfs

1
michael