/ dev / null file menjadi file biasa

19

Di server produksi kami tiba-tiba /dev/nullmenjadi file biasa dan karena layanan sshd ini dihentikan dan tidak dapat masuk ke server. Dan kami juga mencoba langkah-langkah di bawah ini untuk mengonfigurasi kembali ke file perangkat karakter,

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

Segera setelah kami menjalankan rmperintah /dev/nullsedang dibuat kembali sebagai file biasa sebelum mknoddapat dijalankan. Kami tidak dapat mengetahui bagaimana ini terjadi dan komponen mana yang membuat file ini. Jadi sampai kami menyelesaikan masalah ini, kami tidak dapat membuat /dev/nullsebagai file perangkat karakter.

pengguna197719
sumber
OS dan rilis apa yang Anda gunakan di server? udev mungkin membuat file.
ptman
Centos 5.2 dan tolong jelaskan bagaimana udev membuat file ini.
user197719
man fuser, Anda dapat menemukan proses mengakses file dan membunuhnya. Anda mungkin dapat menempatkan atribut pada file tersebut - man chattr.
jirib
Saya tidak memiliki mesin centos, tetapi ubuntu 12.04 memiliki aturan /lib/udev/rules.d/50-udev-default.rulesuntuk membuat/dev/null
ptman
3
lsof /dev/nulladalah temanmu
Andrew B

Jawaban:

29

Ketika Anda menghapus (rm) / dev / null, semua program / skrip yang sedang berjalan dan yang perlu "> / dev / null" atau yang setara akan membuat ulang file baru (reguler) dengan nama itu. Dan mereka dapat muncul kapan saja (dan beberapa juga terus menulis untuk itu)

Untuk mengalahkan mereka:

Anda membuat file khusus / dev / null baru (dengan nama yang berbeda)

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

dan Anda memindahkannya (sebagai root) yang dibuat terus-menerus:

mv -f /dev/newnull /dev/null

Dan hanya dengan begitu Anda dapat reboot (jangan reboot tanpa file / dev / null yang tepat ... biasanya tidak mudah) [Saya lupa langkah itu, yang tentu saja diperlukan. Terima kasih @ Random832 untuk pengingatnya!]

Anda perlu me-reboot pada akhirnya, untuk menyingkirkan program yang sudah ada yang masih memiliki "/ dev / null" yang terbuka dan masih akan menulis ke sistem file walaupun Anda menggantinya setelah itu, mengisi sistem file itu sedikit demi sedikit) (Memang , seperti saat menghapus file, program apa pun yang masih membuka deskriptor file tersebut masih dapat menulis ke inode sebelumnya, meskipun nama file sekarang menunjuk ke yang baru)

Olivier Dulac
sumber
2
Dia masih harus me-restart server sesudahnya - apa pun yang mulai menulis ke file biasa akan terus menulis ke file yang dihapus dan menggunakan ruang disk.
Random832
@ Random832: sangat benar, tetapi setidaknya me-reboot SETELAH memiliki file benar / dev / null baru jauh lebih mudah ... ( banyak program dan skrip bergantung padanya untuk bekerja dengan benar)
Olivier Dulac
8

Anda dapat menjalankan lsof /dev/nulldan melihat apakah ada proses yang membuatnya terbuka tetapi tidak akan menunjukkan kepada Anda apa yang terjadi secara real time.

Pilihan lain adalah membuat perangkat dan memindahkannya di tempat.

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

Tapi saya ingin tahu apa yang merusak sistem terlebih dahulu. Sudahkah Anda mengubah sesuatu yang menyebabkan hal ini baru-baru ini?

Choffee
sumber
7

Alasan mengapa Anda tidak dapat membuat ulang /dev/nullkemungkinan ada sesuatu yang terus-menerus menulis seperti ini:

echo "foo" > /dev/null

Memeriksa konten file akan memberi tahu Anda apa prosesnya.

Untuk memperbaiki sistem Anda untuk saat ini, ikuti instruksi ini:

  1. matikan sistem
  2. boot dengan init=/bin/bash
  3. remount / dapat ditulisi
  4. buat perangkat char
  5. reboot

Saya sangat menyarankan untuk melakukan pemeriksaan intensif sistem untuk menentukan bagaimana / dev / null dihapus. Pastikan sistem Anda tidak terganggu, periksa log sistem Anda secara menyeluruh.

fuero
sumber
4

Saya menemukan penyebab dan perbaikan pada sistem archlinux saya.

Jika Anda menggunakan bash dan HISTFILE = / dev / null di lingkungan, Anda tidak boleh menjalankan lebih banyak perintah daripada $ HISTFILESIZE atau $ HISTSIZE. Jika Anda mengeksekusi lebih banyak perintah dari $ HISTFILESIZE di bash sementara HISTFILE adalah / dev / null dan Anda keluar dari bash, bash memindahkan / dev / null di tempat lain dan membuat ulang / dev / null sebagai file biasa dengan izin 600.

Jika Anda menggunakan tramp pada emacs 24.4, tramp-sh.el menetapkan HISTFILE ke / dev / null. Jadi, jika bash adalah shell untuk root dan jika Anda melakukan banyak operasi root dengan tramp pada emacs 24.4, saat Anda membunuh emacs, tramp membuat bash delete / dev / null.

Silakan periksa apakah HISTFILE diatur ke / dev / null di .bashrc atau dalam program seperti emacs 24.4.

Dalam kasus saya, mengubah shell ke zsh bekerja di sekitar fakta bahwa gelandangan membuat bash delete / dev / null pada emacs 24.4.

crocket
sumber
Tidak ada alasan menulis SEJARAH ke / dev / null. Anda harus mengatur HISTSIZE ke "0" untuk menonaktifkan HISTORY seluruhnya.
Tim Haegele
Anda juga dapat unset HISTFILEmenonaktifkan riwayat, tanpa melakukan apa pun ke / dev / null.
Michael Hampton
Namun, tramp-sh.el pada emacs 24.4 menetapkan HISTFILE menjadi / dev / null, dan tidak ada yang bisa saya lakukan untuk saat ini. Saya symlinked / bin / dash ke / bin / sh untuk mengatasi masalah tersebut.
crocket