Reconocer la tabla de particiones GPT creada con diferentes tamaños de sector lógico

9

Tengo una unidad de 3 TB que he particionado usando 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

Sin embargo, cuando lo conecto a través de un adaptador USB, informa un tamaño de sector lógico de 4096 y el núcleo ya no reconoce la tabla de particiones (ya que está buscando el GPT en el sector 1, que ahora está en el desplazamiento 4096 en lugar 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

¿Hay alguna forma de obligar a Linux a reconocer el GPT en el desplazamiento 512? Alternativamente, ¿hay alguna manera de crear dos encabezados GPT, uno en 512 y otro en 4096, o se superpondrán?

EDITAR: He encontrado algunas soluciones, ninguna de las cuales es muy buena:

  1. Puedo usar un dispositivo loopback para particionar el disco:

    $ losetup /dev/loop0 /dev/sdg
    

    Los dispositivos de bucle invertido siempre tienen un tamaño de sector de 512, por lo que esto me permite particionar el dispositivo como quiero. Sin embargo, el kernel no reconoce las tablas de partición en los dispositivos de bucle invertido, por lo que tengo que crear otro dispositivo de bucle invertido y especificar manualmente el tamaño y el desplazamiento de la partición:

    $ losetup /dev/loop1 /dev/sdg -o $((10240*512)) --sizelimit $(((5860532216-10240)*512))
    

    Puedo escribir un script para automatizar esto, pero sería bueno poder hacerlo automáticamente.

  2. Puedo ejecutar nbd-server y nbd-client; Los dispositivos NBD tienen sectores de 512 bytes por defecto, y los dispositivos NBD son particionables. Sin embargo, la documentación de NBD advierte contra la ejecución del servidor y el cliente nbd en el mismo sistema; Al realizar la prueba, el cliente nbd en el núcleo se bloqueó y tuve que matar el servidor.

  3. Puedo ejecutar istgt (objetivo iSCSI de espacio de usuario), usando la misma configuración. Esto presenta otro dispositivo SCSI al sistema con sectores de 512 bytes. Sin embargo, durante las pruebas, esto falló y causó una desreferencia del puntero NULL del núcleo en el código ext4.

  4. Todavía no he investigado devmapper, pero podría funcionar.

JK Stafford
fuente
1
Vea esta publicación de blog: goughlui.com/2013/10/02/…
fpmurphy

Respuestas:

3

Encontré una solución: un programa llamado kpartx, que es un programa de espacio de usuario que usa devmapper para crear particiones desde dispositivos de bucle invertido, que funciona muy bien:

$ 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

Esto esencialmente hace lo que estaba planeando hacer en la opción 1, pero mucho más limpiamente.

JK Stafford
fuente
2

En Linux, los dispositivos de bucle son particionables si el max_partparámetro del loopmódulo del kernel está configurado. Si el loopestá integrado (no es un módulo), puede pasar un loop.max_part=31parámetro de línea de comando del núcleo en su lugar.

Entonces, después de configurar el loopcontrolador para obtener dispositivos de bloque particionables, solo debería ser cuestión de hacer:

losetup --show -f /dev/sda

Para obtener algunos /dev/loopXp1, /dev/loopXp2... dispositivos para cada partición.

Algunas notas a medida que las cosas han evolucionado en ese frente en el núcleo desde que publicó su pregunta:

  • desde 4.14, también es posible especificar un tamaño de bloque lógico distinto de 512 para dispositivos de bucle ( losetup -b 4096por ejemplo). También es posible cambiar el tamaño de bloque de un dispositivo de bucle después de que se haya creado.

  • desde 4.11, el tamaño de bloque lógico de los dispositivos nbd se establece en el tamaño de bloque pasado a nbd-client ( -bopción). Dado que el tamaño de bloque predeterminado es (y era) 1024, eso significa que los dispositivos nbd ahora obtienen un tamaño de sector lógico predeterminado de 1024 en lugar de 512 antes (bastante malo desde un punto de vista de compatibilidad con versiones anteriores).

Stéphane Chazelas
fuente