Je souhaite créer un /dev/null
répertoire " " (ou un "trou noir") tel que tous les fichiers qui y sont écrits ne soient pas écrits, mais disparaissent.
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 clobe périodiquement ces fichiers, mais ceux-ci sont écrits très rapidement et remplissent mon disque. Je cherche quelque chose d'intelligent. Je veux que l'application "pense" qu'elle est en train d'écrire ces fichiers, alors qu'en réalité, les écritures sont en train d'être ignorées à l'autre bout.
Voir aussi cet ancien fil de discussion.
filesystems
directory
io-redirection
dogbane
la source
la source
Réponses:
Ce n'est pas pris en charge immédiatement sur les Unix que je connais, mais vous pouvez faire à peu près n'importe quoi avec FUSE . Il y a au moins une implémentation de nullfs¹ , un système de fichiers dans lequel chaque fichier existe et se comporte comme tel
/dev/null
(ce n'est pas la seule implémentation que j'ai jamais vue).¹ Ne pas confondre avec * BSD nullfs , analogue à bindfs .
la source
g++ -Wall -o nullfs nullfs.c++ `pkg-config fuse --cflags --libs`
travaillé pour moi.Une autre approche serait un wrapper LD_PRELOAD; En gros, une petite bibliothèque partagée chargée avant libc.so intercepte les appels à "open" avec quelque chose qui vérifie le chemin du fichier prospectif et substitue "/ dev / null" s'il se trouvait dans le répertoire cible.
Cela a l’avantage d’être (a) entièrement dans l’espace utilisateur - aucun piratage du noyau n’est requis; et b) n’affectant que la demande unique errante.
Un exemple simple est à http://www.noah.org/wiki/LD_PRELOAD_notes , mais dans votre cas, vous voudrez intercepter les appels système "ouverts" & "creat".
la source
int 0x80
/syscall
/sysenter
/ quoi que ce soit d'autre.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 avoir ouvert un fichier journal? Je voudrais essayer de monter un système de fichiers factice en lecture seule (par exemple, en utilisant
mount -o loop
.)la source
Vous dites que supprimer les fichiers périodiquement 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 l'écriture et le ferme? Si tel est le cas, vous pouvez utiliser l’API "inotify".
(Voir http://en.wikipedia.org/wiki/Inotify et https://github.com/rvoicilas/inotify-tools/wiki/ )
la source
J'ai créé un module de noyau basé sur l'exemple ramfs du noyau linux, il s'agit essentiellement d'un système de fichiers blackhole 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, comparée à une implémentation directe sous forme de module noyau. Voir:
https://github.com/abbbi/nullfsvfs
la source
Il suffit de faire un lien symbolique vers ce répertoire
/dev/null
/dev/null
, ne doit pas nécessairement être un répertoire. Si le programme essaie d'écrire~/.logs/log1.dump
, il continue tout de suite/dev/null
.Je fais cela pour le cache de Google Chrome, car après un certain temps, il devient si gros qu'il ne faudra que quelques minutes à Chrome pour démarrer.
la source
echo hello > ~/.logs/log1.dump
donne~/.logs/log1.dump: Not a directory
. Cependant, celaecho hello > ~/.logs
fonctionne car .logs est un fichier.$ ln -s /dev/null dev-null; touch dev-null/zzz
me donnetouch: cannot touch 'dev-null/zzz': Not a directory