W naszym serwerze produkcyjnym nagle /dev/null
stał 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, rm
polecenie /dev/null
zostanie ponownie utworzone jako zwykły plik, zanim będzie mknod
moż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/null
pliku urządzenia postaci.
/lib/udev/rules.d/50-udev-default.rules
tworzenia/dev/null
lsof /dev/null
jest twoim przyjacielem.Odpowiedzi:
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ą)
i przenosisz go (jako root) do ciągle tworzonych:
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)
źródło
Możesz uruchomić
lsof /dev/null
i 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.
Chciałbym jednak wiedzieć, co najpierw psuje system. Czy ostatnio zmieniłeś coś, co może to powodować?
źródło
Powodem, dla którego nie można odtworzyć,
/dev/null
jest prawdopodobne, że coś ciągle do tego pisze:Analiza zawartości pliku powie ci, jaki to może być proces.
Aby na razie naprawić system, wykonaj następujące instrukcje:
init=/bin/bash
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.
źródło
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.
źródło
unset HISTFILE
wyłączyć historię, nie robiąc nic dla / dev / null.