Eu tenho uma unidade de 3 TB que particionei usando o GPT:
$ sudo sgdisk -p /dev/sdg
Disk /dev/sdg: 5860533168 sectors, 2.7 TiB
Logical sector size: 512 bytes
Disk identifier (GUID): 2BC92531-AFE3-407F-AC81-ACB0CDF41295
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 5860533134
Partitions will be aligned on 2048-sector boundaries
Total free space is 2932 sectors (1.4 MiB)
Number Start (sector) End (sector) Size Code Name
1 2048 10239 4.0 MiB 8300
2 10240 5860532216 2.7 TiB 8300
No entanto, quando eu o conecto através de um adaptador USB, ele relata um tamanho de setor lógico de 4096 e o kernel não reconhece mais a tabela de partição (já que está procurando a GPT no setor 1, que agora está no deslocamento 4096 em vez de 512):
$ sudo sgdisk -p /dev/sdg
Creating new GPT entries.
Disk /dev/sdg: 732566646 sectors, 2.7 TiB
Logical sector size: 4096 bytes
Disk identifier (GUID): 2DE535B3-96B0-4BE0-879C-F0E353341DF7
Partition table holds up to 128 entries
First usable sector is 6, last usable sector is 732566640
Partitions will be aligned on 256-sector boundaries
Total free space is 732566635 sectors (2.7 TiB)
Number Start (sector) End (sector) Size Code Name
Existe alguma maneira de forçar o Linux a reconhecer a GPT no deslocamento 512? Como alternativa, existe uma maneira de criar dois cabeçalhos GPT, um em 512 e outro em 4096, ou eles se sobrepõem?
EDIT: Encontrei algumas soluções alternativas, nenhuma das quais é muito boa:
Eu posso usar um dispositivo de loopback para particionar o disco:
$ losetup /dev/loop0 /dev/sdg
Os dispositivos de loopback sempre têm um tamanho de setor de 512, portanto, isso me permite particionar o dispositivo da maneira que desejar. No entanto, o kernel não reconhece tabelas de partição em dispositivos de loopback, então eu tenho que criar outro dispositivo de loopback e especificar manualmente o tamanho e o deslocamento da partição:
$ losetup /dev/loop1 /dev/sdg -o $((10240*512)) --sizelimit $(((5860532216-10240)*512))
Posso escrever um script para automatizar isso, mas seria bom poder fazê-lo automaticamente.
Eu posso rodar nbd-server e nbd-client; Os dispositivos NBD têm setores de 512 bytes por padrão, e os dispositivos NBD são particionáveis. No entanto, a documentação do NBD alerta contra a execução do servidor e cliente nbd no mesmo sistema; Ao testar, o cliente nbd no kernel travou e eu tive que matar o servidor.
Eu posso executar o istgt (destino iSCSI no espaço do usuário), usando a mesma configuração. Isso apresenta outro dispositivo SCSI para o sistema com setores de 512 bytes. No entanto, durante o teste, isso falhou e causou uma desreferência de ponteiro NULL do kernel no código ext4.
Ainda não investiguei o devmapper, mas pode funcionar.