Riconoscimento della tabella delle partizioni GPT creata con dimensioni del settore logiche diverse


9

Ho un disco da 3 TB che ho partizionato 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

Tuttavia, quando lo collego tramite un adattatore USB, riporta una dimensione del settore logico di 4096 e il kernel non riconosce più la tabella delle partizioni (poiché sta cercando il GPT nel settore 1, che ora è all'offset 4096 anziché 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

C'è un modo per forzare Linux a riconoscere il GPT all'offset 512? In alternativa, c'è un modo per creare due intestazioni GPT, una a 512 e una a 4096, o si sovrapporranno?

EDIT: ho trovato alcune soluzioni alternative, nessuna delle quali è molto buona:

  1. Posso usare un dispositivo di loopback per partizionare il disco:

    $ losetup /dev/loop0 /dev/sdg
    

    I dispositivi di loopback hanno sempre una dimensione del settore di 512, quindi questo mi consente di partizionare il dispositivo come voglio. Tuttavia, il kernel non riconosce le tabelle di partizione sui dispositivi di loopback, quindi devo creare un altro dispositivo di loopback e specificare manualmente le dimensioni della partizione e l'offset:

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

    Posso scrivere uno script per automatizzare questo, ma sarebbe bello poterlo fare automaticamente.

  2. Posso eseguire nbd-server e nbd-client; I dispositivi NBD hanno settori a 512 byte per impostazione predefinita e i dispositivi NBD sono partizionabili. Tuttavia, la documentazione NBD mette in guardia contro l'esecuzione del server e del client nbd sullo stesso sistema; Durante i test, il client nbd nel kernel si è bloccato e ho dovuto uccidere il server.

  3. Posso eseguire istgt (destinazione iSCSI spazio utente), usando la stessa configurazione. Ciò presenta un altro dispositivo SCSI al sistema con settori a 512 byte. Tuttavia, durante il test, questo ha avuto esito negativo e ha causato una dereferenza del puntatore NULL del kernel nel codice ext4.

  4. Non ho ancora studiato Devmapper, ma potrebbe funzionare.


1
Vedi questo post sul blog: goughlui.com/2013/10/02/…
fpmurphy

Risposte:


3

Ho trovato una soluzione: un programma chiamato kpartx, che è un programma userspace che utilizza devmapper per creare partizioni da dispositivi di loopback, che funziona alla grande:

$ 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

Questo essenzialmente fa quello che stavo pianificando di fare nell'opzione 1, ma molto più chiaramente.


2

Su Linux, i dispositivi loop sono partizionabili se è impostato il max_partparametro del loopmodulo kernel. Se loopè incorporato (non un modulo), puoi invece passare un loop.max_part=31parametro della riga di comando del kernel.

Quindi, dopo aver configurato il loopdriver per ottenere i dispositivi a blocchi partizionabili, dovrebbe essere solo una questione di fare:

losetup --show -f /dev/sda

Per ottenere alcuni /dev/loopXp1, /dev/loopXp2... dispositivi per ogni partizione.

Alcune note mentre le cose si sono evolute su quel fronte nel kernel da quando hai pubblicato la tua domanda:

  • dalla 4.14, è anche possibile specificare una dimensione del blocco logico diversa da 512 per i dispositivi loop ( losetup -b 4096ad esempio). È anche possibile modificare la dimensione del blocco di un dispositivo loop dopo che è stato creato.

  • dalla 4.11, la dimensione del blocco logico dei dispositivi nbd è impostata sulla dimensione del blocco passata a nbd-client ( -bopzione). Poiché la dimensione del blocco predefinita è (ed era) 1024, ciò significa che i dispositivi nbd ora ottengono una dimensione del settore logico predefinita di 1024 anziché 512 prima (piuttosto male dal punto di vista della compatibilità con le versioni precedenti).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.