Eu tenho uma imagem de disco que preciso encurtar um pouco (longa história - mas ela lida com variações nos tamanhos das unidades flash). As partições já são curtas o suficiente, mas o tamanho da unidade não.
Basicamente, tenho uma imagem de disco com 15678308352 bytes (30621696 setores). Quero reduzir o tamanho da imagem do disco para 15678292992 bytes (30621666 setores). O último setor usado por qualquer partição "real" é 30621662 (estou bem terminando aí também, mas preenchi-o em 4 setores só por segurança). De qualquer forma, estou querendo redimensionar as tabelas de partição, mas não sei bem como, principalmente porque a tabela GPT está dentro de um "MBR protegido".
Aqui está a saída do fdisk mostrando o MBR protegido:
fdisk mydisk.img
Disk: mydisk.img geometry: 1906/255/63 [30621696 sectors]
Signature: 0xAA55
Starting Ending
#: id cyl hd sec - cyl hd sec [ start - size]
------------------------------------------------------------------------
1: EE 0 0 2 - 1023 255 63 [ 1 - 30621695] <Unknown ID>
2: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
3: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
4: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
Aqui está a saída do gdisk mostrando as informações da GPT:
GPT fdisk (gdisk) version 1.0.10
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): p
Disk mydisk.img: 30621696 sectors, 14.6 GiB
Sector size (logical): 512 bytes
Disk identifier (GUID): BD99B4B8-8070-0648-AEA4-B28BCD949EB7
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 30621662
Partitions will be aligned on 2048-sector boundaries
Total free space is 18398 sectors (9.0 MiB)
Number Start (sector) End (sector) Size Code Name
1 8192 249855 118.0 MiB 8300 primary
2 260096 30621662 14.5 GiB 8300 primary
Como você pode ver, tenho bastante espaço para reduzir o disco, mas não sei como.
Tentei editar manualmente o tamanho da partição MBR no hexedit, mas recebi todos os tipos de avisos na partição GPT.
Alguma ideia?
Pode haver outras ferramentas que fazem isso, mas fui em frente e escrevi minha própria ferramenta para fazer isso. Eu fiz uma imagem Docker que faz isso.
Dada uma imagem multiparticionada (
YOURIMAGE.img
) em seu diretório atual que você deseja reduzir, execute o seguinte comando:Se você baixar a imagem, o arquivo que fará o trabalho será
/usr/bin/diskshrinker.sh
. Porém, se alguém estiver interessado, os passos básicos são:losetup -Pf
para criar um dispositivo de loopback a partir do arquivo (necessário para usar ferramentas e2fs em uma partição da imagem)resize2fs -M
para minimizar o tamanho da partiçãotune2fs
para encontrar o número de blocos e o tamanho do blocosgdisk
para encontrar informações atuais da partição, INCLUINDO o código da partição e GUID (necessário para alguns gerenciadores de inicialização)truncate
o novo tamanho.sgdisk -C
para corrigir o MBR esgdisk -e
configurar a partição GPT de backup.