Quem nunca passou pelo problema de baixar uma imagem de cartão sd da internet mas a dita cuja tem o tamanho maior do que um cartão que você tem disponível?
Aqui vai um passo-a-passo (em 4 etapas) de como redimensionar essa imagem.
Primeiro certifique-se que o novo tamanho da partição irá comportar todos os arquivos presentes, ou seja, tome cuidado para não reduzir muito o tamanho e acabar perdendo dados.
Não se esqueça de fazer uma cópia do seu arquivo de imagem original.
Vamos fazer um exemplo onde queremos transformar uma imagem de 8G em uma de 4G.
1º Passo: Montar a imagem
Primeiramente vamos conhecer o layout das partições da nossa imagem:
$ sudo losetup -f --show some_image.img /dev/loop0
$ sudo parted /dev/loop0 unit mb print Model: Loopback device (loop) Disk /dev/loop0: 8069MB Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 0.00MB 4.19MB 4.19MB primary 2 4.19MB 58.7MB 54.5MB primary fat32 boot, lba 3 58.7MB 8069MB 8010MB primary ext4
Aqui vemos que a imagem é de 8G (8069MB) e possui três partições.
Iremos diminuir a partição 3 (ext4) para que a imagem caiba em um cartão de 4G.
Para isso vamos modificar o tamanho da partição 3, redimensionar o sistemas de arquivo dela e depois encolher o arquivo de imagem.
2º Passo: Redimensionar a partição
Vamos utilizar a ferramenta parted:
$ sudo parted /dev/loop0 GNU Parted 2.3 Using /dev/loop0 Welcome to GNU Parted! Type 'help' to view a list of commands. (parted)
Digitando “print” temos as seguintes informações:
(parted) print Model: Loopback device (loop) Disk /dev/loop0: 8069MB Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 512B 4194kB 4194kB primary 2 4194kB 58.7MB 54.5MB primary fat32 boot, lba 3 58.7MB 8069MB 8010MB primary ext4 (parted)
Para redimensionar a partição 3 primeiro teremos que removê-la:
(parted) rm 3
E agora vamos recriá-la passando o seu início (58.7MB) e fim (3965MB que nos dá o total de 4G)
(parted) mkpart primary 58.7 3965
Conferindo:
(parted) print Model: Loopback device (loop) Disk /dev/loop0: 8069MB Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 512B 4194kB 4194kB primary 2 4194kB 58.7MB 54.5MB primary fat32 boot, lba 3 58.7MB 3965MB 3906MB primary ext4 (parted)
Para continuar precisaremos da informação da quantidade de setores da partição 3 e em qual setor ela inicia:
(parted) unit s (parted) print Model: Loopback device (loop) Disk /dev/loop0: 15759360s Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 1s 8191s 8191s primary 2 8192s 114687s 106496s primary fat32 boot, lba 3 114688s 7743487s 7628800s primary ext4 (parted)
Sabemos que a partição 3 possui 7628800 setores (de 512 bytes) e que seu início é no setor 114688.
Vamos sair do parted:
(parted) quit
3º Passo: Redimensionar o sistema de arquivos
Para isso temos que montar a partição 3 e precisamos saber o offset em bytes do seu início:
$ echo '114688 * 512' | bc 58720256
$ sudo losetup -f --show -o 58720256 some_image.img /dev/loop1
Antes de redimensionar vamos verificar e corrigir possíveis erros que estejam presentes na partição com a ferramenta e2fsck:
$ sudo e2fsck -f /dev/loop1 e2fsck 1.42.5 (29-Jul-2012) rootfs: recovering journal Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information rootfs: 146271/489600 files (0.1% non-contiguous), 619173/1955584 blocks
Agora vamos calcular o novo tamanho da partição dividindo a quantidade de setores (7628800) por 8 (blocos de 4KB dividido por 512 bytes/setor), assumindo que estamos usando blocos de 4KB no sistema de arquivos.
$ echo '7628800 / 8' | bc 953600
E usaremos a ferramenta resize2fs para redimensionar a partição 3:
$ sudo resize2fs /dev/loop1 953600 resize2fs 1.42.5 (29-Jul-2012) Resizing the filesystem on /dev/loop1 to 953600 (4k) blocks. The filesystem on /dev/loop1 is now 953600 blocks long.
Podemos remover os loopback devices agora:
$ sudo losetup -d /dev/loop0 /dev/loop1
4º Passo: Redimensionar o arquivo de imagem
Sabemos que nossa partição 3 termina no marco de 3965MB que é o tamanho total da imagem que queremos (4G). Para encolher o arquivo de imagem usamos o comando truncate:
$ truncate -s 3965MB some_image.img
Verificando o resultado do trabalho:
$ sudo parted some_image.img unit mb print Model: (file) Disk /home/dsueiro/tmp/some_image.img: 3965MB Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 0.00MB 4.19MB 4.19MB primary 2 4.19MB 58.7MB 54.5MB primary fat32 boot, lba 3 58.7MB 3965MB 3906MB primary ext4
Agora você já pode usar o dd para gravar a nova imagem no teu cartão sd.
Se caso seja desejado encolher para uma imagem de 2G devemos usar o marco final de 1967MB e repetir os procedimentos e cálculos feitos acima.
NOTA: se o comando resize2fs imprimir a mensagem:
resize2fs: New size smaller than minimum
Significa que você está tentando criar um sistema de arquivos menor do que o tamanho mínimo permitido.









Ótimo tutorial, 12 anos depois ainda funciona perfeitamente.
Olá, será que alguém pode me ajudar
tenho um cartão de 256 GB de celular que estava com 85 GB, funcionava muito bem e rápido aí deu um problema e apagou tudo
usei o recuvera e voltou zerado, mas agora não consigo carregar com mais de 17 GB
O que posso fazer para restaurá-lo?
Excelente dica e funciona perfeitamente ! Parabéns.
Boa dica.