/ dev / null dosyası normal dosya oldu


19

Üretim sunucumuzda aniden /dev/nullnormal bir dosya oldu ve bu sshd hizmeti nedeniyle durdu ve sunucuya giriş yapamadı. Ayrıca, karakter aygıtı dosyasına geri yapılandırmak için aşağıdaki adımları denedik,

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

Çalıştırır çalıştırmaz, rmkomut çalıştırılmadan /dev/nullönce normal bir dosya olarak yeniden oluşturuluyor mknod. Bunun nasıl ve hangi bileşenin bu dosyayı oluşturduğunu bulamıyoruz. Bu yüzden bu sorunu çözene kadar /dev/nullkarakter aygıtı dosyası oluşturamıyoruz .


Sunucuda hangi işletim sistemi ve sürümü kullanıyorsunuz? udev dosyayı oluşturuyor olabilir.
ptman

Centos 5.2 ve udev'in bu dosyayı nasıl oluşturduğunu ayrıntılı bir şekilde açıklar mısınız?
user197719

adam kaynaştırıcı, bir dosyaya erişme ve onu öldürmek bir işlem bulabilirsiniz. Belki böyle bir dosya - man chattr üzerine bir özellik koyabilirsiniz.
jirib

Kullanışlı hiçbir centos makinesi yok, ama ubuntu 12.04 /lib/udev/rules.d/50-udev-default.rulesoluşturmak için bir kuralı var/dev/null
ptman

3
lsof /dev/nullsenin arkadaşın.
Andrew B

Yanıtlar:


29

(Rm) / dev / null öğesini sildiğinizde, çalışan ve "> / dev / null" veya eşdeğeri olan tüm programlar / komut dosyaları bu adla yeni (normal) bir dosyayı yeniden oluşturur. Ve bunlar her zaman ortaya çıkabilir (ve bazıları da sürekli olarak yazabilir)

Onları yenmek için:

yeni bir / dev / null özel dosyası oluşturursunuz (farklı bir ad altında)

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

ve sürekli oluşturulanları (kök olarak) taşırsınız:

mv -f /dev/newnull /dev/null

Ve ancak o zaman yeniden başlatabilirsiniz (yerinde / dev / null dosyası olmadan yeniden başlatmayın ... genellikle kolay değildir) [Tabii ki gerekli olan bu adımı unuttum. Hatırlatma için @ Random832 teşekkürler!]

Sonunda yeniden başlatmanız gerekiyor, hala "/ dev / null" açılmış ve daha sonra değiştirmiş olsanız bile dosya sistemine yazacak ve bu dosya sistemini azar azar dolduracak mevcut programdan kurtulmak için) (Gerçekten de) , bir dosyayı silerken olduğu gibi, dosya tanımlayıcısını hala açmış olan herhangi bir program, dosya adı artık yeni bir dosyayı işaret etse bile eski inode'a yazabilecektir)


2
Daha sonra sunucuyu yeniden başlatması gerekir - normal dosyaya yazmaya başlayan her şey silinen dosyaya yazmaya ve disk alanını kullanmaya devam eder.
Random832

@ Random832: çok doğru, ancak en azından yeni bir doğru / dev / null dosyasının yerine yerleştirilmesinden SONRA yeniden başlatılıyor çok daha kolay ... ( birçok program ve komut dosyası düzgün çalışmasına bağlıdır)
Olivier Dulac

8

Çalıştırıp lsof /dev/nullaçık olan bir süreç olup olmadığını görebilirsiniz, ancak gerçek zamanlı olarak neler olduğunu göstermez.

Başka bir seçenek, cihazı yapmak ve yerine taşımaktır.

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

Ama önce sistemi neyin kırdığını bilmek istiyorum. Son zamanlarda buna neden olabilecek herhangi bir şeyi değiştirdiniz mi?


7

Yeniden oluşturamamanızın nedeni /dev/null, bir şeyin sürekli olarak şöyle yazmasıdır:

echo "foo" > /dev/null

Dosyanın içeriğini incelemek, size hangi işlemin olabileceğini söyleyecektir.

Sisteminizi şimdilik düzeltmek için şu talimatları izleyin:

  1. sistemi kapat
  2. ile önyükleme init=/bin/bash
  3. yeniden yazılabilir / yazılabilir
  4. char cihazını oluştur
  5. reboot

/ Dev / null öğesinin nasıl silindiğini belirlemek için sistemin yoğun bir incelemesini şiddetle öneririm. Sisteminizin güvenliğinin aşılmadığından emin olun, sistem günlüğünüzü iyice kontrol edin.


4

Archlinux sistemimdeki nedeni ve düzeltmeyi buldum.

Bash kullanırsanız ve HISTFILE = / dev / null ortamdaysa, $ HISTFILESIZE veya $ HISTSIZE'den daha fazla komut yürütmemelisiniz. HISTFILE / dev / null iken bash üzerinde $ HISTFILESIZE komutundan daha fazla komut yürüttüyseniz ve bash'dan çıktıysanız, bash / dev / null komutunu başka bir yere taşır ve 600 / izin / null izniyle normal bir dosya olarak yeniden oluşturur.

Emacs 24.4'te tramp kullanırsanız, tramp-sh.el, HISTFILE öğesini / dev / null olarak ayarlar. Böylece, bash kök için kabuksa ve emacs 24.4'te serseri ile çok sayıda kök işlemi yaparsanız, emacs'ı öldürdüğünüzde, serseri bash delete / dev / null yapar.

Lütfen HISTFILE dosyasının .bashrc içinde veya emacs 24.4 gibi programlarda / dev / null olarak ayarlanıp ayarlanmadığını kontrol edin.

Benim durumumda, kabuğu zsh olarak değiştirmek, serseri emacs 24.4'te bash delete / dev / null yapar.


GEÇMİŞİ / dev / null dizinine yazmak için hiçbir neden yoktur. GEÇMİŞİ tamamen devre dışı bırakmak için HISTSIZE değerini "0" olarak ayarlamanız gerekir.
Tim Haegele

Ayrıca unset HISTFILE, / dev / null öğesine hiçbir şey yapmadan geçmişi devre dışı bırakmak için de kullanabilirsiniz .
Michael Hampton

Ancak, emacs 24.4 üzerindeki tramp-sh.el, HISTFILE öğesini / dev / null olarak ayarlar ve şimdilik bu konuda yapabileceğim bir şey yok. Sorunu çözmek için / bin / sh / bin / sh sembolik bağladım.
15'te kroket
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.