Diminuir a imagem total do disco: UEFI GPT Flashdrive - freespace at end

2

Eu tenho uma imagem de disco de um flash drive inicializável. É o GPT para a inicialização do EFI, portanto, há uma pequena partição do Vfat32 e três outras partições do Linux, seguidas por cerca de 3G de espaço livre.

Eu preciso de uma cópia de imagem de disco para flashdrives um pouco menores, então eu preciso diminuir de 15G para 14G mais ou menos. Eu vou estar usando o dd no linux para fazer as cópias.

O gparted é excelente para modificar e redimensionar as partições, mas não pode reduzir o espaço livre no final. Teoricamente, deve ser possível truncar o arquivo, mas quando eu tento explode a (tabela de disco? Um palpite) para que não haja partições e o arquivo seja arruinado. Tenho certeza de que as técnicas abaixo funcionariam se eu estivesse usando discos giratórios e / ou discos MBR, mas não testei.

Tentei:

dd bs=1M count=14000 iflag=fullblock if=/dev/sda  of=myfile.raw

não encolheu

rsync --sparse filename filename 

que não explodiu as tabelas de disco, mas reduziu a troca e manteve a área não alocada.

qemu-img convert -f raw -O qcow2 -S 4k filename filename (planejado para converter de volta para raw)

explodiu tabelas

truncate size=140000M <filename>

também explodiu tabelas

cp --sparse=always filename filename

não funcionou

    
por John Fisher 27.05.2016 / 20:26

1 resposta

2

Deve haver uma Tabela de Partição GUID principal (principal) no início e secundária (backup) no final do arquivo bruto criado por dd . Truncar o arquivo destrói o secundário. Existe uma maneira de corrigir isso.

Vamos começar com o arquivo não-truncado com espaço livre no final. Execute gdisk -l myfile.raw . Observe tamanho do setor lógico ( 512B provavelmente). Encontre o máximo end sector (aquele para a última partição, provavelmente, mas as entradas de partição podem não estar em ordem, por isso, olhe cuidadosamente para um máximo). Os setores são numerados a partir de 0 , portanto você precisa de ( tamanho do setor ) * ( setor final máximo + 1) bytes para armazenar todas as partições.

Além disso, você precisa de pelo menos 33 setores completos de espaço livre no final para armazenar o novo GPT secundário. Veja esta foto da Wikipedia .

Ao todo, você precisa ( tamanho do setor ) * ( setor final máximo + 34) bytes do seu arquivo. Trunca o arquivo para este ou tamanho maior:

truncate -s <new_size> myfile.raw

Próxima invocar

gdisk myfile.raw

Você receberá (entre outras coisas):

Warning! Disk size is smaller than the main header indicates!
Caution: invalid backup GPT header, but valid main header; regenerating backup header from main header.

Digite w , tecle Digite para escrever as tabelas de partições corretas. Você verá um aviso porque a GPT secundária está prestes a ser movida. Você tem espaço livre suficiente no final do arquivo, então não há nada para se preocupar. Confirme quando solicitado.

Saia com q , Enter . Execute gdisk novamente - não deve haver avisos. O GPT é corrigido .

Caso você precise usar gparted com sua imagem, eu tenho algumas dicas.

O comando sudo gparted myfile.raw espera que os arquivos myfile.raw1 , myfile.raw2 etc. existam e correspondam às partições dentro de myfile.raw . Se fosse um arquivo especial como /dev/sdb , então udev cuidaria de /dev/sdb1 , /dev/sdb2 ... Não é o caso do arquivo regular. Muitos recursos gparted falharão se não houver arquivos myfile.rawN .

Para criar esses arquivos, use kpartx (ou partx + losetup tandem):

sudo kpartx -av myfile.raw

Observe sua saída (que loopXpY devices foram criados) e crie links simbólicos para todas as partições. O primeiro pode ser:

ln -s /dev/mapper/loop0p1 myfile.raw1

Agora, gparted deve ser executado e operar nessas partições. Há uma armadilha: quando a partição é alterada (por exemplo, ela é movida / redimensionada), o mapeamento criado por kpartx não é atualizado. Normalmente, gparted chamaria partprobe ou algo para atualizar /dev/sd* ; isso não funciona no nosso caso. Você deve destruir os mapeamentos e recriá-los. Ao mover / redimensionar partições, execute uma tarefa gparted , feche o programa, corrija os mapeamentos, execute gparted com a segunda tarefa e assim por diante.

Para destruir os mapeamentos, invoque sudo kpartx -dv myfile.raw . Exclua links simbólicos órfãos no final.

    
por 27.05.2016 / 22:02