Pertanyaan df di linux tidak menunjukkan ruang kosong yang benar setelah penghapusan file


Saya memiliki file server yang digunakan untuk menyimpan file. File mungkin berada di sana selama seminggu, atau selama satu tahun. Sayangnya, ketika saya menghapus file dari server, df komando tidak mencerminkan ruang yang dibebaskan. Jadi akhirnya, server terisi penuh (df menunjukkan 99%), dan skrip saya tidak mengirim file lagi di sana, kecuali mungkin ada beberapa lusin GB ruang kosong di sana.

saya mendapatkan noatime bendera pada partisi terpasang jika ada bedanya.


107
2018-02-08 07:36




Apakah ini terjadi pada satu partisi atau di semua partisi? - Khaled
Yah, ini terjadi pada partisi data utama saya, yang merupakan satu-satunya yang saya pedulikan, karena saya hanya menulis / menghapus file ke dalamnya.
Tolong terangkan saya dengan solusi, atau tautan ke satu.
Filesystem apa (s)? DF melakukan stat dari superblok, mungkin filesystem Anda tidak memperbarui inode sb. Sudahkah Anda mencoba menyiram cache? - beans
Menggunakan ext4. Bagaimana cara Anda membersihkan cache?


Jawaban:


Menghapus nama file tidak benar-benar menghapus file. Beberapa proses lain menahan file tersebut terbuka, menyebabkannya tidak dihapus; restart atau bunuh proses itu untuk melepaskan file.

Menggunakan

lsof +L1

untuk mengetahui proses mana yang menggunakan file yang dihapus (unlinked).


181
2018-02-08 07:48



File yang dihapus tidak diakses lebih dari sebulan, dan satu-satunya proses yang mengaksesnya adalah nginx, jadi tidak pasti.
+1. Juga, "lsof + L1" akan memberi tahu Anda program mana yang menahan file terbuka. - pehrs
sebagai root menjalankan "lsof -n | grep file," Anda akan terkejut melihat berapa lama file dapat bertahan karena proses membuat mereka terbuka untuk alasan apa pun. Jika semuanya gagal, reboot, saya merasa buruk menyarankan itu tetapi pasti akan memastikan tidak ada yang memegang file. Per pehrs, lsof + L1 mungkin adalah cara terbaik untuk melakukannya. - ScottZ
Anda baru saja menyelamatkan saya! Menghapus file log 93G dan tidak mendapatkan ruang kembali dan tidak bisa mencari tahu alasannya. Terima kasih. - Luke Cousins
Sepanjang baris yang sama dan dalam hal ini membantu orang lain, saya menghapus file akses.log nginx besar tetapi hanya mampu merebut kembali ruang setelah restart nginx: layanan nginx restart - Nick


sebagai Ignacio menyebutkan, menghapus file tidak akan membebaskan ruang sampai Anda menghapus proses yang menangani terbuka terhadap file itu.

Namun demikian, Anda dapat merebut kembali ruang tanpa membunuh proses. Yang perlu Anda lakukan adalah menghapus deskriptor file.

Pertama jalankan lsof | grep dihapus untuk mengidentifikasi proses memegang file

[hudson@opsynxvm0055 log]$ /usr/sbin/lsof |grep deleted
java       8859   hudson    1w      REG              253,0 3662503356    7578206 /crucible/data/current/var/log/fisheye.out (deleted)

Kemudian jalankan:

cd /proc/PID/fd

kemudian

[hudson@opsynxvm0055 fd]$ ls -l |grep deleted
total 0
l-wx------ 1 hudson devel 64 Feb  7 11:48 1 -> /crucible/data/current/var/log/fisheye.out (deleted)

The "1" akan menjadi deskriptor file. Sekarang ketik "> FD" untuk merebut kembali ruang itu

> 1

Anda mungkin perlu mengulangi operasi jika ada proses lain yang memegang file.


21
2018-02-07 01:24



apa yang dilakukan > FD melakukan? - Pred
itu menghilangkan deskriptor file - Adrián Deccico
Melakukan hal ini > perintah punya nama? saya harus beralih dari zsh ke bash agar bisa menggunakannya. Apakah mungkin untuk menjalankannya di zsh? - ariera
itu adalah pengalihan keluaran dan karenanya memotong file. Panjang dari "echo -n> 1" atau "true> 1". Itu tidak benar-benar menghapus FD, itu hanya menunjuk ke file kosong sesudahnya. - eckes


