Reconnaître la table de partition GPT créée avec une taille de secteur logique différente


9

J'ai un lecteur de 3 To que j'ai partitionné en utilisant 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

Cependant, lorsque je le connecte via un adaptateur USB, il signale une taille de secteur logique de 4096 et le noyau ne reconnaît plus la table de partition (car il recherche le GPT au secteur 1, qui est maintenant à l'offset 4096 au lieu 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-t-il un moyen de forcer Linux à reconnaître le GPT au décalage 512? Sinon, existe-t-il un moyen de créer deux en-têtes GPT, un à 512 et un à 4096, ou vont-ils se chevaucher?

EDIT: J'ai trouvé quelques solutions de contournement, dont aucune n'est très bonne:

  1. Je peux utiliser un périphérique de bouclage pour partitionner le disque:

    $ losetup /dev/loop0 /dev/sdg
    

    Les appareils en boucle ont toujours une taille de secteur de 512, ce qui me permet de partitionner l'appareil comme je le souhaite. Cependant, le noyau ne reconnaît pas les tables de partition sur les périphériques de bouclage, je dois donc créer un autre périphérique de bouclage et spécifier manuellement la taille et le décalage de la partition:

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

    Je peux écrire un script pour automatiser cela, mais ce serait bien de pouvoir le faire automatiquement.

  2. Je peux exécuter nbd-server et nbd-client; Les périphériques NBD ont des secteurs de 512 octets par défaut et les périphériques NBD sont partitionnables. Cependant, la documentation NBD met en garde contre l'exécution du serveur et du client nbd sur le même système; Lors des tests, le client nbd dans le noyau s'est bloqué et j'ai dû tuer le serveur.

  3. Je peux exécuter istgt (cible iSCSI de l'espace utilisateur), en utilisant la même configuration. Cela présente un autre périphérique SCSI au système avec des secteurs de 512 octets. Cependant, lors du test, cela a échoué et a provoqué une déréférence du pointeur NULL du noyau dans le code ext4.

  4. Je n'ai pas encore enquêté sur devmapper, mais cela pourrait fonctionner.


1
Voir cet article de blog: goughlui.com/2013/10/02/…
fpmurphy

Réponses:


3

J'ai trouvé une solution: un programme appelé kpartx, qui est un programme en espace utilisateur qui utilise devmapper pour créer des partitions à partir de périphériques de bouclage, ce qui fonctionne très 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

Cela fait essentiellement ce que je prévoyais de faire dans l'option 1, mais beaucoup plus proprement.


2

Sous Linux, les périphériques de boucle sont partitionnables si le max_partparamètre du loopmodule noyau est défini. Si le loopest intégré (pas un module), vous pouvez passer un loop.max_part=31paramètre de ligne de commande du noyau à la place.

Donc, après avoir configuré le looppilote pour obtenir des périphériques de bloc partitionnables, cela devrait juste être une question de faire:

losetup --show -f /dev/sda

Pour en obtenir /dev/loopXp1, /dev/loopXp2... des périphériques pour chaque partition.

Quelques notes car les choses ont évolué sur ce front dans le noyau depuis que vous avez posté votre question:

  • depuis 4.14, il est également possible de spécifier une taille de bloc logique autre que 512 pour les périphériques de boucle ( losetup -b 4096par exemple). Il est également possible de modifier la taille de bloc d'un périphérique de boucle après sa création.

  • depuis 4.11, la taille de bloc logique des périphériques nbd est définie sur la taille de bloc transmise à nbd-client ( -boption). Étant donné que la taille de bloc par défaut est (et était) 1024, cela signifie que les périphériques nbd obtiennent désormais une taille de secteur logique par défaut de 1024 au lieu de 512 auparavant (assez mauvaise du point de vue de la compatibilité descendante).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.