В начале должна быть первичная (основная) таблица разделов GUID и вторичная (резервная) в конце необработанного файла, созданного dd
. Усечение файла уничтожает вторичный. Есть способ это исправить.
Давайте начнем с вашего необрезанного файла со свободным местом в конце. Запустите gdisk -l myfile.raw
. Обратите внимание на размер логического сектора (вероятно, 512B
). Найдите максимальный конечный сектор (возможно, один для последнего раздела, но записи разделов могут быть не в порядке, поэтому внимательно ищите максимальный). Секторы нумеруются от 0
, поэтому вам необходимо (размер сектора) * (максимальный конечный сектор + 1) байт для хранения всех разделов.
Кроме того, для хранения нового вторичного GPT вам потребуется как минимум 33 полных сектора свободного пространства. Смотрите эту картинку из Википедии.
Всего вам нужно (размер сектора) * (максимальный конечный сектор + 34) байтов вашего файла. Обрежьте файл до этого или большего размера:
truncate -s <new_size> myfile.raw
Следующий вызов
gdisk myfile.raw
Вы получите (среди прочего):
Предупреждение! Размер диска меньше основного заголовка!
Внимание: неверный резервный заголовок GPT, но действительный основной заголовок; восстановление резервной копии заголовка из основного заголовка.
Введите w
, нажмите Enter, чтобы написать правильные таблицы разделов. Вы увидите предупреждение, потому что вторичный GPT собирается быть перемещенным. У вас достаточно свободного места в конце файла, так что вам не о чем беспокоиться. Подтвердите когда спрошено
Выйдите с помощью q
, Enter. Запустите gdisk
снова - предупреждений не должно быть. GPT исправлен.
В случае, если вам нужно использовать gparted
с вашим изображением, у меня есть несколько советов.
Команда sudo gparted myfile.raw
предполагает, что файлы myfile.raw1
, myfile.raw2
и т.д. Существуют и соответствуют разделам внутри myfile.raw
. Если бы это был специальный файл, такой как /dev/sdb
тогда udev
позаботился бы о /dev/sdb1
, /dev/sdb2
... Это не относится к обычному файлу. Многие функции gparted
не будут работать, если нет файлов myfile.rawN
.
Для создания таких файлов используйте kpartx
(или partx
+losetup
):
sudo kpartx -av myfile.raw
Посмотрите его вывод (какие устройства loopXpY
были созданы) и создайте символические ссылки на все разделы. Первый может быть:
ln -s /dev/mapper/loop0p1 myfile.raw1
Теперь gparted
должен работать и работать с этими разделами. Однако есть подводный камень: при изменении раздела (например, при его перемещении / изменении размера) отображение, созданное kpartx
, не обновляется. Обычно gparted
вызывает partprobe
или что-то для обновления /dev/sd*
; это не будет работать в нашем случае. Вы должны уничтожить сопоставления и воссоздать их. При перемещении / изменении размера разделов запустите одну задачу gparted
, закройте программу, исправьте сопоставления, запустите gparted
со второй задачей и так далее.
Чтобы уничтожить сопоставления, вызовите sudo kpartx -dv myfile.raw
. Удалите осиротевшие символические ссылки в самом конце.