在 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
。您需要删除要调整大小的分区,并在其位置创建一个具有相同起点的新分区,就像您使用 所做的那样fdisk
。gdisk
愿意在正在使用的磁盘上工作,尽管内核可能不会记录任何更改。在这种情况下,您可能需要使用partprobe
或kpartx
让内核接受新的分区表,或者如果这不起作用,甚至重新启动计算机。(这应该与使用 非常相似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_name
Ubuntu 安装程序默认创建如下ubuntu--vg-ubuntu--lv