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

144

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

Saya mendapat noatimebendera pada partisi yang dipasang jika itu membuat perbedaan.

Aminah Nuraini
sumber
Apakah ini terjadi pada satu partisi atau pada semua partisi?
Khaled
Yah, itu terjadi pada partisi data utama saya, yang merupakan satu-satunya yang saya pedulikan, karena saya hanya menulis / menghapus file ke dalamnya.
Tolong beri tahu saya dengan solusinya, atau tautan ke satu.
Sistem file apa? DF melakukan stat superblock, mungkin sistem file Anda tidak memperbarui inode sb. Sudahkah Anda mencoba flushing cache?
kacang
Menggunakan ext4. Bagaimana Anda membersihkan cache?

Jawaban:

237

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

Menggunakan

lsof +L1

untuk mengetahui proses mana yang menggunakan file yang dihapus (tidak ditautkan).

Ignacio Vazquez-Abrams
sumber
2
File yang dihapus tidak diakses dalam lebih dari sebulan, dan satu-satunya proses yang mengaksesnya adalah nginx, jadi itu diragukan.
40
+1. Juga, "lsof + L1" akan memberi tahu Anda program mana yang menahan file.
pehrs
4
sebagai root run "lsof -n | grep file," Anda akan terkejut melihat berapa lama file bisa bertahan karena proses menjaga mereka terbuka untuk alasan apa pun. Jika semuanya gagal, reboot, saya merasa tidak enak menyarankannya tetapi pasti akan memastikan tidak ada yang menahan file tersebut. Per pehrs, lsof + L1 mungkin merupakan cara yang lebih baik.
ScottZ
3
Anda baru saja menyelamatkan saya! Menghapus file log 93G dan tidak mendapatkan ruang kembali dan tidak tahu mengapa. Terima kasih.
Luke Cousins
1
Sepanjang baris yang sama dan dalam kasus ini membantu orang lain, saya menghapus file akses.log nginx besar tetapi hanya dapat merebut kembali ruang setelah restart nginx: service nginx restart
Nick
28

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

Namun demikian, Anda dapat merebut kembali ruang tanpa membunuh prosesnya. 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)

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

> 1

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

Adrián Deccico
sumber
1
apa yang > FDdilakukan?
Pred
itu menghapus deskriptor file
Adrián Deccico
2
apakah >perintah ini memiliki nama? saya harus beralih dari zsh ke bash agar dapat menggunakannya. Apakah mungkin menjalankannya di zsh?
ariera
1
itu adalah redirect output dan karena itu memotong file. Panjang dari akan menjadi "echo -n> 1" atau "true> 1". Itu tidak benar-benar menghapus FD, itu hanya menunjuk ke file kosong sesudahnya.
eckes
8

Satu kemungkinan adalah bahwa 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 bebas / dapat digunakan sampai semua referensi telah dihapus. Sebelum Anda menghapus file, baik itu stat (Entri bernama Tautan) atau lakukan ls-l pada mereka (harus menjadi kolom kedua).

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

Kjetil Joergensen
sumber
4

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

  1. Jalankan sudo lsof | grep deleteddan lihat proses mana yang menahan 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. Matikan proses menggunakan sudo kill -9 {PID}. Dalam sampel di atas, PID adalah 1623.

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

Aminah Nuraini
sumber
4

Jika partisi telah dikonfigurasikan untuk memesan ruang disk tertentu hanya untuk penggunaan root, dftidak 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 file dengan menjalankan

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

dan menghitung% aktual Anda sendiri.

Untuk mengubah% disk yang dicadangkan untuk penggunaan hanya root, jalankan

tune2fs -m <percentage> <device>
luka5z
sumber
1

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

Untuk membantu dalam pemecahan masalah, gunakan alat yang memberi tahu Anda di mana ruang drive dihabiskan: Anda dapat menggunakan duuntuk mendapatkan gambaran di mana ruang akan pergi. Lebih baik lagi, gunakan alat grafis seperti xdiskusage (ada banyak seperti ini) untuk memburu pelakunya. xdiskusage dan teman-teman memungkinkan Anda menelusuri ruang-ruang babi terbesar untuk menemukan ke mana ruang akan pergi.

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

sleske
sumber
1

Karena saya tahu banyak dari Anda melakukan ini untuk redhat /vardan gzipping file mengharapkan FS menyusut, tetapi malah tumbuh, pastikan Anda service syslog restart. dan

lsof -v file

akan menunjukkan ini padamu.

pengguna1802263
sumber
1
Ini tidak benar-benar menambah 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
0

Satu lagi opsi: Disk mungkin penuh karena proses yang terus-menerus membuat data: log, core dan sejenisnya. Ada kemungkinan bahwa ruang sebenarnya dibebaskan tetapi segera diisi. Sebenarnya saya sudah melihat kasus seperti itu. dfdalam hal ini sama sekali tidak memberikan gambar lubang. Gunakan duuntuk mempelajari lebih lanjut.

Chen Levy
sumber
0

Saya menggunakan EXT2, FSCK membantu saya dalam situasi ini. Coba shudown -F sekarang, setelah beberapa restart dan fscks, saya melihat setengah ruang yang digunakan.

Marcellus
sumber
1
Dear Marcellus, solusi Anda mencakup jawaban yang diterima; dan kadang-kadang Anda tidak ingin melakukan reboot jika Anda tidak dipaksa untuk ...
Deer Hunter
-1

Untuk memeriksa file yang terhapus yang telah ditempati memori, masukkan perintah

 $ sudo lsof | grep deleted

Ini akan menunjukkan file yang dihapus yang menyimpan memori.

Kemudian bunuh proses dengan pid atau nama

$ sudo kill <pid>
$ df -h

periksa sekarang Anda akan memiliki memori yang sama

Jika tidak ketikkan perintah di bawah ini untuk melihat file mana yang menempati memori

# cd /
# du --threshold=(SIZE)

menyebutkan ukuran apa pun itu akan menunjukkan file mana yang menempati di atas ukuran ambang dan menghapus file Anda akan menemukan memori dipertahankan

Javeed Shakeel
sumber
-4

buka terminal coba perintah ini df -Lalu gunakan perintah ini sudo du -h --max-depth = 1 / dalam perintah ini Anda akan menemukan detail penggunaan disk kemudian buka sebagai pengguna root menghapus file (root-local-share-trash) dan hapus file Anda

rilson
sumber