Sistem file Linux; perbedaan ukuran penghitungan menggunakan df & du

8

Ketika saya menjalankannya dfmenunjukkan perangkat root penuh.

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             9.9G  9.4G     0 100% /

Saya melihat inodepenggunaannya dan ada cukup banyak ruang yang tersedia untuk perangkat root

Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1               640K    103K    538K   16% /

Tetapi, ketika saya menjalankan duperintah, itu menunjukkan saya hanya menggunakan 2Gdari 9.9G.

ip-XXX-XXX-XXX-XXX:/$ du -xh --max-depth=1
14M ./etc
4.0K ./mnt
96K ./tmp
3.5M ./bin
0   ./sys
964K ./boot
4.0K ./srv
0   ./dev
55M ./lib
25M ./root
1.1G ./usr
4.0K ./opt
846M ./var
4.3M ./sbin
23M ./home
16K ./lost+found
0   ./proc
2.0G .

Itu hanya membuatku gila dan menarik juga. Ini adalah masalah besar bagi kami karena root disk /penuh dan beberapa fungsi di situs kami gagal.

Tolong bantu saya menyelesaikan (juga mengerti) masalah ini.

Terima kasih.

Rakesh Sankar
sumber
2
Lihat kebingungan ruang disk bebas linux dan +df +dupertanyaan lain di Unix & Linux .
Gilles 'SO- stop being evil'
@Gilles seperti yang Anda katakan, saya berlari du -x /dan saya melihat hanya 2G yang digunakan dan saya menghitung ukuran inode 160M. Itu membantu saya memahami barang-barang tetapi saya hanya ingin menyelesaikan masalah ini.
Rakesh Sankar
Apakah Anda menjalankan dusebagai root? Kalau tidak, itu hanya dapat melaporkan file yang dapat Anda akses.
Gilles 'SO- berhenti bersikap jahat'
@Gilles Saya menjalankan sebagairoot
Rakesh Sankar
Saya tidak punya banyak untuk ditambahkan di sini selain ncduprogram hebat , yang membantu memvisualisasikan penggunaan disk.
Rob

Jawaban:

4

Ketika file dihapus di * nix, mereka terus hidup pada disk (dan mengambil ruang disk) selama proses itu terbuka. Ini cukup umum untuk mengambil keuntungan dari ini untuk "mengamankan" file temp dengan membuat mereka dengan ukuran kecil, menghapusnya, dan kemudian menggunakan file yang dihapus untuk menyimpan data tanpa harus khawatir tentang proses lain (mudah) mendapatkan akses ke sana, jadi jumlah ruang dalam file yang dihapus dapat tumbuh cukup besar jika, katakanlah, database temp atau sesi editing multimedia sedang ditangani dengan cara ini. Kemungkinan lain untuk bagaimana Anda bisa memiliki begitu banyak ruang "hilang" adalah jika sistem telah ditingkatkan (beberapa kali) tanpa me-reboot atau memulai kembali program, sehingga semua perpustakaan lama Anda. Jadi diadakan oleh program yang dimulai sebelum tingkatkan dan masih berjalan.

dfmelihat ruang yang digunakan oleh file-file ini karena hanya melihat seberapa banyak ruang yang dialokasikan pada perangkat, tetapi dutidak melihatnya karena tidak ada entri direktori yang sesuai.

Ruang terpakai "Tersembunyi" seperti ini hanya bisa dibebaskan ketika proses yang telah menghapus file dibuka tutup. Anda dapat menemukan proses-proses ini dengan fuserperintah dan menghentikannya (atau, untuk banyak daemon, mengirim sinyal untuk menutup dan membuka kembali file yang terbuka).

Dave Sherohman
sumber
terima kasih, info bagus, sesuatu (lebih) saya mengerti hari ini. Tetapi untuk menemukan hiddenruang yang digunakan, saya mencoba menjalankan fuserperintah untuk melihat semua file yang sedang digunakan oleh suatu proses tetapi tidak terhubung - saya tidak dapat menemukan. Apakah Anda memiliki perintah atau arahan yang menuntun saya untuk menemukannya? Ini adalah perintah yang saya gunakanfuser -v -a /
Rakesh Sankar
Saya harus reboot untuk menghilangkan ruang tersembunyi tetapi saya tidak dapat menemukan solusi yang tepat untuk menghapus file-file yang tersembunyi.
Rakesh Sankar
1

Ada saat-saat ketika disk menjadi penuh, kemudian dapat menjadi bingung sampai reboot / remount bahwa disk masih penuh, bahkan ketika Anda telah menghapus banyak file.

BugFinder
sumber
Saya tidak dapat reboot karena ini adalah situs produksi. Tetapi saya sedang mencari solusi yang dapat membantu saya menemukan ruang tersembunyi ini dan membawanya kembali.
Rakesh Sankar
Mungkin produksi tetapi kadang-kadang reboot adalah satu-satunya jawaban. Itulah masalah yang disayangkan adalah disk root dan semua OS Anda ada di sana. Itulah sebabnya banyak yang menganjurkan penggunaan tmp, var, home dll pada disk lain, karena mereka kemudian dapat di-remount. Tampaknya lebih umum bahwa OS tidak menyadari ruang tersedia untuk disk root.
BugFinder
1

Di pihak saya, saya cukup restart syslogd untuk mendapatkan ruang disk kembali. 3GB saya hilang! Server saya sudah aktif dan berjalan selama 250 hari.

Vincent Martineau
sumber
0

Ada cara untuk membersihkan ruang tanpa me-restart aplikasi. Berikut detailnya:

  1. Katakanlah Anda memiliki proses foomenjalankan dan membuat file 2 GB bernama abc.log. Sekarang katakan abc.log ini dihapus oleh orang lain.

  2. Dapatkan foopid (misalkan 123). Maka /proc/123/fdakan muncul daftar deskriptor file yang dibuka oleh foo. Satu dengan abc.log akan ditampilkan sebagai terhapus. Katakanlah fdabs.log adalah 111. Jika Anda menjalankan less /proc/123/fd/111, itu akan tetap menunjukkan kepada Anda semua data 2 GB.

  3. Lari echo " " > /proc/123/fd/111. Ini akan menimpa konten dengan string kosong. Setelah perintah ini, jika Anda mencobanya dfakan menunjukkan tambahan 2 GB yang dipulihkan dengan membersihkan abc.log.

Itu dia. Saya mencoba ini pada CentOS dan berhasil.

Kaustubh Sathe
sumber
Ini adalah hal yang berguna untuk diketahui. Tapi itu bukan jawaban untuk pertanyaan itu.
Isaac Rabinovitch
maaf ans saya lebih ditujukan untuk membersihkan ruang disk jika Anda tahu proses id yang menghapus file. Untuk kasus khusus ini, Anda harus melihat semua file di / proc / [0-9] * / fd, ambil yang dihapus, dan ikuti logika yang disebutkan di atas.
Kaustubh Sathe
Jika Anda benar-benar ingin tahu file mana yang menyebabkan ruang disk bocor, bersihkan file yang dihapus sekaligus, periksa output df setiap kali dan catat informasi ini.
Kaustubh Sathe