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:
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.
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.
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.
Ich habe Devmapper noch nicht untersucht, aber es könnte funktionieren.