Bash 脚本适用于 GPT

Bash 脚本适用于 GPT

使用 Ubuntu 12.04 中的 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)

所以我需要交互式消息中提供的特殊“移动 GPT 备份”服务,并且仅在那里提供,但我需要以非交互式方式运行。

答案1

Dru 的方法可能有效,尽管我还没有测试过。另外两种方法是使用sgdisk和的组合,或者以更复杂的方式parted使用。具体来说,您可以执行以下任一操作:sgdisk

  • 使用sgdisk -e将备份分区表数据移动到磁盘末尾,然后parted {device-file} resize...调整分区大小。使用两个实用程序而不是一个实用程序有点不雅,但它应该可以工作。
  • 使用sgdisk -e {device-file}将备份分区表数据移动到磁盘末尾,然后sgdisk -d...删除分区,然后sgdisk -n...在其位置创建新分区。您可以将它们合并为两次甚至一次调用sgdisk。需要注意的是,这种方法将更改分区的 GUID 值。如果保持不变很重要,则必须提取该数据并重置 GUID 值 - 或者,如果您从已知映像开始,则可以将 GUID 值存储为脚本的一部分并重置它而无需先提取它。

请注意,我没有测试过这两种方法,因此我无法保证它们的效果,就像我无法保证 Dru 的方法的效果一样。

答案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

相关内容