Bersihkan ruang yang tidak digunakan dengan nol (ext3, ext4)

73

Bagaimana cara menghapus ruang yang tidak terpakai dengan nol? (ext3, ext4)

Saya mencari sesuatu yang lebih pintar daripada

cat /dev/zero > /mnt/X/big_zero ; sync; rm /mnt/X/big_zero

Seperti FSArchiver sedang mencari "ruang bekas" dan mengabaikan situs yang tidak digunakan, tetapi berlawanan.

Tujuan: Saya ingin mengompres gambar partisi, jadi mengisi ruang yang tidak digunakan dengan nol sangat dianjurkan.

Btw. Untuk btrfs: Bersihkan ruang yang tidak digunakan dengan nol (btrfs)

Grzegorz Wierzowiecki
sumber
1
Ada dua jenis jawaban yang berbeda. Apa yang ingin Anda capai? Salah satu dari 1) keamanan, dengan melarang seseorang untuk membaca data tersebut, atau 2) mengoptimalkan kompresi seluruh partisi atau [kinerja SSD] ( en.wikipedia.org/wiki/Trim_(computing) ?
Totor

Jawaban:

77

Utilitas semacam itu zerofree.

Dari uraiannya:

Zerofree menemukan blok yang tidak terisi, non-zeroed dalam sistem file ext2 atau ext3 dan mengisinya dengan nol. Ini berguna jika perangkat tempat sistem file ini berada adalah disk image. Dalam kasus ini, tergantung pada jenis disk image, utilitas sekunder mungkin dapat mengurangi ukuran disk image setelah zerofree dijalankan. Zerofree mengharuskan sistem file dilepas atau dipasang hanya-baca.

Cara biasa untuk mencapai hasil yang sama (mem-nolkan blok yang tidak digunakan) adalah dengan menjalankan "dd" lakukan membuat file penuh dengan nol yang mengambil seluruh ruang kosong di drive, dan kemudian hapus file ini. Ini memiliki banyak kelemahan, yang Zerofree meringankan:

  • itu lambat
  • itu membuat gambar disk (sementara) tumbuh hingga batas maksimalnya
  • itu (sementara) menggunakan semua ruang kosong pada disk, sehingga tindakan penulisan bersamaan lainnya bisa gagal.

Zerofree telah ditulis untuk dijalankan dari sistem GNU / Linux yang diinstal sebagai OS tamu di dalam mesin virtual. Jika ini bukan kasus Anda, Anda hampir pasti tidak membutuhkan paket ini.

PEMBARUAN # 1

Deskripsi paket .deb berisi paragraf berikut sekarang yang akan menyiratkan ini akan berfungsi dengan baik dengan ext4 juga.

Deskripsi: nol blok bebas dari sistem file ext2, ext3 dan ext4 Zerofree menemukan blok yang tidak terisi dengan konten nilai non-nol dalam sistem file ext2, ext3 atau ext4 dan mengisinya dengan nol ...

Penggunaan lainnya

Aplikasi lain utilitas ini adalah untuk mengompresi gambar disk yang merupakan cadangan disk nyata. Contoh khas dari ini adalah dump kartu SD di BeagleBone atau Raspberry Pi. Setelah ruang kosong dipusatkan, gambar cadangan dapat dikompres lebih efisien.

enzotib
sumber
1
Apakah ini laman resmi alat intgat.tigress.co.uk/rmy/uml/index.html ? Apakah Anda pikir itu aman untuk digunakan dengan ext4?
Grzegorz Wierzowiecki
2
@GrzegorzWierzowiecki: ya, itu halamannya, tapi untuk debian dan teman-teman itu sudah ada di dalam repo. Saya menggunakan partisi ext4 pada disk virtual untuk berturut-turut mengecilkan gambar file disk, dan tidak punya masalah.
enzotib
1
Ini tidak setara dengan ddmetode kasar dalam pertanyaan asli, karena tidak berfungsi pada sistem file yang di-mount.
jlh
halaman zerofree berbicara tentang tambalan yang memungkinkan Anda melakukan "filesystem di-mount dengan opsi zerofree" sehingga selalu nol menghapus file yang dihapus secara terus-menerus. apakah ini membutuhkan kompilasi ulang kernel? adakah cara yang lebih mudah untuk mencapai hal yang sama?
endolith
2
Hati-hati - Saya kehilangan filesystem ext4 menggunakan zerofreeAstralinux (berbasis Debian) ...
Hubbitus
33

Ringkasan metode (seperti yang disebutkan dalam pertanyaan ini dan di tempat lain) untuk membersihkan ruang yang tidak digunakan pada ext2 / ext3 / ext4:

Menempatkan ruang yang tidak digunakan

Sistem file tidak dipasang

  • Jika "disk" sistem file Anda aktif disediakan tipis (misalnya SSD modern yang mendukung TRIM, file VM yang formatnya mendukung sparseness, dll.) Dan kernel Anda mengatakan perangkat blok memahaminya, Anda dapat menggunakan e2fsck -E discard src_fsuntuk membuang ruang yang tidak digunakan (memerlukan e2fsprogs 1.42.2 atau lebih tinggi).
  • Menggunakan zerofree (misalnya zerofree src_fs) untuk secara eksplisit menulis nol di atas blok yang tidak digunakan.
  • Menggunakan e2image -rap src_fs dest_fsuntuk hanya menyalin blok yang digunakan (filesystem baru harus pada "disk" yang tidak memiliki titik nol, membutuhkan e2fsprogs 1.42.9 atau lebih tinggi).

Sistem file sudah terpasang

  • Jika "disk" sistem file Anda aktif disediakan tipis (misalnya SSD modern yang mendukung TRIM, file VM yang formatnya mendukung sparseness dll.), Kernel Anda mengatakan perangkat blok mengerti dan akhirnya driver sistem file ext mendukungnya yang dapat Anda gunakan fstrim /mnt/fs/untuk meminta sistem file untuk membuang ruang yang tidak digunakan.
  • Menggunakan cat /dev/zero > /mnt/fs/zeros; sync; rm /mnt/fs/zeros( sfilldari penghapusan aman menggunakan teknik ini). Metode ini tidak efisien, tidak direkomendasikan oleh Ted Ts'o (penulis ext4), mungkin tidak nol hal-hal tertentu dan dapat memperlambat masa depan fsck.

Memasang sistem file akan memberikan hasil yang lebih baik daripada menginstalnya. Membuang cenderung menjadi metode tercepat ketika banyak ruang yang sebelumnya digunakan perlu memusatkan perhatian tetapi menggunakan zerofreesetelah proses membuang kadang-kadang bisa sedikit lebih sedikit nol (tergantung pada bagaimana membuang dibuang pada "disk").

Membuat file gambar lebih kecil

Gambar dalam format VM khusus

Anda perlu menggunakan alat disk image yang sesuai (seperti qemu-img convert src_image dst_image) untuk memungkinkan ruang kosong untuk direklamasi dan untuk memungkinkan file yang mewakili gambar menjadi lebih kecil.

Gambar adalah file mentah

Salah satu teknik berikut ini dapat digunakan untuk membuat file jarang (sehingga menjalankan ruang berhenti nol):

  • cp --sparse=always src_image dst_image.
  • fallocate -d src_image (membutuhkan util-linux v2.25 atau lebih tinggi).

Saat ini mungkin lebih mudah untuk menggunakan alat seperti virt-sparsify untuk melakukan langkah-langkah ini dan lebih banyak lagi dalam sekali jalan.

 Sumber

Segera
sumber
15

sfilldari secure-delete dapat melakukan ini dan beberapa pekerjaan terkait lainnya.

misalnya

sfill -l -l -z /mnt/X

PEMBARUAN # 1

Ada pohon sumber yang tampaknya digunakan oleh proyek ArchLinux di github yang berisi sumber sfillyang merupakan alat yang termasuk dalam paket Secure-Delete.

Salinan sfillhalaman manual ada di sini:

cas
sumber
URL itu sudah usang. tidak tahu di mana beranda sekarang (atau bahkan jika masih memiliki), tetapi itu dikemas untuk debian dan ubuntu. mungkin distro lain juga. jika Anda memerlukan kode sumber, itu dapat ditemukan di arsip debian jika Anda tidak dapat menemukannya di tempat lain.
cas
URL halaman usang sudah diperbaiki sekarang. Sepertinya "Digipedia" tidak lagi berarti.
mwfearnley
8

Jika Anda memiliki e2fsprogs 1.42.9, maka Anda dapat menggunakan e2imageuntuk membuat gambar partisi tanpa ruang kosong di tempat pertama, sehingga Anda dapat melewati langkah zeroing.

psusi
sumber
Saya tidak dapat (dengan mudah) menemukan info online tentang parameter ini, tetapi mereka memang diberikan dalam catatan rilis 1.42.9: e2fsprogs.sf.net/e2fsprogs-release.html#1.42.9
mwfearnley
1
Itu alat yang berharga! Namun, jawaban Anda akan lebih baik jika itu juga menjelaskan cara menggunakannya. Itu e2image -ar /dev/foo1 | gzip > fs.img.gz, atau beberapa variasi darinya. Sertakan -funtuk menggunakannya pada fs yang terpasang.
marcelm
0

Anda bisa menggunakannya sfill. Ini solusi yang lebih baik untuk volume tipis.

pengguna64219
sumber
Jika Anda ingin mengomentari jawaban cas, tunggu sampai Anda memiliki cukup reputasi untuk melakukannya.
Anthon
1
Saya pikir jawabannya merujuk ke manpages.ubuntu.com/manpages/lucid/man1/sfill.1.html ... yang setidaknya merupakan upaya menjawab. ("online" dalam hal ini berarti "dengan sistem file terpasang", bukan "di web").
derobert
0

jika Anda tidak ingin menggunakan alat tambahan metode ini harus lebih cepat daripada cat /dev/zero > /mnt/fs/zeros:

dd if=/dev/zero of="/mnt/fs/filler" bs=10485760
dd if=/dev/zero of="/mnt/fs/filler1" bs=1
rm /mnt/fs/filler
rm /mnt/fs/filler1
eadmaster
sumber
Mengapa itu lebih cepat daripada cat? (Tidak, argumen ukuran blok ddtidak membantu)
marcelm
2
Ya, tapi itu tidak membuat ddlebih cepat. Bahkan, itu mungkin membuat catlebih cepat. Ukuran blok hanya penting untuk meminimalkan overhead panggilan sistem, dan mengoptimalkan penggunaan cache CPU. Dengan overhead syscall, Anda memasuki area pengembalian yang semakin berkurang. Cache mulai terasa sakit di atas, katakanlah, 1MiB. Dan ketika beroperasi pada disk nyata, Anda I / O terikat dan intinya sebagian besar diperdebatkan. Coba ukur sendiri.
marcelm