¿Hay un directorio equivalente a / dev / null en Linux?

84

Al configurar una aplicación, a menudo puede usarla /dev/nullcomo archivo de configuración si desea que la aplicación lea un archivo vacío. Pero, si la aplicación lee una lista de archivos de un directorio, no puede usar este truco. Debería darle un directorio vacío para leer.

Me preguntaba: ¿Linux tiene un directorio vacío predeterminado que se puede usar para tales fines? Sé que OpenSSH usó / var / empty por un tiempo, y por supuesto puedo crear un directorio vacío yo mismo, pero ¿tal vez el FHS ha especificado un directorio estándar para esto?

Roelvanmeer
fuente
8
En mi sistema, /var/emptyno está vacío, pero contiene una carpeta llamada sshd, por lo que probablemente no quiera usar eso.
knub
12
Solo un punto: el aspecto especial de /dev/nullno es tanto para leer como para escribir. Los datos escritos en /dev/nullsimplemente desaparecen. Entonces, un directorio equivalente sería un lugar donde mv yourfile /dev/emptyresultaría en la eliminación de su archivo.
Comodín el
44
@Wildcard, supongo que te refieres mv yourfile /dev/empty/. Si lo hace mv yourfile /dev/empty, está tratando de reemplazar el directorio especial.
Rhymoid
66
@Jules No, no lo es. No puede inicializar nada con /dev/nully ddporque ddobtendrá un EOF incluso antes de que se escriba un solo byte. Creo que estás pensando /dev/zero, que a menudo se usa para llenar algo o generar un número específico de ceros.
Micheal Johnson
2
@MichealJohnson tienes razón, mi error, lo confundí /dev/nullcon /dev/zero.
Jules

Respuestas:

66

El FHS no proporciona un directorio vacío "estándar".

Es común que los sistemas Linux proporcionen un directorio /var/empty, pero este directorio no está definido en FHS y puede que en realidad no esté vacío. En cambio, ciertos demonios crearán sus propios directorios vacíos aquí. Por ejemplo, openssh usa el directorio vacío /var/empty/sshdpara la separación de privilegios.

Si su necesidad de un directorio vacío es transitoria, puede crear un directorio vacío usted mismo, como un subdirectorio de /runo /tmp. Si está haciendo esto fuera del programa, puede usarlo mktemp -do usar la mkdtemp(3)función C dentro de su programa. Sin embargo, si siempre necesita el directorio vacío para estar presente, considere crear uno debajo /var/emptycomo lo hace openssh.

Para este caso de uso, crear un directorio debajo /tmpes probablemente la mejor opción, aunque en la práctica no importa mucho dónde lo coloque.

Michael Hampton
fuente
55
No recomendaría crear subdirectorios debajo /var/empty, ya que cualquier programa que lo use (como OpenSSH en su configuración predeterminada ) puede esperar que esté realmente vacío. (La /var/empty/sshdcosa parece ser un extraño RedHat-ism; Debian usa en su /var/run/sshdlugar.)
Ilmari Karonen
3
@IlmariKaronen El bit de código que ha vinculado no respalda su afirmación de que OpenSSH espera /var/emptyestar vacío. ¿Hay algún otro lugar donde uno pueda buscar esto?
Michael Hampton
2
@IlmariKaronen Hm, ese documento está desactualizado. Se refiere /var/emptypero el código realmente usa /var/empty/sshd. Inténtalo de nuevo. :)
Michael Hampton
1
@IlmariKaronen Hmm. Ahora creo que tienes razón, después de mirar la fuente que hace la llamada chroot (). Me parece sorprendente que haya un defecto tan obviamente estúpido en openssh, que Red Hat tenga que mantener una corrección aguas abajo.
Michael Hampton
2
No veo cómo es una "falla estúpida": tener un directorio propiedad raíz vacío garantizado en una ubicación estándar, para usar como una cárcel chroot, me parece una idea perfectamente buena. Por supuesto, RedHat tuvo que ir y arruinarlo para todos, creando subdirectorios debajo de él. Como resultado, mi recomendación para el código portátil sería no usarlo /var/emptypara nada, ya que no puede estar seguro de su semántica en un sistema dado. Crear su propio directorio vacío, por ejemplo /var/run, debajo , como lo hace Debian, parece más sensato.
Ilmari Karonen
37

Puede usar mktemp -dpara crear un nuevo directorio temporal vacío con permisos seguros, de forma predeterminada en /tmp/. La utilidad generará la ruta del nuevo directorio STDOUT, por lo que es útil en el shell.

De todos modos, es más portátil que un archivo de unidad systemd.

avena
fuente
Sí, podría, pero eso no es práctico si ese directorio tiene que especificarse en un archivo de configuración. Querrías un directorio permanente para eso.
roelvanmeer
22

Esta pregunta de Unix tiene algunas sugerencias para crear un directorio "blackhole", incluido un sistema de archivos nullfs FUSE .

200_success
fuente
1
No sé por qué la respuesta mktemp / mkdtemp está tan votada cuando esta es la respuesta perfecta. nullfs es el equivalente de / dev / null.
chx
11

Para los servicios, systemd ofrece la opción PrivateTmpde crear directorios privados /tmpy /var/tmpno compartidos por procesos fuera del espacio de nombres para ese servicio y que deberían estar vacíos (inicialmente).

[Service]
ExecStart=...
PrivateTmp=yes 
HBruijn
fuente
77
El programa puede crear otros archivos temporales, por lo que no puede suponer /tmpque estará vacío simplemente porque ha sido espaciado de nombres.
Michael Hampton