ไฟล์ / dev / null กลายเป็นไฟล์ปกติ


19

ในเซิร์ฟเวอร์ที่ใช้งานจริงของเรา/dev/nullกลายเป็นไฟล์ปกติและเนื่องจากบริการ sshd นี้หยุดทำงานและไม่สามารถลงชื่อเข้าใช้เซิร์ฟเวอร์ได้ และเราพยายามทำตามขั้นตอนด้านล่างเพื่อกำหนดค่ากลับไปที่ไฟล์อุปกรณ์ตัวอักษร

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

ทันทีที่เราเรียกใช้rmคำสั่ง/dev/nullจะถูกสร้างขึ้นใหม่เป็นไฟล์ปกติก่อนที่จะmknodสามารถเรียกใช้ เราไม่สามารถทราบได้ว่าเกิดอะไรขึ้นและส่วนประกอบใดกำลังสร้างไฟล์นี้ ดังนั้นจนกว่าเราจะแก้ปัญหานี้เราไม่สามารถสร้าง/dev/nullเป็นไฟล์อุปกรณ์อักขระได้


คุณใช้ระบบปฏิบัติการและรีลีสใดบนเซิร์ฟเวอร์ udev อาจกำลังสร้างไฟล์
ptman

Centos 5.2 และคุณช่วยอธิบายได้อย่างชัดเจนว่า udev สร้างไฟล์นี้อย่างไร
user197719

man fuser คุณสามารถค้นหากระบวนการเข้าถึงไฟล์และฆ่ามัน คุณสามารถใส่แอตทริบิวต์ในไฟล์ดังกล่าว - man chattr
jirib

ฉันไม่มีเครื่อง centos ที่มีประโยชน์ แต่ Ubuntu 12.04 มีกฎ/lib/udev/rules.d/50-udev-default.rulesสำหรับการสร้าง/dev/null
ptman

3
lsof /dev/nullเป็นเพื่อนของคุณ.
Andrew B

คำตอบ:


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" และยังจะเขียนไปยังระบบไฟล์แม้ว่าคุณจะแทนที่มันในภายหลังหลังจากนั้นเติมระบบไฟล์นั้นทีละเล็กทีละน้อย) เช่นเมื่อลบไฟล์โปรแกรมใด ๆ ที่ยังคงเปิดไฟล์ descriptor นั้นจะยังสามารถเขียนไปยัง inode เดิมแม้ว่าชื่อไฟล์นั้นจะชี้ไปที่ไฟล์ใหม่)


2
เขาควรจะยังคงรีสตาร์ทเซิร์ฟเวอร์หลังจากนั้นสิ่งใดก็ตามที่เริ่มเขียนไปยังไฟล์ธรรมดาจะยังคงเขียนไปยังไฟล์ที่ถูกลบและใช้พื้นที่ดิสก์มากขึ้น
Random832

@ Random832: จริงมาก แต่อย่างน้อยรีบูตหลังจากที่มีไฟล์ที่ถูกต้อง / dev / null ใหม่ในสถานที่ง่ายกว่ามาก ... ( โปรแกรมและสคริปต์จำนวนมากขึ้นอยู่กับการทำงานอย่างถูกต้อง)
Olivier Dulac

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. remount / เขียนได้
  4. สร้างอุปกรณ์ถ่าน
  5. รีบูต

ฉันขอแนะนำอย่างยิ่งให้ทำการตรวจสอบอย่างละเอียดของระบบเพื่อพิจารณาว่า / dev / null ถูกลบอย่างไร ตรวจสอบให้แน่ใจว่าระบบของคุณไม่ถูกบุกรุกตรวจสอบบันทึกของระบบอย่างละเอียด


4

ฉันพบสาเหตุและการแก้ไขในระบบ archlinux ของฉัน

หากคุณใช้ bash และ HISTFILE = / dev / null อยู่ในสภาพแวดล้อมคุณไม่ควรรันคำสั่งมากกว่า $ HISTFILESIZE หรือ $ HISTSIZE หากคุณดำเนินการคำสั่งมากกว่า $ HISTFILESIZE บน bash ในขณะที่ HISTFILE คือ / dev / null และคุณออกจาก bash แล้ว bash จะย้าย / dev / null ไปที่อื่นและสร้าง / dev / null เป็นไฟล์ปกติที่ได้รับอนุญาต 600

หากคุณใช้คนจรจัดใน emacs 24.4, tramp-sh.el จะตั้งค่า HISTFILE เป็น / dev / null ดังนั้นถ้า bash เป็นเชลล์สำหรับรูทและหากคุณทำการรูทจำนวนมากด้วยการเดินเล่นบน emacs 24.4 เมื่อคุณฆ่า emacs คนจรจัดจะทำให้ bash delete / dev / null

โปรดตรวจสอบว่า HISTFILE ถูกตั้งค่าเป็น / dev / null ใน. bashrc หรือในโปรแกรมเช่น emacs 24.4

ในกรณีของฉันการเปลี่ยนเชลล์เป็น zsh ทำงานได้กับข้อเท็จจริงที่ว่าคนจรจัดทำให้ bash delete / dev / null บน emacs 24.4


ไม่มีเหตุผลที่จะเขียนประวัติถึง / dev / null คุณควรตั้ง HISTSIZE เป็น "0" เพื่อปิดการใช้งานประวัติทั้งหมด
ทิมเฮเกเล่

คุณยังสามารถunset HISTFILEปิดการใช้งานประวัติโดยไม่ต้องทำอะไรกับ / dev / null
Michael Hampton

อย่างไรก็ตาม, tramp-sh.el บน emacs 24.4 ตั้งค่า HISTFILE เป็น / dev / null, และตอนนี้ฉันก็ไม่สามารถทำอะไรได้เลย ฉันเชื่อมโยง / bin / dash ไปยัง / bin / sh เพื่อแก้ไขปัญหา
crocket
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.