/ dev / null файл став звичайним файлом


19

У нашому виробничому сервері раптом /dev/nullстав звичайний файл, і завдяки цій службі sshd зупинили і не змогли увійти в систему. А також ми намагалися виконати наведені нижче кроки, щоб налаштувати файл пристрою символів,

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

Як тільки ми запускаємо rmкоманду /dev/null, заново створюємо як звичайний файл, перш ніж mknodможна запустити. Ми не можемо зрозуміти, як це відбувається і який компонент створює цей файл. Отже, поки ми не вирішимо цю проблему, ми не можемо створити /dev/nullяк файл пристрою символів.


Яку ОС та версію ви використовуєте на сервері? udev може створювати файл.
— птман

Centos 5.2. Чи можете ви, будь ласка, розробити, як udev створює цей файл.
— користувач197719

man fuser, ви можете знайти процес доступу до файлу і вбити його. Ви можете, можливо, помістити атрибут у такий файл - man chattr.
— джиріб

У мене немає /lib/udev/rules.d/50-udev-default.rules/dev/null
— підручних центрів

3
lsof /dev/nullтвій друг.
— Андрій Б

Відповіді:


29

Коли ви видаляєте (rm) / dev / null, будь-які запущені програми / сценарії та потребують "> / dev / null" або еквівалент повторно створять новий (звичайний) файл з цим ім'ям. І вони можуть нерестувати в будь-який час (а деякі також можуть постійно писати на це)

Щоб побити їх:

ви створюєте новий / dev / null спеціальний файл (під іншою назвою)

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

і ви переміщуєте його (як корінь) постійно створюваних:

mv -f /dev/newnull /dev/null

І тільки тоді ви можете перезавантажити (не перезавантажуйте без належного файла / dev / null на місці ... це, як правило, непросто) [Я забув цей крок, який, звичайно, необхідний. Дякуємо @ Random832 за нагадування!]

Вам потрібно перезавантажити врешті-решт, щоб позбутися існуючої програми, яка все ще відкриє "/ dev / null" і все одно буде писати у файлову систему, навіть якщо ви потім її замінили, поповнюючи цю файлову систему потроху) (Дійсно , як, наприклад, при видаленні файлу, будь-яка програма, у якої все ще відкритий дескриптор файлу, все ще зможе записати в колишній inode, навіть якщо ім'я файлу тепер вказує на новий)


2
Він все-таки повинен перезапустити сервер після цього - все, що почалося писати у звичайний файл, буде продовжувати записувати до видаленого файлу та використовувати на диску місце.
— Випадково832

@ Random832: дуже правда, але принаймні перезавантаження ПІСЛЯ мати новий правильний / dev / null файл набагато простіше ... ( багато програм і сценаріїв залежать від нього, щоб він працював правильно)
— Олів'є Дулак

8

Ви можете запустити lsof /dev/nullі побачити, чи є процес, який його відкрив, але він би не показав вам, що відбувається в режимі реального часу.

Іншим варіантом було б зробити пристрій і перемістити його на місце.

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

Але я хотів би спочатку дізнатися, що порушує систему. Ви нещодавно змінили щось, що може спричинити це?


7

Причина, чому ви не можете відтворити /dev/nullце, ймовірно, що щось невпинно пише це так:

echo "foo" > /dev/null

Вивчення вмісту файлу підкаже, яким він може бути.

Щоб виправити систему наразі, дотримуйтесь цих інструкцій:

  1. відключення системи
  2. завантаження с init=/bin/bash
  3. перерахунок / підлягає запису
  4. створити пристрій char
  5. перезавантажити

Я настійно пропоную провести інтенсивну перевірку системи, щоб визначити, як видалено / dev / null. Переконайтесь, що ваша система не порушена, ретельно перевіряйте журнал вашої системи.


4

Я знайшов причину та виправлення в моїй системі archlinux.

Якщо ви використовуєте bash і HISTFILE = / dev / null знаходиться в оточенні, ви не повинні виконувати більше команд, ніж $ HISTFILESIZE або $ HISTSIZE. Якщо ви виконали більше команд, ніж $ HISTFILESIZE на bash, поки HISTFILE є / dev / null, і ви вийшли з bash, bash переміщується / dev / null кудись інше і відтворює / dev / null як звичайний файл з дозволом 600.

Якщо ви використовуєте tramp на emacs 24.4, tramp-sh.el встановлює HISTFILE на / dev / null. Таким чином, якщо bash є оболонкою для root і якщо ви робите багато кореневих операцій з tramp на emacs 24.4, коли ви вбиваєте emacs, tramp змушує bash delete / dev / null.

Перевірте, чи HISTFILE встановлено на / dev / null в .bashrc або в таких програмах, як emacs 24.4.

У моєму випадку зміна оболонки на zsh працює навколо того, що Tramp змушує bash delete / dev / null на emacs 24.4.


Немає підстав писати ІСТОРІЮ в / dev / null. Ви повинні встановити HISTSIZE на "0", щоб повністю відключити ІСТОРІЮ.
— Тім Хегеле

Ви також можете unset HISTFILEвідключити історію, не роблячи нічого з / dev / null.
— Майкл Хемптон

Однак tramp-sh.el на emacs 24.4 встановлює HISTFILE на / dev / null, і я поки що нічого не можу з цим зробити. Я символізував / bin / dash to / bin / sh, щоб вирішити проблему.
— крокет
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.