在 Linux 上实时调整 GPT 分区的大小

cyb*_*erz 14 linux partitioning gpt

在 Linux 上,我曾经使用 fdisk 调整 MBR 分区的大小,即使是在实时文件系统上,然后发出 resize2fs/pvresize/...(取决于 fs 类型)来分配新空间。

最近我一直在使用 Xen 和 GPT 分区,我注意到不幸的是 parted 似乎不允许动态调整已安装分区的大小,实际上它会抱怨:

Error: Partition XXX is being used. You must unmount it before you modify it with Parted.
Run Code Online (Sandbox Code Playgroud)

我已经尝试了resize命令和偶数rm+mkpart组合,但他们都会抱怨分区被挂载。

我怎样才能做到这一点?

Rod*_*ith 15

最安全的方法是使用紧急介质(live CD 等)启动并使用 GParted,这将调整分区及其包含的文件系统的大小。但是,这仅在当前未使用分区时才有效。

但是,如果您负担不起任何停机时间,则可以尝试使用gdisk代替parted. 您需要删除要调整大小的分区并在其位置创建一个具有相同起点的新分区,就像您对fdisk. gdisk愿意在正在使用的磁盘上工作,尽管内核可能不会注册任何更改。在这种情况下,您可能需要使用partprobekpartx让内核接受新的分区表,如果不起作用甚至重新启动计算机。(这应该与使用非常相似fdisk。)

  • CentOS 中没有任何工具可以完成这项工作。你*必须*离开 CentOS 软件库来做你想做的事。请注意,几乎所有其他发行版(包括 Fedora)都在其存储库中包含了 `gdisk`,而且我听说 `gdisk` 将包含在 RHEL 的下一个版本(以及 CentOS)中。 (2认同)

Nil*_*yer 14

这通常仅适用于较新的 Linux 发行版。需要的工具:

  • partprobe(通常是parted的一部分)
  • gdisk / sgdisk

GPT 分区在磁盘末尾存储备份头。如果您调整了底层设备的大小,备份标头将位于中间的某个位置。第一步是将分区头移动到磁盘的末尾。

假设磁盘是/dev/sda,分区是/dev/sda3(也必须是最后一个分区):

sgdisk -e /dev/sda
Run Code Online (Sandbox Code Playgroud)

然后删除最后一个分区并重新创建它:

sgdisk -d 3 /dev/sda
sgdisk -N 3 /dev/sda
Run Code Online (Sandbox Code Playgroud)

您通常会看到一条消息,表明内核无法重新加载分区表。您必须运行 partprobe 以便使用新大小注册分区:

partprobe /dev/sda
Run Code Online (Sandbox Code Playgroud)

如果这不成功,则必须重新启动虚拟机。之后,您可以使用适当的工具扩展文件系统,例如 ext4 等:

resize2fs /dev/sda3
Run Code Online (Sandbox Code Playgroud)

注意:运行 sgdisk 可能具有破坏性。确保您有适当的备份程序。

  • 请记住,销毁并重新创建分区将为该分区生成一个新的 PARTUUID,否则这是 fstab/GRUB/etc 可靠地识别多磁盘设置中的分区的唯一可靠且独立于文件系统的方法。 (3认同)

Tag*_*gar 6

这是一个自动化工具用来在一次运行中在线调整分区大小的示例:

sgdisk -d 1 -n 1:2048:0 -c 1: -u 1:E485F29F-A1F4-4953-9DD8-799EAEA0119B -t 1:0700 /dev/xvda

以下是 sgdisk 命令的选项列表:

  • -d 1删除第一个分区
  • -n 1:2048:0表示创建新分区“编号 1”,起始扇区为 2048。结束扇区 =“0” 表示“使用此分区的所有可用空间
  • -u为该分区设置唯一的 guid(这是特定于 GPT 分区的);您可以使用 'R' 将 GUID 设置为随机值。您还可以通过gdisk /dev/xvda; p输出获取当前分区的 id以重用相同的 uid
  • -t 1:0700基本上意味着第一个分区的类型代码为“0700”。

/dev/xvda 是我们重新分区的磁盘。

所以它会立即删除并在其位置创建一个新分区。

附注。关于类型代码“0700”的一些说明。来自 man SGDISK(8)

   -t, --typecode=partnum:{hexcode|GUID}
          Change a single partition's type  code.  You  enter  the  type  code  using  either  a  two-byte  hexadecimal  number,  as 
Run Code Online (Sandbox Code Playgroud)

或完全指定的 GUID 值,例如 EBD0A0A2-B9E5-4433-87C0-68B6B72699C7。

在这里找到了“0700”含义的最佳解释 - http://www.rodsbooks.com/gdisk/walkthrough.html

“但是等等,”你说,“我以为磁盘有一个 FAT 分区!” 确实如此。Windows 对其所有数据分区使用单一的 GUID 代码,无论是 FAT 还是 NTFS。过去,Linux 中的数据分区使用了相同的代码。(稍后会详细介绍....)因此,在这种情况下,几个不同的 MBR 代码都被转换为单个 GPT GUID 代码。GPT fdisk 对所有这些都使用了 0x0700 代码(或更准确地说,EBD0A0A2-B9E5-4433-87C0-68B6B72699C7),这有点随意。

就我而言,我认为这是一个 Linux ext4 分区,但分区的类型代码并不意味着文件系统类型,因此“0700”看起来更像是 sgdisk 的综合类型。至少在我见过的情况下。

聚苯乙烯。您可能需要运行partprobe内核才能在不重新启动系统的情况下了解分区更改。