Le fichier / dev / null est devenu un fichier normal

19

Dans notre serveur de production est soudainement /dev/nulldevenu un fichier normal et en raison de ce service sshd s'est arrêté et n'a pas pu se connecter au serveur. Et nous avons également essayé les étapes ci-dessous pour reconfigurer le fichier de périphérique de caractères,

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

Dès que nous exécutons la rmcommande /dev/nullest recréée en tant que fichier normal avant de mknodpouvoir s'exécuter. Nous ne pouvons pas comprendre comment cela se produit et quel composant crée ce fichier. Donc, jusqu'à ce que nous résolvions ce problème, nous ne pouvons pas créer /dev/nullde fichier de périphérique de caractères.

user197719
la source
Quel système d'exploitation et quelle version utilisez-vous sur le serveur? udev est peut-être en train de créer le fichier.
ptman
Centos 5.2 et pouvez-vous expliquer comment udev crée ce fichier.
user197719
man fuser, vous pouvez trouver un processus accédant à un fichier et le tuer. Vous pouvez peut-être mettre un attribut sur un tel fichier - man chattr.
jirib
Je n'ai pas de machines Centos à portée de main, mais Ubuntu 12.04 a une règle /lib/udev/rules.d/50-udev-default.rulespour la création/dev/null
ptman
3
lsof /dev/nullest votre ami.
Andrew B

Réponses:

29

Lorsque vous supprimez (rm) / dev / null, tous les programmes / scripts qui s'exécutent et qui doivent "> / dev / null" ou équivalent recréeront un nouveau fichier (normal) avec ce nom. Et ceux-ci peuvent apparaître à tout moment (et certains peuvent également y écrire en continu)

Pour les battre:

vous créez un nouveau fichier spécial / dev / null (sous un nom différent)

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

et vous le déplacez sur (en tant que root) ceux créés en continu:

mv -f /dev/newnull /dev/null

Et seulement alors vous pouvez redémarrer (ne redémarrez pas sans un fichier / dev / null correct en place ... ce n'est généralement pas facile) [J'ai oublié cette étape, qui est bien sûr nécessaire. Merci @ Random832 pour le rappel!]

Vous devez redémarrer à la fin, pour vous débarrasser du programme existant qui aura toujours un "/ dev / null" ouvert et qui écrira toujours sur le système de fichiers même si vous l'avez remplacé par la suite, remplissant ce système de fichiers petit à petit) (En effet , comme lors de la suppression d'un fichier, tout programme qui a toujours ce descripteur de fichier ouvert pourra toujours écrire dans l'ancien inode, même si le nom de fichier pointe maintenant vers le nouveau)

Olivier Dulac
la source
2
Il devrait toujours redémarrer le serveur par la suite - tout ce qui a commencé à écrire dans le fichier ordinaire continuera à écrire dans le fichier supprimé et à utiliser l'espace disque.
Random832
@ Random832: très vrai, mais au moins redémarrer APRÈS avoir un nouveau fichier correct / dev / null en place est beaucoup plus facile ... (de nombreux programmes et scripts en dépendent pour fonctionner correctement)
Olivier Dulac
8

Vous pouvez exécuter lsof /dev/nullet voir s'il existe un processus qui l'ouvre, mais il ne vous montrera pas ce qui se passe en temps réel.

Une autre option serait de fabriquer l'appareil et de le déplacer en place.

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

Mais je voudrais d'abord savoir ce qui brise le système. Avez-vous récemment changé quelque chose qui pourrait être à l'origine de cela?

Choffee
la source
7

La raison pour laquelle vous ne pouvez pas recréer /dev/nullest probablement que quelque chose y écrit continuellement comme ceci:

echo "foo" > /dev/null

L'examen du contenu du fichier vous dira de quel processus il pourrait s'agir.

Pour réparer votre système pour l'instant, suivez ces instructions:

  1. arrêter le système
  2. démarrer avec init=/bin/bash
  3. remonter / inscriptible
  4. créer le périphérique char
  5. redémarrer

Je suggère fortement de faire un examen approfondi du système pour déterminer comment / dev / null a été supprimé. Assurez-vous que votre système n'est pas compromis, consultez attentivement le journal de votre système.

fuero
la source
4

J'ai trouvé la cause et le correctif sur mon système archlinux.

Si vous utilisez bash et HISTFILE = / dev / null est dans l'environnement, vous ne devez pas exécuter plus de commandes que $ HISTFILESIZE ou $ HISTSIZE. Si vous avez exécuté plus de commandes que $ HISTFILESIZE sur bash alors que HISTFILE est / dev / null et que vous avez quitté bash, bash déplace / dev / null ailleurs et recrée / dev / null en tant que fichier normal avec l'autorisation 600.

Si vous utilisez tramp sur emacs 24.4, tramp-sh.el définit HISTFILE sur / dev / null. Ainsi, si bash est le shell de root et si vous faites beaucoup d'opérations root avec tramp sur emacs 24.4, lorsque vous tuez emacs, tramp fait bash supprimer / dev / null.

Veuillez vérifier si HISTFILE est défini sur / dev / null dans .bashrc ou dans des programmes comme emacs 24.4.

Dans mon cas, changer le shell en zsh contourne le fait que tramp rend bash delete / dev / null sur emacs 24.4.

crocket
la source
Il n'y a aucune raison d'écrire HISTORY dans / dev / null. Vous devez définir HISTSIZE sur "0" pour désactiver complètement HISTORY.
Tim Haegele
Vous pouvez également unset HISTFILEdésactiver l'historique, sans rien faire pour / dev / null.
Michael Hampton
Cependant, tramp-sh.el sur emacs 24.4 définit HISTFILE sur / dev / null, et je ne peux rien y faire pour l'instant. J'ai lié / bin / dash à / bin / sh pour contourner le problème.
crocket