Bash&Pythonスクリプトを使用して、ディスクイメージをファイルとして顧客に配信しています(dd
によって生成されます)。新しいディスクにdd
されたら、パーティションのサイズを変更します。ディスク。GPTディスクを使用しているので、新しい非対話型の非Xスクリプトを提供する必要があります。
問題は、parted
がインタラクティブメッセージを生成することです。
エラー:バックアップGPTテーブルがディスクの最後にありません。これは、別のオペレーティングシステムがディスクが小さいと信じていることを意味している可能性があります。バックアップを最後に移動する(そして古いバックアップを削除する)ことで修正しますか?修正/無視/キャンセル?
しかし、-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)
そのため、インタラクティブメッセージで提供され、そこでのみ提供される特別な「move GPT backup」サービスが必要ですが、非インタラクティブに実行する必要があります。
私はそれをテストしていませんが、Druのアプローチはおそらくうまくいくでしょう。他の2つのアプローチは、sgdisk
とparted
の組み合わせを使用するか、より複雑な方法でsgdisk
を使用することです。具体的には、次のいずれかを実行できます。
sgdisk -e
バックアップパーティションテーブルのデータをディスクの最後に移動し、その後にparted {device-file} resize...
パーティションのサイズを変更します。 1つではなく2つのユーティリティを使用するのは少しエレガントではありませんが、機能するはずです。sgdisk -e {device-file}
バックアップパーティションテーブルのデータをディスクの最後に移動し、その後にsgdisk -d...
パーティションを削除してから、sgdisk -n...
その場所に新しいパーティションを作成します。これらを組み合わせて、sgdisk
を2回、または1回だけ呼び出すことができます。注意点の1つは、このアプローチではパーティションのGUID値が変更されることです。同じままであることが重要な場合は、そのデータを抽出してGUID値-または既知の画像から開始している場合は、GUID値をスクリプトの一部として保存し、最初に抽出せずにリセットすることができます。私はこれらのアプローチのどちらもテストしていないので、Druの方法を保証できる以上にそれらを保証することはできないことに注意してください。
Bashスクリプトexpect
から 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