/ dev / null फ़ाइल नियमित फ़ाइल बन गई


19

हमारे उत्पादन में सर्वर अचानक /dev/nullएक नियमित फ़ाइल बन गया और इस कारण sshd सेवा बंद हो गई और सर्वर को लॉगिन करने में सक्षम नहीं हुआ। और हमने चरित्र डिवाइस फ़ाइल पर वापस कॉन्फ़िगर करने के लिए नीचे दिए गए चरणों की भी कोशिश की,

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

जैसे ही हम चलाते हैं, rmकमांड /dev/nullको mknodचलाने से पहले एक नियमित फ़ाइल के रूप में फिर से बनाया जा रहा है । हम यह पता नहीं लगा सकते हैं कि यह कैसे हो रहा है और कौन सा घटक इस फाइल को बना रहा है। इसलिए जब तक हम इस समस्या को हल नहीं कर लेते, हम /dev/nullचरित्र डिवाइस फ़ाइल के रूप में बनाने में असमर्थ हैं ।


OS और रिलीज़ क्या आप सर्वर पर उपयोग कर रहे हैं? udv फ़ाइल बना रहा हो सकता है।
पीटीमैन

Centos 5.2 और क्या आप यह बता सकते हैं कि udv इस फ़ाइल को कैसे बना रहा है।
user197719

आदमी fuser, आप एक फ़ाइल तक पहुँचने की प्रक्रिया ढूँढ सकते हैं और उसे मार सकते हैं। आप इस तरह की फ़ाइल पर एक विशेषता रख सकते हैं - आदमी चैट।
जिरीब j

मेरे पास कोई सेंटोस मशीनें नहीं हैं, लेकिन ubuntu 12.04 में /lib/udev/rules.d/50-udev-default.rulesबनाने के लिए एक नियम है/dev/null
ptman

3
lsof /dev/nullआपका दोस्त है।
एंड्रयू बी

जवाबों:


29

जब आप (rm) / 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" खोला गया है और अभी भी फाइलसिस्टम को लिखेगा, भले ही आपने इसे बाद में बदल दिया हो, उस फाइलसिस्टम को बहुत कम करके भरना (वास्तव में) , जैसे किसी फाइल को डिलीट करते समय, कोई भी प्रोग्राम जो अभी भी उस फाइल डिस्क्रिप्टर को खोला है, वह अभी भी पूर्व इनोड पर लिख सकेगा, भले ही फाइलनाम अब नए की ओर इशारा कर रहा हो)


2
उसे अभी भी सर्वर को फिर से शुरू करना चाहिए - कुछ भी जो साधारण फ़ाइल में लिखना शुरू कर देता है वह हटाए गए फ़ाइल को लिखना जारी रखेगा और डिस्क स्थान का उपयोग करेगा।
188 बजे रैंडम 832

@ Random832: बहुत सही है, लेकिन कम से कम रिबूट होने के बाद एक नई सही / देव / अशक्त फाइल रखने की जगह बहुत आसान है ... ( कई प्रोग्राम और स्क्रिप्ट इस पर सही तरीके से काम करने के लिए निर्भर हैं)
ओलिवियर डुलैक

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. चार डिवाइस बनाएं
  5. रिबूट

मैं दृढ़ता से यह निर्धारित करने के लिए सिस्टम की गहन परीक्षा करने का सुझाव दूंगा कि कैसे / dev / null हटाए गए। सुनिश्चित करें कि आपके सिस्टम से समझौता नहीं किया गया है, अपने सिस्टम के लॉग को अच्छी तरह से जांचें।


4

मुझे अपने आर्च्लिनक्स सिस्टम पर कारण और फिक्स मिला।

यदि आप bash और HISTFILE का उपयोग करते हैं = / dev / null पर्यावरण में है, तो आपको $ HISTFILESIZE या $ HISTSIZE से अधिक कमांड निष्पादित नहीं करना चाहिए। यदि आपने BIST पर $ HISTFILESIZE से अधिक कमांड निष्पादित किए हैं जबकि HISTFILE / dev / null है और आप bash, bash मूव्स / dev / null को कहीं और से बाहर निकालते हैं और 600 के लिए एक नियमित फ़ाइल के रूप में / dev / null को फिर से बनाते हैं।

यदि आप 24.4 emacs पर tramp का उपयोग करते हैं, तो tramp-sh.el HISTFILE को / dev / null पर सेट करता है। इस प्रकार, यदि bash रूट के लिए शेल है और यदि आप emacs पर ट्रैम्प के साथ बहुत सारे रूट संचालन करते हैं, जब आप emacs को मारते हैं, तो ट्रैम्प bash को डिलीट / dev / null बनाता है।

कृपया जांच लें कि HISTFILE को .bashrc में या emacs 24.4 जैसे कार्यक्रमों में / dev / null पर सेट किया गया है या नहीं।

मेरे मामले में, शेल को zsh में बदलने से इस तथ्य के आसपास काम होता है कि ट्रैम्प 24.4 emacs पर बैश डिलीट / dev / null बनाता है।


HISTORY को / dev / null लिखने का कोई कारण नहीं है। आपको इतिहास को पूरी तरह से अक्षम करने के लिए "0" पर सेट करना चाहिए।
टिम हाइगेले

आप unset HISTFILEइतिहास को अक्षम करने के लिए भी कर सकते हैं , बिना कुछ / देव / अशक्त किए।
माइकल हैम्पटन

हालाँकि, 24.4 सेट emacs पर tramp-sh.el HISTFILE को / dev / null पर सेट करता है, और ऐसा कुछ नहीं है जो मैं अभी इसके बारे में कर सकता हूं। मैंने समस्या के इर्द-गिर्द काम करने के लिए / बिन / डैश / सिम / सी को सहानुभूति दी।
4
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.