Server Linux kehabisan ruang

31

Saya telah ditanya pertanyaan ini dalam dua wawancara berturut-turut, tetapi setelah beberapa penelitian dan memeriksa dengan berbagai administrator sistem saya belum menerima jawaban yang baik. Saya ingin tahu apakah ada yang bisa membantu saya di sini.

Server kehabisan ruang disk. Anda melihat file log yang sangat besar dan menentukan apakah itu aman untuk dihapus. Anda menghapus file tetapi disk masih menunjukkan bahwa itu penuh. Apa yang menyebabkan ini dan bagaimana Anda memperbaikinya? Dan bagaimana Anda menemukan proses mana yang sedang menulis file log besar ini?

putih
sumber
3
Anda perlu berbicara dengan administrator sistem yang lebih baik. Ini hal-hal sepele.
womble
2
Sepele, tetapi situasi dan pertanyaannya cukup sering muncul ...
ewwhite
Apakah OP dapat menerima ini?
ewwhite
5
Sepele atau tidak, bagi seseorang yang tidak dapat berbicara * nix dengan lancar (misalnya admin Windows terutama) ini adalah hal yang baik untuk dipelajari.
John Gardeniers

Jawaban:

56

Ini adalah pertanyaan wawancara umum dan situasi yang muncul di berbagai lingkungan produksi.

Entri direktori file telah dihapus, tetapi proses logging masih berjalan. Ruang tidak akan direklamasi oleh sistem operasi sampai semua file menangani telah ditutup (mis., Proses telah dimatikan) dan semua entri direktori dihapus. Untuk menemukan proses penulisan ke file, Anda harus menggunakan lsofperintah.

Bagian lain dari pertanyaan terkadang adalah "bagaimana Anda menghapus file yang sedang ditulis tanpa mematikan proses?" Idealnya, Anda akan "nol" atau "memotong" file log dengan sesuatu seperti : > /var/log/logfilebukannya menghapus file.

putih
sumber
1
... atau fuser.
Steven Monday
1
Memperluas sedikit: sampai semua referensi ke file pada disk menghilang, ruang itu tidak dapat digunakan oleh sesuatu yang lain. Itu termasuk menangani file. Itu juga memungkinkan trik ini bekerja: serverfault.com/questions/45237/link-to-a-specific-inode
Jeff Ferland
1
Jika sudah no-clobbersiap, coba:>| /var/log/logfile
Belmin Fernandez
2
Saya mengajukan varian pertanyaan ini pada setiap wawancara: "Anda mendapatkan pesan penuh disk. dfKata Anda keluar dari ruang, dumengatakan Anda hampir tidak menggunakan apa pun. Apa yang menyebabkannya, dan mengapa kedua alat tidak setuju?"
voretaq7
Apa yang harus dilakukan jika setelah > /var/log/fileruang pada disk masih 100%? File log tampaknya kosong ... tetapi hanya setelah memulai kembali program yang menulis pada file log ini, ruang dipulihkan. Apakah ada cara untuk memulihkan ruang disk tanpa memulai kembali program?
alemani
14

Masih ada tautan lain ke file (baik tautan keras atau pegangan file terbuka). Menghapus file hanya akan menghapus entri direktori; file data dan inode bertahan sampai referensi terakhir untuk itu telah dihapus.

Ini agak umum dilakukan suatu layanan untuk membuat file sementara dan segera menghapusnya sambil menjaga file tetap terbuka. Ini membuat file pada disk, tetapi menjamin bahwa file tersebut akan dihapus jika proses berakhir tidak normal, dan juga menjaga proses lain dari menginjak file secara tidak sengaja. MySQL melakukan ini, misalnya, untuk semua tabel sementara di dalam disk. Malware sering menggunakan taktik serupa untuk menyembunyikan file-nya.

Di Linux, Anda dapat dengan mudah mengakses file yang dihapus ini sebagai /proc/<pid>/fd/<filenumber>.

tylerl
sumber
8

Saya bukan sysadmin, tetapi dari apa yang saya kumpulkan di Unix.SE, sistem Linux tidak akan benar-benar menghapus file (tandai ruang sebagai bebas / dapat digunakan kembali) setelah tidak terhubung sampai semua deskriptor file yang menunjuk ke mereka memiliki telah ditutup. Jadi untuk menjawab bagian pertama, ruang belum bebas karena proses masih membacanya. Untuk menjawab yang kedua, Anda dapat melihat proses mana yang menggunakan file tersebut lsof.

Kevin
sumber
2

Satu jawaban alternatif selain jawaban hard link / open file yang jelas: file itu adalah file yang sangat (sangat) seperti /var/log/lastlogpada RHEL yang sebenarnya tidak memakan banyak ruang. Menghapusnya memiliki dampak yang sangat kecil, jadi Anda perlu melihat file terbesar berikutnya.

Alexios
sumber
1

Jika proses menulis file adalah root, itu akan menulis ke dalam ruang file milik pengguna super. Sistem file memiliki ruang ini untuk menjaga sistem tetap beroperasi seandainya tugas pengguna mengisi disk. Ruang ini (imho per default 5%) tidak terlihat oleh banyak alat.

Ia dapat menunjukkan kepada Anda, proses mana yang mengunci file, ergo yang menulisnya.

Some one
sumber
1
Anda juga dapat menyesuaikan persentase cadangan ini menggunakan tune2fs. Ini bisa menjadi cara cepat untuk memungkinkan server terus berjalan saat Anda mengosongkan ruang disk.
sjbotha
1

Selain file dibuka oleh suatu proses, kasus ke-2 adalah ketika Anda memiliki sistem file yang mendukung snapshot seperti btrfsatau ZFS.

Misalnya Anda mengambil snapshot dengan file log besar itu ada. Jika Anda menghapus file sekarang, Anda hanya akan menghapus delta. Dan delta hanya dihapus ketika file tidak digunakan.

Lihat juga:

Kasus ketiga adalah ketika Anda memiliki sistem file yang mendukung de-duplikasi level blok dan sebagian besar file identik dengan file lain. Saya tidak berharap ini terjadi untuk log kecuali Anda memiliki wadah atau VM yang mengirim log ke wadah syslog atau VM yang berbagi FS yang sama sehingga konten log identik.

Mircea Vutcovici
sumber