Salah satu kemungkinan adalah file yang Anda hapus memiliki lebih banyak referensi di sistem file. Jika Anda telah membuat hardlink, beberapa nama file akan menunjuk ke data yang sama, dan data (konten yang sebenarnya) tidak akan ditandai sebagai gratis / dapat digunakan sampai semua referensi untuk itu telah dihapus. Sebelum Anda menghapus file, baik stat mereka (Entri bernama Link) atau lakukan ls-l pada mereka (harus menjadi kolom kedua).

Jika ternyata file-file tersebut direferensikan di tempat lain, saya kira Anda harus me-i file (s) untuk menemukan nomor-inode, dan kemudian melakukan pencarian dengan -inum <nomor-inode> untuk menemukan referensi lain ke file itu (Anda mungkin juga ingin menggunakan -mount untuk tetap berada di dalam filesystem yang sama juga).


8
2018-02-08 10:01





File masih dikunci oleh proses yang membukanya. Untuk mengosongkan ruang, lakukan langkah-langkah ini:

  1. Menjalankan sudo lsof | grep deleted dan lihat proses mana yang memegang file. Contoh hasil:

    $ sudo lsof | grep deleted
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
    cron     1623 root    5u   REG   0,21        0 395919638 /tmp/tmpfPagTZ4 (deleted)
    
  2. Bunuh proses menggunakan sudo kill -9 {PID}. Dalam contoh di atas, PID adalah 1623.

    $ sudo kill -9 1623
    
  3. Menjalankan df untuk memeriksa apakah ruang sudah dibebaskan. Jika masih penuh, mungkin Anda perlu menunggu beberapa detik dan periksa lagi.


3
2018-02-16 05:31





Jika partisi telah dikonfigurasi untuk memesan bagian tertentu dari ruang disk hanya untuk penggunaan root, df tidak akan menyertakan ruang ini jika tersedia.

[root@server]# df -h
Filesystem            Size  Used Avail Use% Mounted on
...
/dev/optvol           625G  607G     0 100% /opt
...

Bahkan setelah ruang akan direklamasi dengan menghapus file / direktori, pengguna non-root tidak akan dapat menulis ke partisi tertentu.

Anda dapat dengan mudah memeriksa apakah itu kasus Anda dengan mencoba membuat file di perangkat sebagai pengguna root dan non-root.

Selain itu Anda dapat memeriksa konfigurasi sistem berkas dengan menjalankan

tune2fs -l <device> | egrep "Block count|Reserved block count

dan menghitung% aktual sendiri.

Untuk mengubah% disk disediakan untuk penggunaan hanya-root, jalankan

tune2fs -m <percentage> <device>

2
2018-05-08 10:31





Jawaban yang lain benar: Jika Anda menghapus file, dan ruang tidak dibebaskan, biasanya karena file masih tetap terbuka, atau ada hardlink lain untuk itu.

Untuk membantu mengatasi masalah, gunakan alat yang memberi tahu Anda di mana ruang drive dihabiskan: Anda dapat menggunakan du untuk mendapatkan gambaran tentang ke mana ruang pergi. Lebih baik lagi, gunakan alat grafis seperti xdiskusage (Ada banyak seperti ini) untuk memburu pelakunya. xdiskusase dan teman-teman membiarkan Anda menelusuri ke dalam ruang angkasa terbesar untuk menemukan di mana ruang berjalan.

Dengan begitu, Anda akan cepat menemukan file yang masih menempati ruang karena adanya hardlink kedua. Ini juga akan menunjukkan ruang yang ditempati oleh dihapus, tetapi membuka file (seperti (izin ditolak), saya percaya, karena tidak dapat membaca nama file).


1
2018-02-08 10:11





Karena saya tahu satu ton Anda melakukan ini untuk redhat di /var dan gzipping file yang mengharapkan FS menyusut, tetapi sebaliknya ia tumbuh, pastikan saja Anda memulai kembali syslog layanan. dan

lsof -v file

akan menunjukkan ini bagaimanapun juga.


1
2018-03-23 15:02



Ini tidak terlalu banyak; jawaban yang diterima mencakup logika di balik itu pada tahun 2001. Ketika Anda memiliki 50 perwakilan, gunakan komentar jika Anda ingin menambahkan kualifikasi ke jawaban yang ada. - Andrew B


Satu opsi lagi: Disk mungkin penuh karena proses yang terus menciptakan data: log, core dan sejenisnya. Ada kemungkinan bahwa ruang sebenarnya dibebaskan tetapi segera diisi. Saya benar-benar telah melihat kasus seperti itu. df dalam hal ini tidak memberikan gambar lubang. Menggunakan du untuk mempelajari lebih lanjut.


0
2017-07-17 12:01