Como redimensionar o tamanho de imagens de cartão

redimensionar o tamanho de imagens

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.

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Diego Sueiro
Formado em Engenharia de Controle e Automação pela UNIFEI e CEO do Embarcados, atualmente trabalho na Inglaterra com Desenvolvimento de Sistemas Linux Embarcado Real Time. Sou consultor e desenvolvedor de software para Sistemas Embarcados com vasta experiência em projetos com processadores de 8bits a 32bits, sistemas bare metal, RTOS, Linux Embarcado e Android Embarcado. Um apaixonado por Pink Floyd e Empreendedorismo.

3
Deixe um comentário

avatar
 
3 Comment threads
0 Thread replies
1 Followers
 
Most reacted comment
Hottest comment thread
3 Comment authors
RobertoEdson YamasakiMatheus Quick Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Roberto
Visitante
Roberto

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?

Edson Yamasaki
Visitante
Edson

Excelente dica e funciona perfeitamente ! Parabéns.

Matheus Quick
Visitante
Matheus Quick

Boa dica.