Eu tenho uma imagem DD de um cartão SD de 4GB que possui duas partições, essas duas partições estão usando apenas cerca de 800 MB e, como tal, desejo reduzir o tamanho da imagem.
Alguém sabe como remover o "espaço livre" do arquivo img?
Eu tenho uma imagem DD de um cartão SD de 4GB que possui duas partições, essas duas partições estão usando apenas cerca de 800 MB e, como tal, desejo reduzir o tamanho da imagem.
Alguém sabe como remover o "espaço livre" do arquivo img?
Respostas:
Primeiro, verifique se o espaço livre está realmente vazio e se não há sobras de arquivos excluídos. A maneira mais fácil de conseguir isso é criar um arquivo enorme no disco, contendo apenas bytes nulos, e excluí-lo.
# 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
Em seguida, comprima-o com uma ferramenta como gzip
ou xz
. Mesmo nos níveis mais baixos de compactação, uma longa série de zeros compactará bem:
# ls -s
4096M foo.img
# gzip foo.img
# ls -s
11M foo.img.gz
Observe que você deve descompactar a imagem ao gravá-la novamente em disco. Isso descompactará 'live':
# cat foo.img.gz | gunzip | dd of=/dev/sda
Observe que o dispositivo de saída (sda) deve ter tamanho suficiente para caber na imagem original ; caso contrário, os dados serão perdidos ou corrompidos.
Um método alternativo, se você quiser continuar usando a imagem - por exemplo, com uma máquina virtual - é converter a imagem bruta em um dos formatos de imagem usados pelo software de virtualização; por exemplo, qcow2 para Qemu, VDI para VirtualBox ou VMDK para VMware.
Observe que isso ainda exige que você prepare a imagem limpando o espaço livre usando o método acima.
# qemu-img convert -f raw -O qcow2 foo.img foo.qcow
# qemu-img convert -f raw -O vmdk foo.img foo.vmdk
Mas se ele for gravado em um disco real novamente, você precisará convertê-lo novamente em uma imagem não processada.
resize2fs
ou ntfsresize
(o Linux não possui ferramenta para FAT), antes de gravá-la no dispositivo menor, ou criando um novo sistema de arquivos e copiando apenas os arquivos.
Usar resize2fs
é muito, muito mais fácil
resize2fs -M xxx.img
você será solicitado a e2fsck primeiro - então:
e2fsck -f -y xxx.img
(a imagem NÃO deve ser montada!)
Nota: isso só funcionará se a imagem for de uma única partição, se for um dispositivo de bloco inteiro com várias partições, veja a resposta acima ...
losetup --find --partscan xxx.img
para configurar o arquivo de imagem como um dispositivo de loop. depois corra lsblk
para encontrar as partições do dispositivo de loop.
resize2fs
é apenas para extN
partições de tipo. Outros tipos de partições exigirão outras ferramentas.
Eu também tentei com o qemu-img e funcionou como um encanto:
qemu-img resize test.img 2G
Estamos redimensionando o test.img
para torná-lo 2G (2GB).
Funcionou perfeitamente para mim.
df -h
mostra o tamanho original. Como isso é possível?
Eu usei a abordagem gparted com o meu computador Ubuntu 16.10:
1) Mapeie o arquivo img para a próxima partição de loop disponível com losetup
, conforme descrito nas postagens anteriores, como acima
2) Verifique com lsblk
qual unidade de loop seu arquivo de imagem está mapeado, por exemplo/dev/loop0
3) Executar sudo gparted /dev/loop0
4) Reduza as partições do loop, conforme apropriado; certifique-se de desmontar essas partições.
5) Execute fdisk /dev/loop0
, depois insira p
, isso mostrará o tamanho do bloco e o número final do bloco das várias partições.
6) Execute dd if=/dev/loop0 of=shrunk_image_file.img
, aplicar a esse comando opções bs=[BlockSize]
e count=[EndBlockNumberOfLastLoopPartition+1]
e você terá uma encolhida e arquivo de imagem rightsized.