如何缩小物理卷?

Jas*_*sio 8 lvm

我在一个分区上有一个物理卷,它延伸到整个磁盘,比如 /dev/sda1 使用 100% 的 /dev/sda。现在我需要缩小它以创建 /dev/sda2。一个逻辑卷实际上使用了大约 50% 的 PV,所以理论上有足够的空间可用,但它全部分配给单个 PV。有没有一种安全的方法来缩小物理卷(和底层磁盘分区),为第二个分区创建一些额外的空间?不幸的是,我的配置排除了将物理卷临时移动到另一个设备的可能性。

当然,我知道我可以在文件级别执行此操作(例如备份内容、重新分区磁盘驱动器和重新创建 LVM 配置),但我更愿意在不需要从头开始配置 LV 的情况下完成这项工作。

先谢谢你。

tel*_*coM 16

如果您只需要另一个单独的文件系统,则不必创建新分区:您可以使用 PV 中未分配的空间在现有卷组中创建另一个 LVM 逻辑卷。但是如果你特别需要一个新的分区,那么你必须按照你最初的计划去做。

GParted是一个 GUI 工具,可以为您完成整个 PV + 分区大小调整操作。您很可能会在发行版的软件包集合中找到它。

但是,如果您由于某种原因不能或不想使用它,请继续阅读...

减少其中有未分配空间的 LVM 物理卷非常简单。例如,要将 /dev/sda1 的大小减小到 40 GiB:

# pvresize --setphysicalvolumesize 40G /dev/sda1
Run Code Online (Sandbox Code Playgroud)

这个命令是安全的,因为如果它要切掉的 PV 部分包含分配的范围,它将拒绝做任何事情。

但这只是第一步。第二步是减小分区本身的大小。

为安全起见,建议您最初将 PV 收缩得比实际收缩分区多一点,以便在收缩分区后,您可以明确扩展 PV 以覆盖分区的全部大小。如果扩展操作失败,您会立即知道在调整分区大小时出了什么问题,并且不会留下隐藏的错误来诱捕您或其他人。

您可以使用普通的 Linuxfdisk命令缩小分区,但您必须记住以下几点:

  • 使用fdisk调整分区大小时,请确保将其设置为首先显示所有分区大小和扇区中的起始位置。在 Linux 的历史上fdisk,它的行为在这里有所不同:现代版本默认这样做,旧版本可能需要一个-u-u=sectors选项来这样做。
  • 调整现有分区的大小时,不能移动分区的起点。(如果移动起点,就不再是简单的resize操作,而是更复杂的分区移动操作。)

使用 时fdisk,任何更改仅在您使用该w命令时写入磁盘。所以我建议像这样进行:

  • 用于sfdisk -d /dev/sda > /safe/location/partition_table_backup.dump备份现有的分区表。
  • fdisk /dev/sda以交互模式启动
  • 使用该p命令查看当前分区表并验证“开始”和“结束”值是否显示为扇区。记下“开始”值。
  • 使用该d命令删除 的当前分区条目sda1
  • 使用该n命令重新创建sda1所需大小的主分区条目 1 ,注意准确指定第一个扇区的位置(即与p命令的“开始”值中显示的数字相同)。
  • 使用t命令将分区1的类型设置为“Linux LVM”。
  • 仔细检查你的工作
  • 使用w命令写入更新的分区表并退出fdisk

注意fdisk最后显示的消息。如果它说“内核仍然使用旧表”,则说明有什么东西阻止了在线分区表更新。您可以尝试partprobe /dev/sda告诉内核重新读取分区表(使用比某些旧版本更新的接口fdisk,因此它可能会有所帮助并且肯定不会受到伤害)然后查看cat /proc/partitions分区现在是否被内核识别在预期的大小。

如果分区大小调整成功,您现在可以运行pvresize /dev/sda1. 如果您遵循我的建议并最初将 PV 调整为比所需的新分区大小小一点,它现在应该成功地将 PV 扩展一点以自动完全覆盖调整后的分区。如果此命令报告错误,您可能在指定新大小时犯了错误,应该使用它sfdisk /dev/sda < /safe/location/partition_table_backup.dump来将分区表恢复到最初的状态,然后再试一次。

(在非常旧的系统上,您实际上可能必须在运行之前停用 VG,partprobe甚至重新启动以允许系统重新读取更新的分区表。)

调整大小操作完成后,您现在可以fdisk再次使用来创建您需要的第二个分区。是的,您也可以在调整分区大小时一起进行,但一次只做一件事更安全,并确保您可以在需要时轻松回滚更改。