Используя сценарии Bash & Python в Ubuntu 12.04, мы предоставляем клиентам образ диска в виде файла (созданного с помощью dd). Когда ddмы перейдем на новый диск, мы изменим размер раздела в соответствии с размером диска. Теперь, когда мы используем GPT-диски, мне нужно предоставить новый неинтерактивный, не-X-скрипт.
Проблема partedгенерирует интерактивное сообщение:
Ошибка: резервная таблица GPT находится не в конце диска, как должно быть. Это может означать, что другая операционная система считает, что диск меньше. Исправить, переместив резервную копию до конца (и удалив старую резервную копию)? Fix / Игнорировать / Отменить?
Но с помощью -sили -mпереключиться с parted я не могу заставить его изменить размер диска и исправить местоположение резервной копии GPT. Я также не могу вставить «F» в команду:
И так далее. gdiskи sgdisk, кажется, не в состоянии изменить размер. gpartedработает нормально но это Х конечно и не разрешено.
Из 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
Dru
Вы можете запустить 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
Это хорошая идея @Dru.
John P. Fisher 9 лет назад
0
2
Rod Smith
Dru's approach will probably work, although I've not tested it. Two other approaches are to use a combination of sgdisk and parted, or to use sgdisk in a more complex way. Specifically, you could do either of:
Use sgdisk -e to move the backup partition table data to the end of the disk, followed by parted resize... to resize the partition. Using two utilities rather than one is a bit inelegant, but it should work.
Use sgdisk -e to move the backup partition table data to the end of the disk, followed by sgdisk -d... to delete the partition and then sgdisk -n... to create a new partition in its place. You can probably combine these into just two or maybe even just one call to sgdisk. One caveat is that this approach will change the GUID value for the partition. If it's important that it remain the same, you'd have to extract that data and reset the GUID value -- or given that you're starting from a known image, you could store the GUID value as part of your script and reset it without first extracting it.
Note that I've not tested either of these approaches, so I can't guarantee them any more than I can guarantee Dru's method.
Также хорошая идея @ Род Смит. Я проверю это в понедельник на работе.
John P. Fisher 9 лет назад
0
Я собираюсь использовать это: `sgdisk -e / dev / sda; sgdisk -d 2 / dev / sda; sgdisk -N 2 / dev / sda`
John P. Fisher 9 лет назад
0
Обратите внимание, что если вы используете подход "sgdisk" только, вы также должны изменить размер файловой системы, содержащейся в этом разделе. Также важно, чтобы начальный сектор нового раздела оставался таким же, как и исходный. Это не гарантируется, если вы используете `sgdisk -N`, хотя это может работать нормально, в зависимости от того, как был создан исходный раздел.
Rod Smith 9 лет назад
0
Я полагаю, вы написали sgdisk? ты должен знать! но .... df и gparted не согласятся после того, как вы закончите. Как говорит Род, вы должны выполнить `resize2fs`, а я также должен выполнить` e2fsck` перед `resize2fs`. Не уверен, требуется ли e2fsck или просто хорошая идея.
John P. Fisher 9 лет назад
0