Розпізнавання таблиці розділів 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, або вони будуть перетинатися?

EDIT: Я знайшов кілька обхідних завдань, жоден з яких не дуже хороший:

  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 раніше (досить погано з точки зору сумісності з відсталою точністю).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.