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:
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.
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.
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.
Todavía no he investigado devmapper, pero podría funcionar.
Respuestas:
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:
Esto esencialmente hace lo que estaba planeando hacer en la opción 1, pero mucho más limpiamente.
fuente
En Linux, los dispositivos de bucle son particionables si el
max_part
parámetro delloop
módulo del kernel está configurado. Si elloop
está integrado (no es un módulo), puede pasar unloop.max_part=31
parámetro de línea de comando del núcleo en su lugar.Entonces, después de configurar el
loop
controlador para obtener dispositivos de bloque particionables, solo debería ser cuestión de hacer: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 4096
por 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 (
-b
opció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).fuente