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.
Respostas:
Encontrei uma solução: Um programa chamado kpartx, que é um programa no espaço do usuário que usa o devmapper para criar partições a partir de dispositivos de loopback, o que funciona muito bem:
Isso essencialmente faz o que eu estava planejando fazer na opção 1, mas muito mais limpa.
fonte
No Linux, os dispositivos de loop são particionáveis se o
max_part
parâmetro doloop
módulo do kernel estiver definido. Se oloop
estiver incorporado (não um módulo), você pode passar umloop.max_part=31
parâmetro de linha de comando do kernel.Portanto, depois de configurar o
loop
driver para obter dispositivos de bloco particionáveis, basta executar o seguinte:Para obter alguns
/dev/loopXp1
,/dev/loopXp2
... dispositivos para cada partição.Algumas notas à medida que as coisas evoluíram nessa frente no kernel desde que você postou sua pergunta:
desde a versão 4.14, também é possível especificar um tamanho de bloco lógico diferente de 512 para dispositivos de loop (
losetup -b 4096
por exemplo). Também é possível alterar o tamanho do bloco de um dispositivo de loop depois que ele é criado.desde a versão 4.11, o tamanho do bloco lógico dos dispositivos nbd é definido como o tamanho do bloco passado ao nbd-client (
-b
opção). Como o tamanho do bloco padrão é (e era) 1024, isso significa que os dispositivos nbd agora têm um tamanho de setor lógico padrão de 1024 em vez de 512 antes (muito ruim do ponto de vista da compatibilidade com versões anteriores).fonte