Bersihkan ruang yang tidak digunakan dengan nol (btrfs)

10

Bagaimana cara menghapus ruang yang tidak terpakai dengan nol? (Saya meminta alat untuk filesystem btrfs )

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 ext3, ext4: Bersihkan ruang yang tidak digunakan dengan nol (ext3, ext4) . Di sini saya minta btrfs

Klarifikasi "algoritma yang lebih cerdas": Seperti yang saya lihat bahwa "algoritma yang lebih cerdas" menyebabkan kebingungan, di sini saya akhirnya memutuskan untuk menambahkan baris tentang itu. Pembaca yang terhormat, tolong pikirkan sistem file sebagai datastructure. Untuk tujuan penyederhanaan, mari kita bayangkan self-balancing red-black holding tree map, yang digunakan sebagai asosiasi key-> value array, di mana nilainya adalah integer. Sasarannya adalah menghapus semua nilai negatif dengan nol. Algoritma "tidak pintar" akan beralih di atasnya dan menambahkan kunci: pasangan nilai ke peta baru (dengan akhirnya mengubah negatif ke nol). Algoritma pintar hanya akan mendeteksi tempat-tempat di mana nilai-nilai negatif disimpan dan menghapusnya di tempat .

Grzegorz Wierzowiecki
sumber
2
Apakah Anda mencoba sfillsarannya ? Sepertinya tidak memerlukan extX.
Kevin
1. Saya tahu Anda dapat mengisi file yang ada dengan nol dengan rusak, tetapi ini mungkin bukan, kan? 2. Bagaimana Anda membuat gambar-gambar itu? Mungkin Anda bisa melakukan pemotongan di sana?
Zlatko
@ kevin: itu sebabnya saya memposting jawaban sfill di pertanyaan awal. saya jarang menggunakan filesystem ext2,3,4 sendiri jadi saya menemukan utilitas yang hanya berfungsi pada ext * menjadi tidak berguna yang mengganggu.
cas
Saya butuh sesuatu yang "pintar". Sesuatu yang hanya mengisi ruang kosong dengan nol tanpa menyentuh tempat lain - maksud saya tanpa mempengaruhi struktur data internal, seperti B-Trees (Jika Anda penasaran, saya sudah menulis pertanyaan "kompresi" tetapi saya membutuhkannya juga untuk tujuan lain, seperti fs gambar de-duplikasi, analisis dan penelitian)
Grzegorz Wierzowiecki
cukup gunakan truncatedan / ataufallocate
mikeserv

Jawaban:

4

Berikut adalah repost yang dimodifikasi dan diperluas dari jawaban saya untuk pertanyaan Anda sebelumnya:

sfilldari secure-deletepaket dapat melakukan apa yang Anda inginkan.

Tidak seperti zerofree (yang hanya bekerja dengan sistem file ext2, ext3, dan ext4), sfill akan bekerja dengan sistem file apa pun.

misalnya

sfill -l -l -z /mnt/X

Halaman beranda sfill / secure-delete sekarang tampaknya telah menghilang, tetapi dipaket 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.

CATATAN: sfill hanya berfungsi pada sistem file yang terpasang. Jika Anda nol-mengisi file gambar dari sistem host daripada dari dalam VM, Anda harus me-mount gambar fs pada host. Metode yang tepat bervariasi tergantung pada jenis file gambar apa itu (mis. Qcow2 atau mentah).

Memasang gambar 'mentah' mudah dan langsung. Cukup gunakan kpartxpada file gambar untuk membuat perangkat loopback dan / dev / mapper / entri untuk setiap partisi kemudian dapat dipasang secara individual.

inilah skrip parsial yang dimodifikasi dari fragmen skrip yang saya gunakan untuk me-mount gambar hard-disk freedos net-bootable (digunakan untuk pembaruan bios pada mesin di mana flashrom tidak berfungsi):

image="myrawimagefile.img"

# use kpartx to build /dev/mapper device nodes
KP=$(kpartx -a -v "$image")

# now mount each partition under ./hd/
for p in $(echo "$KP" | awk '/^add map/ {print $3}') ; do
  dm="/dev/mapper/$p"
  fp=$(echo "$p" | sed -r -e 's/^loop[0-9]+//')
  mkdir -p "./hd/$fp"
  mount "$dm" "./hd/$fp"
  sfill -l -l -v "./hd/$fp"
  umount "$dm"
