Erkennen der GPT-Partitionstabelle, die mit unterschiedlicher logischer Sektorgröße erstellt wurde

9

Ich habe ein 3-TB-Laufwerk, das ich mithilfe von GPT partitioniert habe:

$ 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

Wenn ich es jedoch über einen USB-Adapter anschließe, wird eine logische Sektorgröße von 4096 gemeldet, und der Kernel erkennt die Partitionstabelle nicht mehr (da er nach dem GPT in Sektor 1 sucht, der jetzt den Offset 4096 anstelle von 512 hat):

$ 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

Gibt es eine Möglichkeit, Linux zu zwingen, die GPT bei Offset 512 zu erkennen? Gibt es alternativ eine Möglichkeit, zwei GPT-Header zu erstellen, einen bei 512 und einen bei 4096, oder überlappen sie sich?

EDIT: Ich habe einige Problemumgehungen gefunden, von denen keine sehr gut ist:

  1. Ich kann ein Loopback-Gerät verwenden, um die Festplatte zu partitionieren:

    $ losetup /dev/loop0 /dev/sdg
    

    Loopback-Geräte haben immer eine Sektorgröße von 512, sodass ich das Gerät so partitionieren kann, wie ich es möchte. Der Kernel erkennt jedoch keine Partitionstabellen auf Loopback-Geräten. Daher muss ich ein anderes Loopback-Gerät erstellen und die Partitionsgröße und den Offset manuell angeben:

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

    Ich kann ein Skript schreiben, um dies zu automatisieren, aber es wäre schön, wenn ich es automatisch tun könnte.

  2. Ich kann nbd-server und nbd-client ausführen. NBD-Geräte haben standardmäßig 512-Byte-Sektoren, und NBD-Geräte sind partitionierbar. In der NBD-Dokumentation wird jedoch davor gewarnt, den nbd-Server und -Client auf demselben System auszuführen. Beim Testen hing der nbd-Client im Kernel und ich musste den Server beenden.

  3. Ich kann istgt (User-Space-iSCSI-Ziel) mit demselben Setup ausführen. Dies stellt dem System ein weiteres SCSI-Gerät mit 512-Byte-Sektoren vor. Beim Testen schlug dies jedoch fehl und verursachte eine Kernel-NULL-Zeiger-Dereferenzierung im ext4-Code.

  4. Ich habe Devmapper noch nicht untersucht, aber es könnte funktionieren.

JK Stafford
quelle
1
Siehe diesen Blog-Beitrag: goughlui.com/2013/10/02/…
fpmurphy

Antworten:

3

Ich habe eine Lösung gefunden: Ein Programm namens kpartx, ein Userspace-Programm, das Devmapper verwendet, um Partitionen von Loopback-Geräten zu erstellen. Das funktioniert hervorragend:

$ 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

Dies macht im Wesentlichen das, was ich in Option 1 geplant hatte, aber viel sauberer.

JK Stafford
quelle
2

Unter Linux können Loop-Geräte partitioniert werden, wenn der max_partParameter des loopKernelmoduls festgelegt ist. Wenn das integriert loopist (kein Modul), können Sie loop.max_part=31stattdessen einen Kernel-Befehlszeilenparameter übergeben.

Nachdem Sie den loopTreiber so konfiguriert haben , dass partitionierbare Blockgeräte abgerufen werden, sollten Sie nur Folgendes tun:

losetup --show -f /dev/sda

Um einige zu erhalten /dev/loopXp1, /dev/loopXp2... Geräte für jede Partition.

Ein paar Anmerkungen, wie sich die Dinge an dieser Front im Kernel entwickelt haben, seit Sie Ihre Frage gestellt haben:

  • seit 4.14 ist es auch möglich, eine andere logische Blockgröße als 512 für Schleifengeräte ( losetup -b 4096zum Beispiel) anzugeben . Es ist auch möglich, die Blockgröße eines Schleifengeräts zu ändern, nachdem es erstellt wurde.

  • seit 4.11 wird die logische blockgröße von nbd geräten auf die blockgröße gesetzt, die an nbd-client übergeben wird ( -boption). Da die Standardblockgröße 1024 ist (und war), bedeutet dies, dass nbd-Geräte jetzt eine Standardgröße für den logischen Sektor von 1024 anstelle von 512 erhalten (aus Sicht der Abwärtskompatibilität ziemlich schlecht).

Stéphane Chazelas
quelle