İ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?
İ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?
Yanıtlar:
Ö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 gzip
veya 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.
resize2fs
veya 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.
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 ...
losetup --find --partscan xxx.img
için görüntü dosyasını bir döngü aygıtı olarak ayarlamak için kullanın . daha sonra lsblk
döngü cihazının bölümlerini bulmak için çalıştırın .
resize2fs
sadece extN
tip bölümler içindir. Diğer bölüm türleri için başka araçlar gerekir.
Ayrıca qemu-img ile denedim ve bir cazibe gibi çalıştı:
qemu-img resize test.img 2G
2G (2GB) test.img
yapmak için yeniden boyutlandırıyoruz .
Benim için kusursuz çalıştı.
df -h
orijinal boyutunu gösteriyor. Bu nasıl mümkün olabilir?
Ubuntu 16.10 bilgisayarımla ilgili yaklaşımları kullandım:
1) img dosyasını losetup
yukarıdaki gibi önceki yazılarda açıklandığı gibi bir sonraki kullanılabilir döngü bölümüne eşleyin
2) lsblk
Gö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.