Rozpoznawanie tabeli partycji GPT utworzonej z innym rozmiarem sektora logicznego

9

Mam dysk 3 TB, który podzieliłem na partycje za pomocą 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

Jednak gdy podłączę go za pomocą adaptera USB, zgłasza logiczny rozmiar sektora 4096, a jądro nie rozpoznaje już tablicy partycji (ponieważ szuka GPT w sektorze 1, który ma teraz przesunięcie 4096 zamiast 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

Czy istnieje sposób, aby zmusić Linuksa do rozpoznania GPT z przesunięciem 512? Alternatywnie, czy istnieje sposób na utworzenie dwóch nagłówków GPT, jednego przy 512, a drugiego przy 4096, czy też będą się one nakładać?

EDYCJA: Znalazłem kilka obejść, z których żadne nie jest bardzo dobre:

  1. Mogę użyć urządzenia sprzężenia zwrotnego do podzielenia dysku na partycje:

    $ losetup /dev/loop0 /dev/sdg
    

    Urządzenia sprzężenia zwrotnego zawsze mają rozmiar sektora 512, więc pozwala mi to podzielić urządzenie na partycje w dowolny sposób. Jednak jądro nie rozpoznaje tablic partycji na urządzeniach sprzężenia zwrotnego, więc muszę utworzyć inne urządzenie sprzężenia zwrotnego i ręcznie określić rozmiar partycji i przesunięcie:

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

    Mogę napisać skrypt, aby to zautomatyzować, ale byłoby miło móc to zrobić automatycznie.

  2. Mogę uruchomić serwer nbd i klient nbd; Urządzenia NBD mają domyślnie sektory 512-bajtowe, a urządzenia NBD można podzielić na partycje. Jednak dokumentacja NBD ostrzega przed uruchomieniem serwera i klienta NBD w tym samym systemie; Podczas testowania klient nbd w jądrze zawiesił się i musiałem zabić serwer.

  3. Mogę uruchomić istgt (obiekt docelowy iSCSI w przestrzeni użytkownika), korzystając z tej samej konfiguracji. To przedstawia kolejne urządzenie SCSI w systemie z 512-bajtowymi sektorami. Jednak podczas testowania nie powiodło się i spowodowało dereferencję wskaźnika NULL jądra w kodzie ext4.

  4. Nie badałem jeszcze devmappera, ale to może zadziałać.

JK Stafford
źródło
1
Zobacz ten post na blogu: goughlui.com/2013/10/02/…
fpmurphy

Odpowiedzi:

3

Znalazłem rozwiązanie: program o nazwie kpartx, który jest programem przestrzeni użytkownika, który używa devmapper do tworzenia partycji z urządzeń pętli zwrotnej, co działa świetnie:

$ 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

To zasadniczo robi to, co planowałem zrobić w opcji 1, ale o wiele bardziej czysto.

JK Stafford
źródło
2

W systemie Linux urządzenia pętlowe można podzielić na partycje, jeśli max_partparametr loopmodułu jądra jest ustawiony. Jeśli loopjest wbudowany (nie moduł), możesz loop.max_part=31zamiast tego przekazać parametr wiersza poleceń jądra.

Więc po skonfigurowaniu loopsterownika w celu uzyskania blokowych urządzeń, które można podzielić na partycje, należy po prostu zrobić:

losetup --show -f /dev/sda

Aby uzyskać pewne /dev/loopXp1, /dev/loopXp2... urządzeń dla każdej partycji.

Kilka notatek, które ewoluowały na tym froncie w jądrze od czasu opublikowania pytania:

  • od 4.14 możliwe jest także określenie logicznego rozmiaru bloku innego niż 512 dla urządzeń pętlowych ( losetup -b 4096na przykład). Można również zmienić rozmiar bloku urządzenia pętli po jego utworzeniu.

  • od 4.11 logiczny rozmiar bloku urządzeń nbd jest ustawiony na rozmiar bloku przekazywany do klienta nbd ( -bopcja). Ponieważ domyślny rozmiar bloku to (i był) 1024, oznacza to, że urządzenia nbd otrzymują teraz domyślny rozmiar sektora logicznego 1024 zamiast 512 wcześniej (całkiem źle z punktu widzenia kompatybilności wstecznej).

Stéphane Chazelas
źródło