1

Используя сценарии Bash & Python в Ubuntu 12.04, мы предоставляем клиентам образ диска в виде файла (созданного dd). Как только dd 'd на новый диск, мы изменим размер раздела, чтобы соответствовать диску. Теперь, когда мы используем GPT-диски, мне нужно предоставить новый неинтерактивный, не-X-скрипт.

Задача parted генерирует интерактивное сообщение:

Ошибка: резервная таблица GPT находится не в конце диска, как должно быть. Это может означать, что другая операционная система считает, что диск меньше. Исправить, переместив резервную копию до конца (и удалив старую резервную копию)? Fix/ Игнорировать / Отменить?

Но, используя ключ -s или -m с parted, я не могу заставить его изменить размер диска и исправить местоположение резервной копии GPT. Я также не могу вставить «F» в команду:

echo "F" > parted  /dev/sda resize 2 0% 100%
parted  /dev/sda resize 2 0% 100%
parted -m /dev/sda resize 2 100%
parted -s /dev/sda resize 2 100%

И так далее. gdisk и sgdisk не могут изменить размер. gparted работает нормально, но это, конечно, X и не разрешено.

Из CLI я могу подавить интерактивное сообщение, запустив обратные пометки:

`parted -s /dev/sda rm 2`  ( succeeded with error)
`parted -s /dev/sda mkpart primary 100%` ( fails because the backup GPT was not moved)

Поэтому мне нужна специальная услуга «переместить резервное копирование GPT», предлагаемая в интерактивном сообщении и предлагаемая только там, но мне нужно работать не в интерактивном режиме.

2 ответа2

2

Вы можете запустить expect скрипт из вашего Bash-скрипта, parted чтобы ответить на вопрос.

#!/usr/bin/expect
eval spawn parted  /dev/sda resize 2 0% 100%
expect "Error: The backup GPT table is not at the end of the disk, as it should be. This might mean that another operating system believes the disk is smaller. Fix, by moving the backup to the end (and removing the old backup)? Fix/Ignore/Cancel? "
send "F\r"
expect eof
2

Подход Дру, вероятно, сработает, хотя я его не проверял. Два других подхода использовать комбинацию sgdisk и parted или использовать sgdisk в более сложным образом. В частности, вы можете сделать одно из:

  • Используйте sgdisk -e чтобы переместить данные таблицы резервных разделов в конец диска, а затем разделите parted {device-file} resize... чтобы изменить размер раздела. Использование двух утилит вместо одной немного не элегантно, но это должно работать.
  • Используйте sgdisk -e {device-file} чтобы переместить данные таблицы резервных разделов в конец диска, затем sgdisk -d... чтобы удалить раздел, а затем sgdisk -n... чтобы создать новый раздел в его место. Вы, вероятно, можете объединить их всего в два или, может быть, даже в один вызов sgdisk . Одно предостережение состоит в том, что этот подход изменит значение GUID для раздела. Если важно, чтобы он оставался прежним, вам нужно извлечь эти данные и сбросить значение GUID - или, учитывая, что вы начинаете с известного изображения, вы можете сохранить значение GUID как часть вашего сценария и сбросить его без предварительного извлечения.

Обратите внимание, что я не проверял ни один из этих подходов, поэтому я не могу гарантировать их больше, чем я могу гарантировать метод Дру.

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