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.
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).
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.
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.
Kemudian kompres dengan alat seperti
gzip
atauxz
. Bahkan pada level kompresi terendah, serangkaian panjang nol akan kompres dengan baik:Perhatikan bahwa Anda harus membuka kompresi gambar saat menulis kembali ke disk. Ini akan mengompresnya 'hidup':
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.
Tetapi jika itu akan ditulis ke disk nyata lagi, Anda harus mengubahnya kembali menjadi gambar mentah.
sumber
resize2fs
atauntfsresize
(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 mudahAnda akan diminta untuk e2fsck terlebih dahulu - jadi:
(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 ...
sumber
losetup --find --partscan xxx.img
untuk mengatur file gambar sebagai perangkat loop. kemudian jalankanlsblk
untuk menemukan partisi perangkat loop.resize2fs
hanya untukextN
partisi tipe. Jenis partisi lain akan membutuhkan alat lain.Saya juga mencobanya dengan qemu-img , dan itu bekerja seperti pesona:
Kami mengubah ukuran
test.img
untuk menjadikannya 2G (2GB).Bekerja tanpa cacat untukku.
sumber
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 atas2) 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 masukkanp
, 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 opsibs=[BlockSize]
dancount=[EndBlockNumberOfLastLoopPartition+1]
dan Anda akan memiliki file gambar menyusut dan kanan.sumber