Reconhecendo a tabela de partição GPT criada com diferentes tamanhos de setor lógico

9

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:

  1. 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.

  2. 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.

  3. 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.

  4. Ainda não investiguei o devmapper, mas pode funcionar.

JK Stafford
fonte
1
Veja esta publicação no blog: goughlui.com/2013/10/02/…
fpmurphy

Respostas:

3

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:

$ loop_device=`losetup --show -f /dev/sdg`
$ kpartx -a $loop_device
$ ls /dev/mapper
total 0
crw------- 1 root root  10, 236 Mar  2 17:59 control
brw-rw---- 1 root disk 252,   0 Mar  2 18:30 loop0p1
brw-rw---- 1 root disk 252,   1 Mar  2 18:30 loop0p2
$
$ # delete device
$ kpartx -d $loop_device
$ losetup -d $loop_device

Isso essencialmente faz o que eu estava planejando fazer na opção 1, mas muito mais limpa.

JK Stafford
fonte
2

No Linux, os dispositivos de loop são particionáveis ​​se o max_partparâmetro do loopmódulo do kernel estiver definido. Se o loopestiver incorporado (não um módulo), você pode passar um loop.max_part=31parâmetro de linha de comando do kernel.

Portanto, depois de configurar o loopdriver para obter dispositivos de bloco particionáveis, basta executar o seguinte:

losetup --show -f /dev/sda

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 4096por 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 ( -bopçã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).

Stéphane Chazelas
fonte