Bagaimana cara mengubah ukuran file img yang dibuat dengan dd?


19

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?


Anda mungkin ingin menambahkan apa hasil yang diinginkan. yaitu: gambar kembali ke kartu, untuk disimpan dalam CD.
Wayne

Jawaban:


8

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 gzipatau 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.


1
bagaimana Anda bisa yakin bahwa semua file yang saat ini disimpan pada partisi tidak tersebar secara fisik di disk?
Valerio Santinelli

karena saya kira file tidak ditulis secara berurutan pada disk dan jika file ada di akhir penyimpanan, ketika saya memotong ukurannya, saya akan kehilangan konten file itu.
Valerio Santinelli

Karena OP bertanya bagaimana mengecilkan gambar disk tanpa kehilangan data. Jika Anda memotong gambar pada ukuran tertentu, Anda tidak dapat memastikan data akan disimpan.
Valerio Santinelli

@ValerioSantinelli: Di ​​mana tepatnya saya sarankan memotong gambar?
user1686

1
@ValerioSantinelli: Dengan menggunakan alat resize sistem file yang sesuai untuk sistem file Anda, misalnya resize2fsatau 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.
user1686

22

Menggunakannya resize2fsjauh 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 ...


Hanya sebuah catatan: untuk beberapa partisi, gunakan losetup --find --partscan xxx.imguntuk mengatur file gambar sebagai perangkat loop. kemudian jalankan lsblkuntuk menemukan partisi perangkat loop.
Yihui Xiong

Sepertinya tidak berfungsi untuk ISO image yang berisi sistem operasi. Setelah mengubah ukuran sistem, jangan boot.
SR

@SR sistem operasi Linux?
Rolf

1
Ini adalah jawaban yang sangat bagus, tetapi resize2fshanya untuk extNpartisi tipe. Jenis partisi lain akan membutuhkan alat lain.
Rolf

2

Saya juga mencobanya dengan qemu-img , dan itu bekerja seperti pesona:

qemu-img resize test.img 2G

Kami mengubah ukuran test.imguntuk menjadikannya 2G (2GB).

Bekerja tanpa cacat untukku.


1
Luar biasa, bekerja tanpa cacat untuk saya juga, mengompresi gambar Raspbian. sepenuhnya bekerja!
ffleandro

Ya, semuanya berfungsi, namun setelah boot, running df -hmenunjukkan ukuran aslinya. Bagaimana ini mungkin?
ffleandro

Rupanya, qemu-img bukan tabel partisi, jadi bagaimana kompresnya .img?
ffleandro

Saya dapat mengubah ukuran .img disk menjadi 1M yang pasti merusak citra disk. Adakah ide untuk membuat ukurannya lebih aman?
lesca

1

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 lsblkloop 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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.