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?
Jawaban:
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
lsof
perintah.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/logfile
bukannya menghapus file.sumber
fuser
.no-clobber
siap, coba:>| /var/log/logfile
df
Kata Anda keluar dari ruang,du
mengatakan Anda hampir tidak menggunakan apa pun. Apa yang menyebabkannya, dan mengapa kedua alat tidak setuju?"> /var/log/file
ruang 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?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>
.sumber
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
.sumber
Satu jawaban alternatif selain jawaban hard link / open file yang jelas: file itu adalah file yang sangat (sangat) seperti
/var/log/lastlog
pada RHEL yang sebenarnya tidak memakan banyak ruang. Menghapusnya memiliki dampak yang sangat kecil, jadi Anda perlu melihat file terbesar berikutnya.sumber
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.
sumber
Selain file dibuka oleh suatu proses, kasus ke-2 adalah ketika Anda memiliki sistem file yang mendukung snapshot seperti
btrfs
atauZFS
.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:
https://superuser.com/questions/863588/how-to-delete-a-file-in-all-snapshots-on-a-btrfs-system
ZFS: Menghapus file dari snapshot?
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.
sumber