¿Cómo puedo crear un directorio "blackhole" / dev / null-like?

81

Me gustaría crear un /dev/nulldirectorio " " (o un directorio "agujero negro") para que los archivos escritos en él no se escriban realmente, sino que simplemente desaparezcan.

Tengo una aplicación que escribe archivos temporales grandes en un directorio. No tengo control sobre el nombre de los archivos y realmente no me importa el contenido de estos archivos. Podría escribir un script que periódicamente registra estos archivos, pero los archivos se escriben muy rápidamente y llenan mi disco. Estoy buscando algo más inteligente. Quiero que la aplicación "piense" que está escribiendo estos archivos, cuando de hecho, las escrituras simplemente se descartan en el otro extremo.

También vea este viejo hilo relacionado.

dogbane
fuente
Parece que FUSE podría ser una opción: kerneltrap.org/mailarchive/linux-kernel/2008/2/15/868564/thread
Stefan Lasiewski
Me hice la misma pregunta y usé el mismo nombre para el directorio que no pude crear.
ixtmixilix

Respuestas:

48

Esto no es compatible de fábrica en ningún Unix que conozca, pero puedes hacer casi cualquier cosa con FUSE . Hay al menos una implementación de nullfs¹ , un sistema de archivos donde cada archivo existe y se comporta como /dev/null(esta no es la única implementación que he visto).

¹ No debe confundirse con los * BSD nullfs , que es análogo a bindfs .

Gilles
fuente
Fantástico - He usado esto como parte de una respuesta en SO
Phil Lello
1
una nota para las personas que terminan con errores de compilación en ese programa: g++ -Wall -o nullfs nullfs.c++ `pkg-config fuse --cflags --libs`funcionó para mí.
ixtmixilix
¿Me puede indicar otras implementaciones? Porque no puedo encontrar ninguno
Freedo
@Freedo Sospecho que muchas personas lo han hecho como un ejercicio de aprendizaje y lo dejaron sin mantenimiento. Puede que ya no estén en la web.
Gilles
7

Otro enfoque sería un contenedor LD_PRELOAD; básicamente una pequeña biblioteca compartida que se carga antes de libc.so, e intercepta las llamadas para "abrir" con algo que verifica la posible ruta del archivo y sustituye "/ dev / null" si estuviera en el directorio de destino.

Esto tiene la ventaja de estar (a) completamente en el espacio de usuario: no se requiere piratería de kernel; y (b) solo afecta a la solicitud única errónea.

Un ejemplo simple se encuentra en http://www.noah.org/wiki/LD_PRELOAD_notes , pero en su caso querrá interceptar las llamadas del sistema "abierto" y "creativo".

Martin Kealey
fuente
3
... suponiendo que la aplicación realiza llamadas del sistema a través de libc, no directamente a través de int 0x80/ syscall/ sysenter/ lo que sea.
Ruslan
1

Si el programa es tan estúpido como para no permitirle desactivar esos registros, ¿es posible que tampoco compruebe si hay errores después de abrir un archivo de registro? Intentaría montar un sistema de archivos ficticio de solo lectura (por ejemplo, usando mount -o loop).

alex
fuente
Este enfoque no funciona desafortunadamente. La aplicación muere si no puede escribir en este archivo.
dogbane
1

Dices que eliminar los archivos periódicamente con un script no es lo suficientemente rápido. ¿Podría vivir con un disparador que elimina un archivo temporal cada vez que su aplicación termina de escribir y lo cierra? Si es así, puede hacer uso de la API "inotify".

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

Elliot Nelson
fuente
1
En muchos sistemas, la eliminación de un archivo que un proceso ha abierto elimina su entrada de directorio, pero el archivo en sí permanece en el disco hasta que se cierra el último proceso que lo utilizó. Los procesos pueden escribir archivos y luego buscarlos al principio y volver a leerlos, por lo que el sistema operativo no puede simplemente tirar los datos.
interfecto
0

He creado un módulo de kernel basado en el ejemplo de ramfs en el kernel de linux, es básicamente un sistema de archivos blackhole llamado nullfsvfs. La implementación del sistema FUSE necesita copiar datos del usuario al espacio del núcleo y es bastante lenta, en comparación con una implementación directa como módulo del núcleo. Ver:

https://github.com/abbbi/nullfsvfs

Miguel
fuente
-8

Simplemente enlace simbólicamente ese directorio a /dev/null

rm -rf ~/.logs
ln -s /dev/null ~/.logs

/dev/null, no tiene que ser un directorio. Si el programa intenta escribir en ~/.logs/log1.dump, todavía entra directamente /dev/null.
Hago esto para el caché de Google Chrome porque después de un tiempo se vuelve tan grande que Chrome tardará minutos en comenzar.

jonescb
fuente
3
Esto no funcionaría porque los enlaces simbólicos son archivos, no directorios. Tratando echo hello > ~/.logs/log1.dumpda ~/.logs/log1.dump: Not a directory. Sin embargo, echo hello > ~/.logsfunciona porque .logs es un archivo.
dogbane
2
Debes estar bromeando. $ ln -s /dev/null dev-null; touch dev-null/zzzme datouch: cannot touch 'dev-null/zzz': Not a directory
alex
1
Como dije, funciona para Chrome. Impide que se escriba en el caché. Si hace que el programa del autor de la pregunta se bloquee, entonces obviamente no comprueba si los punteros de archivo son NULL.
jonescb
66
Probablemente significa que Chrome omite la escritura si hay un error al abrir el archivo. Podría lograr el mismo efecto eliminando el permiso de escritura del archivo de volcado o del directorio en el que está escribiendo.
KeithB
Es cierto que cambiar los permisos del directorio probablemente tendría más sentido.
jonescb