4

У меня есть образ диска с загрузочного флэш-накопителя. Это GPT для загрузки EFI, поэтому есть небольшой раздел Vfat32 и три других раздела Linux, за которыми следует около 3G свободного места.

Мне нужно скопировать образ диска на немного меньшие флеш-накопители, поэтому мне нужно уменьшиться с 15G до 14G более или менее. Я буду использовать dd на Linux, чтобы делать копии.

gparted отлично подходит для изменения и изменения размера разделов, но в конце не может уменьшить свободное пространство. Теоретически можно обрезать файл, но когда я пытаюсь его взорвать (?таблица дисков? предположение) поэтому нет разделов и файл разрушен. Я уверен, что приведенные ниже методы сработали бы, если бы я использовал вращающиеся диски и / или MBR-диски, но я не проверял.

Пытался:

dd bs=1M count=14000 iflag=fullblock if=/dev/sda  of=myfile.raw

не сжимался

rsync --sparse filename filename 

это не взорвало дисковые столы, но сократило обмен и сохранило нераспределенную область.

qemu-img convert -f raw -O qcow2 -S 4k filename filename (планируется преобразовать обратно в raw)

взорвали столы

truncate size=140000M <filename>

также взорвали столы

cp --sparse=always filename filename

не работал

1 ответ1

4

В начале должна быть первичная (основная) таблица разделов 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 . Удалите осиротевшие символические ссылки в самом конце.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .