/ dev / null file se convirtió en archivo regular

19

En nuestro servidor de producción, de repente se /dev/nullconvirtió en un archivo normal y debido a este servicio sshd se detuvo y no pudo iniciar sesión en el servidor. Y también intentamos los pasos a continuación para volver a configurar el archivo del dispositivo de caracteres,

rm -rf /dev/null
mknod /dev/null c 1 3

Tan pronto como ejecutamos, el rmcomando /dev/nullse vuelve a crear como un archivo normal antes de que mknodpueda ejecutarse. No podemos entender cómo sucede esto y qué componente está creando este archivo. Entonces, hasta que resolvamos este problema, no podremos crear /dev/nullcomo archivo de dispositivo de caracteres.

usuario197719
fuente
¿Qué sistema operativo y versión está utilizando en el servidor? udev podría estar creando el archivo.
ptman
Centos 5.2 y ¿puede explicar cómo udev está creando este archivo?
user197719
man fuser, puedes encontrar un proceso accediendo a un archivo y matarlo. Quizás pueda poner un atributo en dicho archivo - man chattr.
jirib
No tengo máquinas centos a mano, pero ubuntu 12.04 tiene una regla /lib/udev/rules.d/50-udev-default.rulespara crear/dev/null
ptman
3
lsof /dev/nulles tu amigo.
Andrew B

Respuestas:

29

Cuando elimine (rm) / dev / null, cualquier programa / script que se esté ejecutando y que necesite "> / dev / null" o equivalente volverá a crear un nuevo archivo (regular) con ese nombre. Y esos pueden aparecer en cualquier momento (y algunos también pueden escribirle continuamente)

Para vencerlos:

crea un nuevo archivo especial / dev / null (con un nombre diferente)

mknod /dev/newnull c 1 3
chmod 777 /dev/newnull

y lo mueves (como root) a los creados continuamente:

mv -f /dev/newnull /dev/null

Y solo entonces puede reiniciar (no reinicie sin un archivo / dev / null adecuado ... generalmente no es fácil) [Olvidé ese paso, que por supuesto es necesario. ¡Gracias @ Random832 por el recordatorio!]

Debe reiniciar al final, para deshacerse del programa existente que todavía tendrá un "/ dev / null" abierto y aún escribirá en el sistema de archivos a pesar de que lo reemplazó después, llenando ese sistema de archivos poco a poco) (De hecho , como al eliminar un archivo, cualquier programa que todavía tenga ese descriptor de archivo abierto podrá escribir en el inodo anterior, aunque el nombre del archivo ahora apunte al nuevo)

Olivier Dulac
fuente
2
Todavía debe reiniciar el servidor después; todo lo que comenzó a escribirse en el archivo ordinario continuará escribiendo en el archivo eliminado y utilizando espacio en disco.
Random832
@ Random832: muy cierto, pero al menos reiniciar DESPUÉS de tener un nuevo archivo / dev / null correcto es mucho más fácil ... ( muchos programas y scripts dependen de que funcionen correctamente)
Olivier Dulac
8

Puede ejecutar lsof /dev/nully ver si hay un proceso que lo tiene abierto, pero no le mostrará lo que está sucediendo en tiempo real.

Otra opción sería hacer el dispositivo y moverlo en su lugar.

mknod /dev/null.tmp c 1 3 && mv /dev/null.tmp /dev/null

Pero me gustaría saber qué es lo que está rompiendo el sistema primero. ¿Has cambiado algo recientemente que pueda estar causando esto?

Choffee
fuente
7

La razón por la que no puede recrear /dev/nulles probable que algo le escriba de manera continua:

echo "foo" > /dev/null

Examinar el contenido del archivo le dirá qué proceso podría ser.

Para arreglar su sistema por ahora, siga estas instrucciones:

  1. apagar el sistema
  2. arrancar con init=/bin/bash
  3. remontar / escribible
  4. crear el dispositivo char
  5. reiniciar

Sugeriría encarecidamente hacer un examen intenso del sistema para determinar cómo / dev / null se eliminó. Asegúrese de que su sistema no esté comprometido, verifique el registro de su sistema a fondo.

fuero
fuente
4

Encontré la causa y la solución en mi sistema archlinux.

Si usa bash y HISTFILE = / dev / null está en el entorno, no debe ejecutar más comandos que $ HISTFILESIZE o $ HISTSIZE. Si ejecutó más comandos que $ HISTFILESIZE en bash mientras HISTFILE es / dev / null y salió de bash, bash se mueve / dev / null a otro lugar y recrea / dev / null como un archivo normal con permiso 600.

Si usa tramp en emacs 24.4, tramp-sh.el establece HISTFILE en / dev / null. Por lo tanto, si bash es el shell de root y si realiza muchas operaciones de root con tramp en emacs 24.4, cuando elimina emacs, tramp hace que bash elimine / dev / null.

Compruebe si HISTFILE está configurado en / dev / null en .bashrc o en programas como emacs 24.4.

En mi caso, cambiar el shell a zsh funciona alrededor del hecho de que vagabundo hace que bash delete / dev / null en emacs 24.4.

follaje
fuente
No hay razón para escribir HISTORY en / dev / null. Debe establecer HISTSIZE en "0" para deshabilitar HISTORY por completo.
Tim Haegele
También puede unset HISTFILEdesactivar el historial, sin hacer nada a / dev / null.
Michael Hampton
Sin embargo, tramp-sh.el en emacs 24.4 establece HISTFILE en / dev / null, y no hay nada que pueda hacer al respecto por ahora. Hice un enlace simbólico / bin / dash a / bin / sh para solucionar el problema.
crocket 01 de