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


10

在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组合,但是他们都会抱怨正在挂载该分区。

我怎样才能做到这一点?


在RHEL / CentOS上开箱即用的一种方法将受到高度赞赏
cyberz

Answers:


11

最安全的方法是使用紧急介质(活动CD或类似介质)引导并使用GParted,GParted将调整分区及其包含的文件系统的大小。但是,仅当当前未使用该分区时,此方法才有效。

不过,如果您无法承受任何停机时间,则可以尝试使用gdisk代替parted。您需要删除要调整大小的分区,并在同一位置以相同的起点创建一个新分区,这与您所做的非常相似fdiskgdisk尽管内核可能未注册任何更改,但他愿意在使用中的磁盘上工作。在这种情况下,您可能需要使用partprobekpartx获取内核以接受新的分区表,或者甚至在无法正常工作时重新启动计算机。(这应该与使用都非常相似fdisk。)


看起来不错,但是CentOS上默认不包含它。还有其他标准方法吗?我的意思是,类似Redhat的系统应该能够自动调整大小而无需依赖外部程序
cyberz

2
CentOS附带没有工具可以完成这项工作。您必须离开CentOS资料库才能执行所需的工作。请注意,几乎所有其他发行版(包括Fedora)都包含gdisk在它们的存储库中,并且我听说gdisk它将包含在下一版本的RHEL(以及CentOS)中。
Rod Smith

谢谢您的回答和评论,这正是我所寻找的信息
cyberz

1
gdisk在EPEL中可用。
jornane 2014年

我尝试了两者partxpartprobe但最终不得不重新启动。无论如何,谢谢那些提示
Alexandre Bourlier

7

这通常仅适用于较新的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可能具有破坏性。确保有适当的备份过程。


真棒!特别感谢您的partprobe步骤-我一直认为在更改任何已挂载分区的分区表时必须重新启动。
piit79 '18

请记住,销毁并重新创建分区将为该分区生成一个新的PARTUUID,否则,这是fstab / GRUB / etc在多磁盘设置中可靠地标识分区的唯一可靠且与文件系统无关的方式。
Teo KlestrupRöijezon,18年

4

这是一个示例,自动化工具使用该示例一次运行即可在线调整分区大小:

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分区);您可以将GUID的“ R”设置为随机值。您还可以通过gdisk /dev/xvda; p输出获取当前分区的ID,以重用相同的uid。
  • -t 1:0700基本上意味着第一个分区的类型代码为'0700'。

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

因此,它将立即删除并在其所在位置创建一个新分区。

PS。有关类型代码“ 0700”的一些说明。来自男人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内核以了解分区更改,而无需重新引导系统。


“ p”将显示磁盘的UUID。“ i”将显示分区的UUID。
基思

2

我只是在这里总结一些答案和评论:

parted只会拒绝更改任何已安装的分区。 gdisk将为您完成这项工作,但是它不在标准的RHEL或CentOS存储库中。但是,它在EPEL存储库中。

请记住,更改正在使用的磁盘上的分区可能会阻止内核注册更改。如果出现这种情况,使用partprobepartx或自动重启。


1

您是否要调整逻辑卷的大小?这是我的方法:

vgextend vgname /dev/sdb3
lvextend -L +3T /dev/mapper/location
resize2fs /mount/point

或(xfs):

xfs_growfs /mount/point -D <bytes>

他可能不使用ext2 / ext3 / ext4,否则resize2fs应该可以运行吗?

1
@Antony Lee:如果您传递-rlvextend,那么它将resize2fs为您调用。
jmtd
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.