Katakan fs untuk membebaskan ruang dari file yang dihapus SEKARANG

73

Apakah ada cara untuk memberitahu kernel untuk mengembalikan ruang disk kosong sekarang? Seperti menulis ke sesuatu di / proc /? Menggunakan Ubuntu 11.10 dengan ext4.

Ini mungkin merupakan tema lama dan sangat berulang. Setelah menekan 0 spasi hanya diperhatikan ketika editor saya tidak dapat menyimpan file kode sumber yang telah saya buka, yang ngeri saya sekarang memiliki ukuran 0 byte dalam daftar folder, saya pergi menghapus kesenangan.

Saya menghapus 100-an MB file besar baik dari pengguna dan dari root, dan melakukan beberapa hardlinking juga.

Tepat sebelum saya melakukannya apt-get cleanada lebih dari 900MB di / var / cache / apt / arsip, sekarang hanya ada 108KB:

# du
108 /var/cache/apt/archives

Satu jam kemudian masih tidak ada ruang kosong dan tidak dapat menyimpan file berharga saya dibuka di editor, tetapi perhatikan perbedaan di bawah ini:

# sync; df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda4             13915072  13304004         0 100% /

Ada saran? Saya mematikan beberapa layanan / proses tetapi tidak yakin bagaimana memeriksa siapa yang mungkin secara aktif memakan ruang disk.

Info lebih lanjut

# dumpe2fs  /dev/sda4
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              884736
Block count:              3534300
Reserved block count:     176715
Free blocks:              422679
Free inodes:              520239
First block:              0
Block size:               4096
Fragment size:            4096
Marcos
sumber
4
Sistem file segera membebaskan ruang. Namun, fitur blok cadangan root dari ext [234] dan bagaimana kernel membuat file terbuka dicadangkan dapat memberikan tampilan ruang yang hilang.
hhaamu
Jika Anda memiliki beberapa filesystem (paten), mengosongkan ruang dalam satu tidak akan ada gunanya di yang lain.
vonbrand
Mengapa saya bisa mengisi partisi sebelum blok 5Go yang "dipesan" mendapatkan kembali diri mereka sendiri?
Psddp

Jawaban:

117

Periksa dengan lsofuntuk melihat apakah ada file yang ditahan terbuka. Ruang tidak akan dibebaskan sampai mereka ditutup.

sudo /usr/sbin/lsof | grep deleted

akan memberi tahu Anda file yang dihapus masih terbuka.

Aleksandar Ivanisevic
sumber
Baik. Menunjukkan kepada saya beberapa mysqldkunci di / tmp, tetapi banyak apport-gtpenggunaan file yang punah di / var / lib / apt / daftar / parsial / yang tampaknya telah terakumulasi. Jadi saya mungkin killall apport-gttetapi akan menyelidikinya terlebih dahulu.
Marcos
1
Menandai sebagai jawaban terdekat, meskipun tidak pernah benar-benar "mengembalikan" ruang segera setelah menutup file yang menangani / proses menggunakannya. Mencari pendekatan berbasis kernel / proc / fs lainnya.
Marcos
18
Anda juga dapat menggunakan lsof +L1(pilih file yang terbuka yang telah dibatalkan tautannya).
Martin Fido
Informasi dalam jawaban ini benar, tetapi masalah yang dimiliki OP kemungkinan bukan disebabkan oleh ini tetapi oleh ruang cadangan root (yang alamat lainnya alamat).
marcelm
37

Gunakan lsofuntuk menemukan file yang dihapus, tetapi terbuka, masih memakan ruang:

lsof | grep deleted | grep etilqs_1IlrBRwsveCCxId
chrome     3446       user  128u      REG              253,2              16400       2364626 /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)  

Temukan entri di /proc/<pid>/fd/yang cooresponds ke filehandle:

ls -l /proc/3446/fd/etilqs_1IlrBRwsveCCxId
lrwx------. 1 user unix 64 Feb 11 15:31 128 -> /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)

Sekarang, tepat cat /dev/nulldi fd:

cat /dev/null > /proc/3446/fd/128

Perhatikan bahwa inode masih terbuka, tetapi sekarang panjangnya 0

chrome     3446       user  128u      REG              253,2         0    2364626 /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)
BillQ
sumber
5
Penggunaan berlebihan catuntuk memotong. Di Bourne shell, cukup > /proc/3446/fd/128.
200_sukses
2
JANGAN lakukan ini jika program Anda benar-benar diharapkan untuk membaca kembali sebagian file di masa depan yang mungkin atau mungkin tidak tersedia dalam cache halaman.
Michael R. Hines
13

dftidak akan menampilkan ruang yang disediakan untuk root(bahkan saat dijalankan sebagai root):

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

Bagaimana cara mengubah "persentase blok yang dicadangkan"

  1. Kurangi ruang yang dipesan hingga 4%

    # tune2fs -m4 /dev/sda4

df -h sekarang menunjukkan 45 juta gratis.

  1. Menyimpan file saya dengan cepat
  2. Masukkan kembali ke 5%

    # tune2fs -m5 /dev/sda4

