/dev/null y algunas curiosidades

Publicado por Diego Córdoba en

Hace nos días publiqué una encuesta en mi cuenta de Mastodon y en algunas las redes sociales de JuncoTIC que, en un principio, parecía bastante clara, pero luego generó algo de confusión, así que en este post vamos a explicar en detalle algunas curiosidades de /dev/null y las respuestas de la encuesta.

La encuesta

La encuesta que publiqué fue esta:

/dev/null encuessta

Y la respuesta correcta era:

Aparece un error, no se puede mover archivos ahí

Pero las otras dos respuestas con votos tenían algo de razón y justificación también, veamos por qué.

¿Qué es /dev/null?

En primer lugar tengo que aclarar que /dev/null es conocido como «el agujero negro de Linux«, es u archivo especial, o «nodo«, y todo lo que redireccionemos o copiemos dentro desaparece, es descartado por el sistema.

Por ejemplo

$ echo "al vacío" > /dev/null

Las palabras «al vacío» van a ser enviadas al dispositivo nulo, y listo, se van a perder, a descartar.

Lo mismo si copiamos un archivo:

$ cp hola /dev/null

Aquí el archivo es copiado al agujero negro, y la copia se pierde también (no así el archivo original, claro).

Veamos la salida de ls -l:

$ ls -l /dev/null     
crw-rw-rw- 1 root root 1, 3 jun 20 11:33 /dev/null

Se trata de un nodo, es un dispositivo de caracter perteneciente al root, con un valor de MAJOR y MINOR de 1 y 3 respectivamente (en otra oportunidad explicaremos eso). Siempre este dispositivo tiene esos valores, y en seguida veremos por qué es importante saberlo.

Ahora, ¿para qué sirve /dev/null entonces?

Tiene varios usos, principalmente en scripting y programación, podría ampliar eso en otro post, pero ahora centrémonos en la encuesta.

El comando mv

Como ya veremos, la respuesta correcta tiene que ver con el funcionamiento interno del comando «mv«.

mv se usa para mover un archivo origen a un destino, pero su comportamiento depende del sistema de archivos.

El comando mv tiene esta sintaxis:

mv origen destino
  1. Si el destino se encuentra dentro del mismo sistema de archivos que el origen, mv va a renombrar el archivo original, va a cambiarle el nombre y/o su ubicación.
    • Su destino es un directorio, mv va a mover el archivo original dentro.
    • Si destino es un archivo, mv va a renombrar el archivo original como destino.
  2. Si el destino se encuentra en otro sistema de archivos, mv va a copiar el archivo original al destino, y va a eliminar la copia original. Así:
    • Si destino es un directorio, mv va a copiar el archivo original dentro, y va a eliminar la copia orinen.
    • Si destino es un archivo, mv va a reemplazar al archivo destino con la copia del archivo origen, y luego va a eliminar el archivo origen.

Teniendo esto en cuenta, veamos las respuestas.

Respuesta: Aparece un error, no se puede mover archivos ahí

Esta era la respuesta correcta, el comando genera un error así como está, ejecutado como usuario

$ mv archivo.txt /dev/null                                           
mv: inter-device move failed: 'archivo.txt' to '/dev/null'; unable to remove target: Permission denied

Esto es porque, en primer lugar, /dev/null es técnicamente un archivo, es un archivo especial, un nodo, y además, se encuentra en otro sistema de archivos, /dev, un sistema de archivos virtual propiedad del root.

Entonces, aplica el punto (2) de la lista anterior: mv va a intentar copiar el archivo origen reemplazando a /dev/null, y eliminar la copia original.

Ahora bien, /dev sólo puede ser escrito por root, por lo que /dev/null no puede ser reemplazado por un usuario común.

$ ls -ld /dev       
drwxr-xr-x 22 root root 4380 jun 21 20:47 /dev

De ahí que tenemos error de permisos, y como usuarios comunes no podemos ejecutar el comando.

Respuesta: El archivo se mueve al dispositivo nulo y se borra

Considerando lo que ocurre cuando copiamos (cp) un archivo a /dev/null, o enviamos un contenido con redirección de salida, es lógico pensar que mv va a tener el mismo comportamiento: enviar el archivo al limbo, eliminando la copia original.

Sin embargo, como vimos antes, al ser /dev/null un archivo en un sistema de archivos distinto, va a intentar reemplazarlo con el archivo original, y no va a poder, por falta de permisos.

Ahora bien, ¿y si usamos «sudo» o lo ejecutamos como root? Se podrá enviar al agujero negro el archivo original?

Más de uno lo probó en la encuesta, y supongo que alguno se habrá dado cuenta que no es así:

Veamos esta captura:

eliminando /dev/null

¿Qué pasó aquí? No hubo errores, pero, ¿Se envió el archivo.txt al agujero negro?

La respuesta es «no«.

Al ejecutar el comando como root, ahora tenemos permisos para mover el archivo a /dev, y mv pudo «reemplazar /dev/null» con nuestro archivo de texto.

Se ha eliminado el /dev/null original, y ha sido reemplazado con un archivo regular.

Hemos perdido nuestro agujero negro.

Este dispositivo es usado está siendo utilizado por varios servicios del sistema operativo. Hay procesos que envían contenido al /dev/null todo el tiempo. Podríamos hacer un «cat» para ver lo que se está añadiendo al archivo (lo que debería descartarse, en realidad):

Puede que algunos servicios incluso comiencen a funcionar mal si no tenemos el /dev/null original.

Si ejecutaron ese comando y perdieron su /dev/null, no hay problema, al reiniciar se regenerará nuevamente.

Si quieren crearlo sin reiniciar, pueden ejecutar este comando:

$ sudo rm /dev/null
$ sudo mknod -m 666 /dev/null c 1 3

Eso creará nuevamente el archivo de nodo:

creando /dev/nll

Y listo, tenemos el agujero negro otra vez funcionando 🙂

Cómo supe todo esto? Me lo contó mi GNU/Linux 😛

$ man 4 null

Respuesta: El archivo se renombra como /dev/null

Explicado en el punto anterior. Esta respuesta hubiera sido correcta si el comando «mv» lo hubiéramos ejecutado con privilegios de superusuario, pero no es lo que decía el enunciado 🙂

Respuesta: El archivo queda redireccionado a salida estándar

Nadie respondió esto, así que me alegra saber que todos sabemos lo que es una redirección en la línea de comandos, y qué es la salida estándar!

Si no, me preguntan y lo explicamos 😉

Conclusión: /dev/null y sus curiosidades

Y llegamos al final!

Espero que se haya entendido! Era pregunta de viernes, iba a ser una pregunta con cierta trampa, pero creo que la trampa fue muy tramposa!

Lo importante no es haber acertado en la respuesta correcta, sino haber aprendido un poquito más sobre GNU/Linux 🙂

Desde ya mil gracias a todos por participar y compartir estas encuestas!!

Hasta la próxima!


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!

Categorías: Sin categoría

Diego Córdoba

- Ingeniero en Informática - Mgtr. Teleinformática - Instructor GNU/Linux, Programación, Redes TCP/IP, criptografía y ciberseguridad. - (Ex) Docente universitario e investigador