Распознавание таблицы разделов GPT, созданной с другим размером логического сектора

9

У меня есть диск 3TB, который я разделил, используя 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

Однако, когда я подключаю его через USB-адаптер, он сообщает, что размер логического сектора равен 4096, и ядро ​​больше не распознает таблицу разделов (так как он ищет GPT в секторе 1, который теперь имеет смещение 4096 вместо 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

Есть ли способ заставить Linux распознавать GPT по смещению 512? В качестве альтернативы, есть ли способ создать два заголовка GPT, один на 512 и один на 4096, или они будут перекрываться?

РЕДАКТИРОВАТЬ: я нашел несколько обходных путей, ни один из которых не очень хорош:

  1. Я могу использовать петлевое устройство для разбиения диска:

    $ losetup /dev/loop0 /dev/sdg
    

    Устройства с обратной связью всегда имеют размер сектора 512, так что это позволяет мне разделить устройство так, как я хочу. Однако ядро ​​не распознает таблицы разделов на устройствах с обратной связью, поэтому мне нужно создать другое устройство с обратной связью и вручную указать размер и смещение раздела:

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

    Я могу написать скрипт для автоматизации этого, но было бы неплохо сделать это автоматически.

  2. Я могу запустить nbd-сервер и nbd-клиент; Устройства NBD имеют 512-байтовые секторы по умолчанию, а устройства NBD являются разделяемыми. Однако документация NBD предостерегает от запуска сервера и клиента nbd в одной системе; При тестировании клиент nbd в ядре зависал, и мне пришлось убить сервер.

  3. Я могу запустить istgt (цель iSCSI пользовательского пространства), используя ту же настройку. Это представляет другое устройство SCSI к системе с 512-байтовыми секторами. Однако при тестировании это не удалось и вызвало разыменование NULL-указателя ядра в коде ext4.

  4. Я еще не исследовал devmapper, но это может сработать.

Дж. К. Стаффорд
источник
1
Смотрите этот блог: goughlui.com/2013/10/02/...
fpmurphy

Ответы:

3

Я нашел решение: Программа под названием kpartx, которая является программой пользовательского пространства, которая использует devmapper для создания разделов из устройств обратной связи, которая прекрасно работает:

$ 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

По сути, это делает то, что я планировал сделать в варианте 1, но гораздо более аккуратно.

Дж. К. Стаффорд
источник
2

В Linux устройства цикла могут быть разделены, если задан max_partпараметр loopмодуля ядра. Если loopвстроенный (не модуль), вы можете loop.max_part=31вместо этого передать параметр командной строки ядра.

Таким образом, после того, как вы настроили loopдрайвер для получения разделяемых блочных устройств, нужно просто сделать следующее:

losetup --show -f /dev/sda

Для того, чтобы получить некоторые /dev/loopXp1, /dev/loopXp2... устройства для каждого раздела.

Несколько замечаний о том, как развивались события в ядре с тех пор, как вы опубликовали свой вопрос:

  • начиная с 4.14, также возможно указать размер логического блока, отличный от 512, для петлевых устройств ( losetup -b 4096например). Также возможно изменить размер блока устройства цикла после того, как оно было создано.

  • начиная с 4.11, размер логического блока устройств nbd устанавливается равным размеру блока, передаваемого клиенту nbd ( -bопция). Так как размер блока по умолчанию равен (и был) 1024, это означает, что устройства nbd теперь получают размер логического сектора по умолчанию 1024 вместо 512 раньше (довольно плохо с точки зрения обратной совместимости).

Стефан Шазелас
источник