Reconhecer tabela de partições GPT criada com tamanho de setor lógico diferente

7

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 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ções (pois está procurando pelo GPT no setor 1, que agora está no offset 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 o GPT no offset 512? Alternativamente, existe uma maneira de criar dois cabeçalhos GPT, um em 512 e outro em 4096, ou eles se sobrepõem?

EDIT: Eu encontrei algumas soluções alternativas, nenhuma das quais são muito boas:

  1. Eu posso usar um dispositivo de loopback para particionar o disco:

    $ losetup /dev/loop0 /dev/sdg
    

    Dispositivos de auto-retorno sempre têm um tamanho de setor de 512, então isso permite particionar o dispositivo como eu quero. No entanto, o kernel não reconhece tabelas de partição em dispositivos de loopback, portanto, preciso 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))
    

    Eu posso escrever um script para automatizar isso, mas seria bom poder fazer isso automaticamente.

  2. Eu posso rodar nbd-server e nbd-client; Os dispositivos NBD possuem setores de 512 bytes por padrão e os dispositivos NBD são particionáveis. No entanto, a documentação do NBD avisa sobre a execução do servidor e do cliente nbd no mesmo sistema; Ao testar, o cliente nbd do kernel desligou e eu tive que matar o servidor.

  3. Eu posso rodar o istgt (alvo iSCSI do espaço do usuário), usando a mesma configuração. Isso apresenta outro dispositivo SCSI ao sistema com setores de 512 bytes. No entanto, ao testar, isso falhou e causou uma desreferência do ponteiro NULL do kernel no código ext4.

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

por Jared Stafford 02.03.2015 / 17:13

2 respostas

2

Eu encontrei uma solução: um programa chamado kpartx, que é um programa de 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 planejava fazer na opção 1, mas muito mais claramente.

    
por 03.03.2015 / 01:39
2

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

Então, depois de configurar o driver loop para obter dispositivos de blocos particionáveis, deve ser apenas uma questão:

losetup --show -f /dev/sda

Para obter alguns dispositivos /dev/loopXp1 , /dev/loopXp2 ... para cada partição.

Algumas notas, já que as coisas evoluíram nessa frente no kernel desde que você postou sua pergunta:

  • desde 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 foi criado.

  • desde o 4.11, o tamanho do bloco lógico dos dispositivos nbd é definido como o tamanho do bloco passado ao nbd-client ( -b option). Como o tamanho de bloco padrão é (e era) 1024, isso significa que os dispositivos nbd agora obtêm um tamanho de setor lógico padrão de 1024 em vez de 512 antes (muito ruim do ponto de vista de compatibilidade com versões anteriores).

por 01.06.2018 / 12:35