/ 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.