Marcos
sumber
2
Ruang untuk root dilindungi saat ini hampir selalu terlalu besar. Anda dapat menguranginya hingga beberapa persen. dfmenampilkan ruang yang dapat digunakan oleh pengguna normal. Saat apt berjalan sebagai root, ruang yang disediakan hanya berguna untuk melindungi dari pengisian yang disebabkan oleh pengguna non-root (= pengguna normal dan layanan yang memiliki pengguna sendiri).
jofel
Saya setuju; suatu mkfshari ini harus memesan misalnya. 5% atau 300MB, mana yang kurang . Baru saja mengatur ulang beberapa server saya menjadi 2% dan membebaskan GB!
Marcos
3
@ jofel, tidak, tidak. Setiap kali Anda menggunakan lebih dari 90%, Anda mulai mendapatkan banyak fragmentasi. Anda perlu mengosongkan lebih banyak ruang, tidak berjalan mendekati pemanfaatan 100%.
psusi
@psusi Anda benar, terima kasih atas komentar Anda. Tetapi kesempatan untuk menggunakan (sementara) hampir semua ruang yang tersedia sebagai pengguna normal bisa sangat praktis dan dengan ext4, hal-hal tidak lagi buruk, lihat unix.stackexchange.com/a/7965/15241
jofel
7

Di Ubuntu, jika Anda menghapus file menggunakan tempat sampah Anda, file Anda kemungkinan besar tidak akan sepenuhnya dihapus.

Bahkan setelah mengosongkan sampah Anda, file Anda akan tetap ada ~/.local/share/Trash/expungedsampai setelah reboot dan mungkin bahkan lebih lama.

Saya belum menemukan alasan yang bagus untuk ini, tetapi jika saya kehabisan ruang, saya selalu secara manual rmmenghapus file sampah.

kwarrick
sumber
1
Poin bagus. Meskipun saya salah satu dari mereka yang hidup dan mati oleh baris perintah, dan jarang menggunakan file manager grafis. Belum melihat bahwa folder yang dihapus sebagai tempat persembunyian - klik Empty Trash selalu bersifat final dan mengembalikan ruang disk saya saat diperlukan.
Marcos
6
sudo lsof | grep "(deleted)$" | sed -re 's/^\S+\s+(\S+)\s+\S+\s+([0-9]+).*/\1\/fd\/\2/' | while read file; do sudo bash -c ": > /proc/$file"; done

Penjelasan:
Grep lsofoutput untuk mengekstrak hanya file yang dihapus. Sed ekstrak id proses dan id arsip yang diajukan dari setiap baris, dan buat string dalam format {pid}/fd/{fid}. Sementara loop dan output tidak ada untuk setiap file, mengaturnya menjadi kosong.

Sepero
sumber
3
Saya mendapat Galat "galat sintaksis dekat token tak
terduga`
5

Saya bertanya-tanya apakah syncada bantuan di sini - tetapi seharusnya tidak, seperti IIRC di sebagian besar ("banyak"?) Sistem, filesystem disinkronkan setiap 30 detik.

Saya akan memeriksa log kernel (jadi dmesg) untuk menemukan jika sesuatu yang tidak menyenangkan sedang berjalan dan berjalan lsofuntuk melihat apakah ada file yang besar dan terhapus masih terbuka (sebenarnya, saya pikir file yang dihapus akan ditandai seperti itu dalam lsofoutput).

Dua alasan (salah satunya ditunjukkan dalam pertanyaan yang Anda tautkan) yang dapat menyebabkan file yang dihapus tidak memiliki ruang kosong

  • file yang tidak benar-benar dihapus: Anda menghapus file yang di-hardlink di tempat lain (lebih tepatnya, Anda unlink()mengedit file dengan lebih dari satu tautan)
  • file yang masih terbuka: file yang dibuka menggunakan bookkept, well, file, inode sendiri, bukan entri direktori, jika Anda menghapus entri, inode akan tetap di sana selama masih terbuka.

Tapi saya tidak tahu alasan spesifik mengapa itu bisa terjadi dengan begitu banyak file ...

njsg
sumber
synctidak pernah membantu. Adapun log, ini adalah sistem Ubuntu jadi itu sangat buggy, jadi ya mereka biasanya berisik. apporttelah sering digunakan karena setiap pembaruan apt-get setiap malam macet, meskipun / var / crash hanya memiliki 77MB. Juga perhatikan atdtelah membanjiri / var / log / syslog dengan baris berulang seperti atd[8892]: File a0015c0152ab76 is in wrong format - abortingmungkin karena beberapa file di / var / spool / cron / atspool semua berukuran 0, membuat masalah melingkar tentu saja
Marcos
1

CentOS 6.3 juga melakukan hal yang tidak-benar-benar-mengosongkan-sampah-ketika-Anda-kosong-sampah-kaleng. Saya tidak dapat menemukan cara untuk mendapatkan kembali ruang sampai saya hanya berlari rm -rf ~/.local/share/Trash/expunged/. Menyebabkan banyak goresan kepala.

Biggles
sumber