done

# now remove the loopback device and /dev/mapper entries
kpartx -d "$image"

CATATAN: mengasumsikan setiap partisi dalam gambar dapat dipasang. benar dalam kasus penggunaan saya (gambar hd freedos dengan satu partisi). tidak benar jika salah satu partisi, katakanlah, bertukar ruang. Mendeteksi partisi seperti itu dan menggunakan dd ke nol partisi swap dibiarkan sebagai latihan untuk pembaca :)

Metode ini, atau varian dari itu, harus bekerja untuk volume LVM juga.

Jika gambar Anda qcow maka Anda dapat menggunakan qemu-nbdalat dari qemu-utilspaket, yang akan menyajikan file gambar dan partisi-partisi sebagai perangkat blok jaringan - misalnya / dev / nbd0 / dev / ndb0p1 - yang dapat digunakan dengan cara yang mirip dengan / perangkat dev / mapper di atas.

Mungkin lebih mudah dan lebih mudah (tetapi lebih memakan waktu) untuk digunakan qemu-imguntuk mengkonversi dari qcow ke mentah, menggunakan metode untuk mentah di atas, dan kemudian mengubah gambar mentah yang dimodifikasi kembali ke qcow2 terkompresi. Ini mungkin akan menghasilkan gambar yang sedikit lebih kecil daripada menggunakan qemu-nbd karena Anda akan mengompres gambar qcow2 yang baru saat sedang dibuat.

cas
sumber
1
Maksud saya adalah, bahwa itu tidak dianggap sebagai cara "pintar" untuk mengisi ruang yang tidak digunakan dengan nol. Ini paling jelas, cara khas untuk melakukan ini. Saya tidak bertanya tentang hal-hal seperti itu.
Grzegorz Wierzowiecki
1
Tolong jelaskan algoritma "pintar" yang tidak spesifik untuk keluarga sistem file tertentu (seperti zerofill untuk ext2 / 3/4). Anda menginginkan sebuah program yang dapat melakukan pekerjaan itu. Anda tidak mengatakan itu harus ajaib juga.
cas
1
dan, sungguh, jika filesystem tidak digunakan (karena, misalnya, itu dipasang pada host untuk zerofilling) apa bedanya seberapa pintar algoritma itu? Mencari-cari metadata fs mencari sektor kosong tidak akan menjadi lebih cepat atau lebih baik daripada hanya menulis isi besar penuh dengan NUL ... filesystem itu sendiri sudah cukup pintar untuk mencari tahu di mana ruang kosong.
cas
2
Di satu sisi, untuk kebutuhan Anda sudah cukup - jadi pertanyaan saya sudah berisi potongan kode dengan solusi ini - jadi jawaban Anda tidak memberikan sesuatu yang baru. Di sisi lain, kebutuhan saya memerlukan apa yang saya tentukan, karena saya ingin menghapus ruang yang tidak digunakan dengan nol tanpa mengubah struktur internal (misalnya menyeimbangkan kembali "Dancing B-Trees" atau jenis struktur data lainnya (misalnya untuk analisis dan de-duplikasi) tujuan)
Grzegorz Wierzowiecki
2
@cas - Saya pikir Anda melewatkan fakta bahwa pengisian nol adalah langkah penting sebelum memadatkan virtual-hard-drive di VM. Jika Anda memiliki disk ekspansi 500 GB, dengan 10 GB file dan 10 GB ruang "kosong" (yaitu file yang dihapus), menjalankan pendekatan "file nol besar" yang naif akan memakan waktu lebih lama, dan membutuhkan VHD untuk membengkak hingga 500 GB penuh. Saya berani bertaruh OP berasumsi utilitas harus spesifik FS juga.
Nama Palsu
3

Cara yang benar dan "pintar" untuk membersihkan ruang kosong menggunakan:

fstrim /mountpoint

Gunakan ini pada sistem file yang terpasang.

Penting untuk dicatat bahwa tidak ada keuntungan keamanan untuk ini. Jika Anda ingin menghapus disk Anda untuk keamanan, buat cadangan file Anda, nol seluruh disk dengan perintah seperti "rusak" dan kemudian kembalikan file Anda.

Namun solusinya berfungsi dengan baik jika disk Anda tipis pada sistem file yang jarang dan Anda ingin memulihkan ruang yang tidak digunakan.

DustWolf
sumber