Saya memiliki gambar DD dari kartu SD 4GB yang memiliki dua partisi, dua partisi ini hanya menggunakan sekitar 800 MB dan karena itu saya ingin mengurangi ukuran img fie.
Adakah yang tahu cara menghapus "ruang kosong" dari file img?
Saya memiliki gambar DD dari kartu SD 4GB yang memiliki dua partisi, dua partisi ini hanya menggunakan sekitar 800 MB dan karena itu saya ingin mengurangi ukuran img fie.
Adakah yang tahu cara menghapus "ruang kosong" dari file img?
Jawaban:
Pertama-tama pastikan ruang kosong benar-benar kosong, dan tidak mengandung sisa file yang dihapus. Cara termudah untuk mencapai ini adalah dengan membuat file besar pada disk, yang hanya berisi byte nol, lalu hapus.
# losetup --find --partscan foo.img
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 4096M 0 loop
├─loop0p1 259:0 0 2048M 0 loop
└─loop0p2 259:1 0 2048M 0 loop
# for part in /dev/loop0p*; do
mount $part /mnt
dd if=/dev/zero of=/mnt/filler conv=fsync bs=1M
rm /mnt/filler
umount /mnt
done
dd: error writing ‘/mnt/filler’: No space left on device
dd: error writing ‘/mnt/filler’: No space left on device
# losetup --detach /dev/loop0
Kemudian kompres dengan alat seperti gzip
atau xz
. Bahkan pada level kompresi terendah, serangkaian panjang nol akan kompres dengan baik:
# ls -s
4096M foo.img
# gzip foo.img
# ls -s
11M foo.img.gz
Perhatikan bahwa Anda harus membuka kompresi gambar saat menulis kembali ke disk. Ini akan mengompresnya 'hidup':
# cat foo.img.gz | gunzip | dd of=/dev/sda
Perhatikan bahwa perangkat keluaran (sda) harus berukuran cukup agar sesuai dengan gambar asli , jika tidak data akan hilang atau rusak.
Metode alternatif, jika Anda ingin tetap menggunakan gambar - misalnya dengan mesin virtual - adalah mengubah gambar mentah menjadi salah satu format gambar yang digunakan oleh perangkat lunak virtualisasi; mis. qcow2 untuk Qemu, VDI untuk VirtualBox, atau VMDK untuk VMware.
Perhatikan bahwa ini masih mengharuskan Anda untuk menyiapkan gambar dengan membersihkan ruang kosong menggunakan metode di atas.
# qemu-img convert -f raw -O qcow2 foo.img foo.qcow
# qemu-img convert -f raw -O vmdk foo.img foo.vmdk
Tetapi jika itu akan ditulis ke disk nyata lagi, Anda harus mengubahnya kembali menjadi gambar mentah.
resize2fs
atau ntfsresize
(Linux tidak memiliki alat untuk FAT), sebelum menulisnya ke perangkat yang lebih kecil, atau dengan membuat sistem file baru dan menyalin hanya file-file.
Menggunakannya resize2fs
jauh lebih mudah
resize2fs -M xxx.img
Anda akan diminta untuk e2fsck terlebih dahulu - jadi:
e2fsck -f -y xxx.img
(gambar TIDAK boleh dipasang!)
Catatan: ini hanya akan berfungsi jika gambar adalah dari satu partisi, jika itu adalah perangkat blok lengkap dengan beberapa partisi lihat jawaban di atas ...
losetup --find --partscan xxx.img
untuk mengatur file gambar sebagai perangkat loop. kemudian jalankan lsblk
untuk menemukan partisi perangkat loop.
resize2fs
hanya untuk extN
partisi tipe. Jenis partisi lain akan membutuhkan alat lain.
Saya juga mencobanya dengan qemu-img , dan itu bekerja seperti pesona:
qemu-img resize test.img 2G
Kami mengubah ukuran test.img
untuk menjadikannya 2G (2GB).
Bekerja tanpa cacat untukku.
df -h
menunjukkan ukuran aslinya. Bagaimana ini mungkin?
Saya telah menggunakan pendekatan gparted dengan komputer Ubuntu 16.10 saya:
1) Petakan file img ke partisi loop yang tersedia berikutnya losetup
, seperti yang dijelaskan dalam posting sebelumnya seperti di atas
2) Periksa dengan lsblk
loop drive mana file gambar Anda dipetakan, misalnya/dev/loop0
3) Jalankan sudo gparted /dev/loop0
4) Kecilkan partisi loop yang dianggap sesuai; harap pastikan partisi ini dilepas.
5) Jalankan fdisk /dev/loop0
, lalu masukkan p
, ini akan menunjukkan ukuran blok dan nomor blok akhir dari berbagai partisi.
6) Jalankan dd if=/dev/loop0 of=shrunk_image_file.img
, terapkan pada perintah itu opsi bs=[BlockSize]
dan count=[EndBlockNumberOfLastLoopPartition+1]
dan Anda akan memiliki file gambar menyusut dan kanan.