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

Linux 上 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.

我已经尝试了resize命令甚至rm+mkpart组合,但它们都会抱怨正在安装的分区。

我怎样才能做到这一点?

答案1

最安全的方法是使用紧急介质(Live CD 或类似介质)启动并使用 GParted,它将调整分区及其所含文件系统的大小。不过,这仅在分区当前未被使用时才有效。

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

答案2

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

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

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

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

sgdisk -e /dev/sda

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

sgdisk -d 3 /dev/sda
sgdisk -N 3 /dev/sda

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

partprobe /dev/sda

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

resize2fs /dev/sda3

警告:运行 sgdisk 可能会造成破坏。请确保您已采取适当的备份措施。

答案3

以下是自动化工具一次性在线调整分区大小的示例:

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 

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

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

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

在我看来,那是一个 Linux ext4 分区,但分区的类型代码并不意味着文件系统类型,因此“0700”看起来更像是 sgdisk 的通用类型。至少在我见过的案例中是这样的。

PPS。您可能需要运行partprobe内核才能了解分区更改,而无需重新启动系统。

答案4

这对我(Ubuntu 20.04)有效,没有数据丢失:

将 GPT 扩展至新的驱动器大小

# sgdisk -e /dev/sdX

重新扫描分区表

# partprobe /dev/sdX

调整分区大小

# cgdisk /dev/sdX

cgdisk 有一个命令行 Curses 界面,您可以使用箭头键导航到所需的分区并选择“调整大小”。然后“写入”分区表并“退出”

调整文件系统大小

# resize2fs /dev/sdX3

如果它是分区#3并直接使用,或者如果它是LVM并且您希望它占用所有备用空间:

# pvresize /dev/sdX3
# lvextend -l 100%VG /dev/mapper/your_vg-lv_name
# resize2fs /dev/mapper/your_vg-lv_name

your_vg-lv_nameUbuntu 安装程序默认创建如下ubuntu--vg-ubuntu--lv

相关内容