Dd ile oluşturulan img dosyası nasıl yeniden boyutlandırılır?


19

İki bölümlü bir 4GB SD karttan bir DD görüntüsü var, bu iki bölüm sadece yaklaşık 800 MB kullanıyor ve bu nedenle img dosya boyutunu azaltmak istiyorum.

Herkes "boş alan" img dosyasından kaldırmak için bir yol biliyor mu?


istediğiniz sonucun ne olduğunu eklemek isteyebilirsiniz. yani: CD'de saklamak için karta geri görüntü.
Wayne

Yanıtlar:


8

Öncelikle boş alanın gerçekten boş olduğundan ve silinen dosyaların artıklarını içermediğinden emin olun. Bunu yapmanın en kolay yolu, diskte yalnızca boş bayt içeren büyük bir dosya oluşturmak ve daha sonra silmektir.

# 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

Sonra gzipveya gibi bir aletle sıkıştırın xz. En düşük sıkıştırma seviyelerinde bile, uzun bir sıfır serisi iyi sıkıştırır:

# ls -s
4096M foo.img
# gzip foo.img
# ls -s
11M foo.img.gz

Diske yazarken görüntünün sıkıştırmasını açmanız gerektiğini unutmayın. Bu onu 'canlı' olarak kaldıracaktır:

# cat foo.img.gz | gunzip | dd of=/dev/sda

Çıkış aygıtının (sda) orijinal görüntüye sığacak boyutta olması gerektiğini unutmayın , aksi takdirde veriler kaybolacak veya bozulacaktır.


Görüntüyü kullanmaya devam etmek istiyorsanız alternatif bir yöntem - örneğin bir sanal makine ile - ham görüntüyü sanallaştırma yazılımı tarafından kullanılan görüntü biçimlerinden birine dönüştürmektir; örneğin Qemu için qcow2, VirtualBox için VDI veya VMware için VMDK.

Bu unutmayın hala yukarıdaki yöntemi kullanarak boş alan temizleyerek görüntü hazırlamak gerektirir.

# qemu-img convert -f raw -O qcow2 foo.img foo.qcow

# qemu-img convert -f raw -O vmdk foo.img foo.vmdk

Fakat yine de gerçek bir diske yazılacaksa, onu tekrar ham görüntüye dönüştürmelisiniz.


1
Şu anda bölümlerde depolanan tüm dosyaların diskte fiziksel olarak dağılmadığından nasıl emin olabilirsiniz?
Valerio Santinelli

çünkü dosyaların disk üzerine sırayla yazılmadığını ve bir dosyanın depolama alanının sonunda olduğunu varsayalım, boyutu düşürdüğümde, o dosyanın içeriğini kaybedeceğim.
Valerio Santinelli

Çünkü OP veri kaybetmeden bir disk görüntüsünün nasıl küçültüleceğini soruyor. Bir görüntüyü belirli bir boyutta keserseniz verilerin korunacağından emin olamazsınız.
Valerio Santinelli

@ValerioSantinelli: Görüntünün tam olarak nerede kesilmesini öneririm?
user1686

1
@ValerioSantinelli: Dosya sisteminiz için uygun dosya sistemi yeniden boyutlandırma aracını kullanarak, örneğin resize2fsveya ntfsresize(Linux'un FAT için aracı yoktur), daha küçük aygıta yazmadan önce veya yeni bir dosya sistemi oluşturarak ve yalnızca dosyaların üzerine kopyalayarak.
user1686

22

Kullanımı resize2fsçok daha kolay

resize2fs -M xxx.img

önce e2fsck yapmanız istenecektir - yani:

e2fsck -f -y xxx.img

(resim monte EDİLMEMELİDİR!)

Not: Bu sadece görüntü tek bir bölümdeyse çalışır, eğer çoklu bölümleri olan bir blok cihazı ise yukarıdaki cevaba bakınız ...


Yalnızca bir not: birden çok bölüm losetup --find --partscan xxx.imgiçin görüntü dosyasını bir döngü aygıtı olarak ayarlamak için kullanın . daha sonra lsblkdöngü cihazının bölümlerini bulmak için çalıştırın .
Yihui Xiong

İşletim sistemi içeren ISO görüntüsü için çalışmıyor gibi görünüyor. Yeniden boyutlandırmadan sonra sistem önyükleme yapmaz.
SR

@SR Linux işletim sistemi?
Rolf

1
Bu çok güzel bir cevap, ama resize2fssadece extNtip bölümler içindir. Diğer bölüm türleri için başka araçlar gerekir.
Rolf

2

Ayrıca qemu-img ile denedim ve bir cazibe gibi çalıştı:

qemu-img resize test.img 2G

2G (2GB) test.imgyapmak için yeniden boyutlandırıyoruz .

Benim için kusursuz çalıştı.


1
Harika, Raspbian görüntüsünü sıkıştırarak benim için de kusursuz çalıştı. tamamen çalışıyor!
ffleandro

Her şey çalışıyor, ancak önyükleme yaptıktan sonra koşu df -horijinal boyutunu gösteriyor. Bu nasıl mümkün olabilir?
ffleandro

Görünüşe göre, qemu-img bölümleme tablosunu değil, bu yüzden .img'yi nasıl sıkıştırır?
ffleandro

Bir .img diski, disk görüntüsünü kesen 1M'ye yeniden boyutlandırabilirim. Yeniden boyutlandırmayı daha güvenli hale getirmek için herhangi bir fikriniz var mı?
lesca

1

Ubuntu 16.10 bilgisayarımla ilgili yaklaşımları kullandım:

1) img dosyasını losetupyukarıdaki gibi önceki yazılarda açıklandığı gibi bir sonraki kullanılabilir döngü bölümüne eşleyin

2) lsblkGörüntü dosyanızın hangi döngü sürücüsüyle eşlendiğini kontrol edin, örn./dev/loop0

3) Yürüt sudo gparted /dev/loop0

4) Döngü bölüm (ler) ini uygun gördüğü şekilde daraltın; lütfen bu bölümleri ayırdığınızdan emin olun.

5) Yürüt fdisk /dev/loop0, sonra girin p, bu size çeşitli bölümlerin blok boyutunu ve bitiş bloğu numarasını gösterecektir.

6) Yürütme dd if=/dev/loop0 of=shrunk_image_file.img, o komuta seçenekleri uygulamak bs=[BlockSize]ve count=[EndBlockNumberOfLastLoopPartition+1]ve bir Küçüldü ve rightsized resim dosyası olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.