Plik / dev / null stał się plikiem zwykłym

19

W naszym serwerze produkcyjnym nagle /dev/nullstał się zwykłym plikiem i z powodu tej usługi sshd został zatrzymany i nie mógł się zalogować do serwera. A także próbowaliśmy wykonać poniższe kroki, aby skonfigurować plik urządzenia znakowego,

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

Gdy tylko uruchomimy, rmpolecenie /dev/nullzostanie ponownie utworzone jako zwykły plik, zanim będzie mknodmożna je uruchomić. Nie możemy ustalić, jak to się dzieje i który składnik tworzy ten plik. Więc dopóki nie rozwiążemy tego problemu, nie możemy utworzyć /dev/nullpliku urządzenia postaci.

użytkownik197719
źródło
Jakiego systemu operacyjnego i wersji używasz na serwerze? Udev może tworzyć plik.
ptman
Centos 5.2 i czy możesz wyjaśnić, w jaki sposób udev tworzy ten plik.
user197719
man fuser, możesz znaleźć proces uzyskujący dostęp do pliku i go zabić. Możesz umieścić atrybut w takim pliku - man chattr.
jirib
Nie mam pod ręką żadnych maszyn Centos, ale w Ubuntu 12.04 obowiązują zasady /lib/udev/rules.d/50-udev-default.rulestworzenia/dev/null
ptman
3
lsof /dev/nulljest twoim przyjacielem.
Andrew B,

Odpowiedzi:

29

Kiedy usuniesz (rm) / dev / null, wszystkie programy / skrypty, które są uruchomione i wymagają „> / dev / null” lub odpowiednika, ponownie utworzą nowy (zwykły) plik o tej nazwie. A te mogą się odradzać w dowolnym momencie (a niektórzy mogą też ciągle do niego pisać)

Aby je pokonać:

tworzysz nowy plik specjalny / dev / null (pod inną nazwą)

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

i przenosisz go (jako root) do ciągle tworzonych:

mv -f /dev/newnull /dev/null

I tylko wtedy możesz zrestartować komputer (nie uruchamiaj go ponownie bez właściwego pliku / dev / null ... zwykle nie jest to łatwe) [Zapomniałem tego kroku, który jest oczywiście konieczny. Dzięki @ Random832 za przypomnienie!]

W końcu musisz zrestartować komputer, aby pozbyć się istniejącego programu, który nadal będzie miał otwarte „/ dev / null” i nadal będzie zapisywać w systemie plików, nawet jeśli później go zastąpiłeś, stopniowo wypełniając ten system plików (Rzeczywiście , podobnie jak podczas usuwania pliku, każdy program, który nadal ma otwarty deskryptor pliku, będzie mógł nadal zapisywać na byłym i-węzle, nawet jeśli nazwa pliku wskazuje teraz na nowy)

Olivier Dulac
źródło
2
Nadal powinien ponownie uruchomić serwer później - wszystko, co zaczęło zapisywać do zwykłego pliku, będzie kontynuowało zapisywanie do usuniętego pliku i zajmowało miejsce na dysku.
Random832,
@ Random832: bardzo prawdziwe, ale przynajmniej ponowne uruchomienie PO posiadaniu nowego poprawnego pliku / dev / null jest znacznie łatwiejsze ... ( wiele programów i skryptów zależy od niego, aby działało poprawnie)
Olivier Dulac
8

Możesz uruchomić lsof /dev/nulli sprawdzić, czy istnieje proces, który ma go otworzyć, ale nie pokazałby Ci, co dzieje się w czasie rzeczywistym.

Inną opcją byłoby wykonanie urządzenia i przeniesienie go na miejsce.

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

Chciałbym jednak wiedzieć, co najpierw psuje system. Czy ostatnio zmieniłeś coś, co może to powodować?

Choffee
źródło
7

Powodem, dla którego nie można odtworzyć, /dev/nulljest prawdopodobne, że coś ciągle do tego pisze:

echo "foo" > /dev/null

Analiza zawartości pliku powie ci, jaki to może być proces.

Aby na razie naprawić system, wykonaj następujące instrukcje:

  1. zamknij system
  2. boot z init=/bin/bash
  3. podłącz / zapisuj
  4. utwórz urządzenie char
  5. restart

Zdecydowanie sugeruję przeprowadzenie dokładnej analizy systemu w celu ustalenia, w jaki sposób usunięto / dev / null. Upewnij się, że system nie jest zagrożony, dokładnie sprawdź dziennik systemu.

fuero
źródło
4

Znalazłem przyczynę i poprawkę w moim systemie archlinux.

Jeśli używasz bash, a HISTFILE = / dev / null jest w środowisku, nie powinieneś wykonywać więcej poleceń niż $ HISTFILESIZE lub $ HISTSIZE. Jeśli wykonałeś więcej poleceń niż $ HISTFILESIZE podczas bash, gdy HISTFILE to / dev / null i opuściłeś bash, bash przenosi / dev / null gdzie indziej i odtwarza / dev / null jako zwykły plik z uprawnieniem 600.

Jeśli używasz trampa na emacsie 24.4, tramp-sh.el ustawia HISTFILE na / dev / null. Tak więc, jeśli bash jest powłoką dla roota i jeśli wykonujesz wiele operacji rootowania za pomocą trampa na emacs 24.4, to kiedy zabijasz emacsa, tramp powoduje, że bash usuwa / dev / null.

Sprawdź, czy HISTFILE jest ustawiony na / dev / null w .bashrc lub w programach takich jak emacs 24.4.

W moim przypadku zmiana powłoki na zsh działa w ten sposób, że tramp sprawia, że ​​bash delete / dev / null na emacs 24.4.

crocket
źródło
Nie ma powodu, aby pisać HISTORIA do / dev / null. Powinieneś ustawić HISTSIZE na „0”, aby całkowicie wyłączyć HISTORIĘ.
Tim Haegele,
Możesz także unset HISTFILEwyłączyć historię, nie robiąc nic dla / dev / null.
Michael Hampton
Jednak tramp-sh.el na emacsie 24.4 ustawia HISTFILE na / dev / null i na razie nic nie mogę na to poradzić. Dowiązałem / bin / dash do / bin / sh, aby obejść ten problem.
crocket