如何在 Linux 上调整 qcow2 磁盘映像的大小 您所在的位置:网站首页 怎样更改磁盘分区大小 如何在 Linux 上调整 qcow2 磁盘映像的大小

如何在 Linux 上调整 qcow2 磁盘映像的大小

2024-07-14 13:18| 来源: 网络整理| 查看: 265

如何在 Linux 上调整 qcow2 磁盘映像的大小

Qcow2 是 Qemu 使用的默认虚拟磁盘存储格式(qcow 代表 qemu copy-on-write)。这种映像格式利用精简配置,因此,在我们最初设置磁盘的最大虚拟大小后,实际上仅在使用时分配空间,但在释放时不会将其返回给主机。在本文中,我们将了解如何“ sparsify”是一个 qcow2 磁盘映像来回收可用空间,如何扩展或缩小它,以及如何从主机系统管理其上的分区布局,并使用 NBD 协议连接它。

在本教程中您将学习:

什么是精简配置

如何从使用精简配置的 qcow2 映像中回收未使用的空间

什么是NBD协议

如何使用 NBD 协议将 qcow2 磁盘映像连接到主机系统

如何扩展 qcow2 镜像

如何缩小 qcow2 图像

从 qcow2 映像回收未使用的空间

正如我们已经说过的,默认情况下,qcow2 映像是精简配置的。这意味着,当我们创建它们时,我们提供了最大虚拟大小,但仅从主机上的可用空间中减去磁盘映像上实际使用的空间。我们来验证一下。在我的系统上,我使用 virt-install 创建了一个虚拟机,并指定了 20GiB 的磁盘虚拟大小。该磁盘名为 disk.qcow2。我们可以使用 ls 命令验证其大小:

$ ls -lh disk.qcow2 -rw-------. 1 egdoc egdoc 21G Mar 2 10:10 disk.qcow2

在上面的示例中,我们使用 -l 选项调用 ls 来获取详细输出,并使用 -h 来获取人类可读的输出尺寸(尺寸是四舍五入的)。 ls 命令不支持精简配置,这就是报告映像最大大小的原因。如果我们使用像 du 这样的自动精简配置工具检查磁盘映像使用的实际空间,我们会得到不同的结果:

$ du -h disk.qcow2 1.4G disk.qcow2

如您所见,输出报告实际使用的空间为 1.4G。有关 qcow2 磁盘映像的信息还可以使用 qemu-img 实用程序方便地检索,运行 info 命令(仅当磁盘未使用时):

$ qemu-img info disk.qcow2 image: disk.qcow2 file format: qcow2 virtual size: 20 GiB (21474836480 bytes) disk size: 1.32 GiB cluster_size: 65536 Format specific information: compat: 1.1 compression type: zlib lazy refcounts: true refcount bits: 16 corrupt: false extended l2: false

在命令的输出中,我们可以清楚地看到磁盘虚拟大小(20 GiB)与实际磁盘大小之间的差异(1.32 GiB)。

正如我们所说,精简配置的优点是仅在实际使用时才使用主机空间。为了验证这一点,让我们从来宾系统在磁盘映像上创建一个虚拟文件:

[egdoc@virtualmachine]$ dd if=/dev/urandom of=dummyfile bs=1M count=2048

上面我们使用 /dev/urandom 作为源,dummyfile 作为目标运行 dd,并写入 2048 个 1MiB 块,以创建一个 2GiB 文件。如果我们再次检查磁盘映像,我们可以看到它的实际大小现在更大了:

$ qemu-img info disk.qcow2 image: disk.qcow2 file format: qcow2 virtual size: 20 GiB (21474836480 bytes) disk size: 3.32 GiB cluster_size: 65536 Format specific information: compat: 1.1 compression type: zlib lazy refcounts: true refcount bits: 16 corrupt: false extended l2: false

仅当客人使用时才需要占用空间。然而,这只能以一种方式起作用:当磁盘映像上的空间被释放时,它不会“释放”给主机。我们可以通过删除虚拟文件来轻松验证这一点:

[egdoc@virtualmachine]$ rm dummyfile

如果我们再次检查磁盘映像,我们可以看到没有任何变化,空间仍然被占用:

$ qemu-img info disk.qcow2 image: disk.qcow2 file format: qcow2 virtual size: 20 GiB (21474836480 bytes) disk size: 3.32 GiB cluster_size: 65536 Format specific information: compat: 1.1 compression type: zlib lazy refcounts: true refcount bits: 16 corrupt: false extended l2: false

我们怎样才能使主机上的空间再次可用?为了完成这样的任务,我们可以使用 virt-sparsify 实用程序,它是 libguests-tools 的一部分:

$ virt-sparsify --in-place disk.qcow2

我们使用 --in-place 选项调用该命令:这使得操作无需创建磁盘映像的副本即可进行。这是命令输出:

◓ 25% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒═════════════════════════════════════════════════⟧ --:-- 100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00 [ 18.4] Trimming /dev/sda1 [ 18.5] Trimming /dev/sda2 [ 19.4] Sparsify in-place operation completed with no errors

要记住的一件非常重要的事情是,在运行上述命令之前,我们必须关闭正在使用磁盘的来宾系统,以避免可能的损坏。进行“sparsify”操作后,我们可以再次验证磁盘映像使用的空间,可以看到它减少了:

$ qemu-img info disk.qcow2 image: disk.qcow2 file format: qcow2 virtual size: 20 GiB (21474836480 bytes) disk size: 1.32 GiB cluster_size: 65536 Format specific information: compat: 1.1 compression type: zlib lazy refcounts: true refcount bits: 16 corrupt: false extended l2: false

正如我们刚才所看到的,如果我们正在处理 qcow2 映像,则需要使用 virt-sparsify 实用程序,该映像默认使用精简配置,并且我们希望腾出空间之前分配在磁盘映像上,现在不再使用,可在主机上再次使用。如果我们想要更改磁盘映像的虚拟大小(我们在创建虚拟机时声明的),我们必须使用另一种策略。让我们看看如何进行。

使用 qemu-img 扩展磁盘虚拟大小

上面我们看到了如何使用 virt-sparsify 命令从 qcow2 磁盘映像回收未使用的空间。在某些情况下,我们可能想更改磁盘映像的虚拟大小,因此要么扩展它,要么缩小它。两种操作都非常简单;让我们从前者开始。

我们可以用来扩展 qcow2 磁盘映像的虚拟大小的最简单方法是使用 qemu-img 和 resize 命令。我们所要做的就是提供磁盘的路径和新的绝对大小(或大小增量)作为参数。正如我们所看到的,当前磁盘虚拟大小为 20GiB。假设我们想将其扩展到 30GiB,我们将按以下方式进行。首先,我们会对当前磁盘进行备份,以防万一出现问题:

$ cp disk.qcow2 disk.bk.qcow2

然后,要扩大图像的大小,我们将运行以下命令:

$ qemu-img resize disk.qcow2 30G

作为替代方案,我们可以指定大小增量,而不是最终的绝对大小:

$ qemu-img resize disk.qcow2 +10G

一旦额外的空间被添加到磁盘映像中,我们就必须增加分区和文件系统,以便它们能够利用它。如何继续做到这一点取决于我们想要增长的分区/文件系统。例如,要增加磁盘上最后一个现有分区,我们可以在来宾系统运行时使用它的分区工具。对于其他更复杂的操作,我们需要采取另一种策略:关闭客户系统并使用“外部”工具修改磁盘。

使用 NBD 修改磁盘映像的分区

对磁盘映像布局的某些更改无法从正在运行的系统执行:例如,我们无法在安装分区时缩小或移动分区。在这种情况下,我们需要从主机系统修改磁盘映像。我们可以通过使用NBD协议将磁盘映像连接到主机系统来实现这一点。

Nbd 代表网络块设备:它是一种允许机器访问连接到另一台机器的块设备的协议。在 Linux 上,此功能由 nbd 模块实现,需要加载该模块:

$ sudo modprobe nbd max_part=10

在本例中,我们使用 max_part 选项加载模块来指定设备的最大分区数。加载模块后,要实际挂载磁盘映像,我们运行以下命令:

$ sudo qemu-nbd -c /dev/nbd0 disk.qcow2

qemu-nbd命令旨在使用 NBD 协议导出 QEMU 磁盘映像。在上面的示例中,使用 -c 选项,我们将文件名(本例中为 /dev/nbd0)连接到给定设备:disk.qcow2。连接磁盘后,我们可以使用我们最喜欢的分区工具来修改其布局(请记住在进行任何更改之前关闭来宾系统!)。在本教程中,我们将使用 gparted:

$ gparted /dev/nbd0

磁盘分区布局将像任何其他块设备一样显示:

在上图中,我们可以清楚地看到我们之前添加到磁盘中尚未使用的 10 Gib 空间。

缩小 qcow2 图像

要减小 qcow2 磁盘映像的虚拟大小,我们必须首先减小其上的分区和文件系统的大小。我们需要这样做,因为通过收缩操作删除的空间中的所有数据都将丢失。

假设我们正在处理原始图像,其虚拟大小为 20GiB,并且我们希望将其大小减小到 10GiB。首先,我们确保来宾系统已关闭,然后像我们在前面的示例中所做的那样,然后连接磁盘并在其上使用我们最喜欢的分区工具。

在这种情况下,在缩小镜像之前,我们需要减小 /dev/nbd0p2 分区的大小。我们希望将磁盘映像减少 10GiB,因此作为安全措施,为了确保数据不被截断,我们将分区大小减少到 8GiB(稍后我们可以轻松地从客户系统重新扩展分区)。这是执行操作后的磁盘布局:

现在我们调整了分区大小,我们可以关闭分区程序并断开磁盘连接。为此,我们再次使用 qemu-nbd。这次我们使用 -d 选项调用它,该选项将要断开连接的设备的路径作为参数:

$ sudo qemu-nbd -d /dev/nbd0

最后,我们可以缩小图像:

$ qemu-img resize disk.qcow2 --shrink -10G

我们像扩展图像时一样调用 qemu-img ,但这次我们使用 -10G 表示法来指定我们要减去该空间量;我们还使用了 --shrink 选项:这是确认操作所必需的,因为它存在潜在危险(正如我们已经说过的,已删除空间上存在的数据将丢失)。

通过使用 qemu-img info 命令,我们可以看到磁盘映像虚拟大小现在为 10G:

$ qemu-img info disk.qcow2 image: disk.qcow2 file format: qcow2 virtual size: 10 GiB (10737418240 bytes) disk size: 1.32 GiB cluster_size: 65536 Format specific information: compat: 1.1 compression type: zlib lazy refcounts: true refcount bits: 16 corrupt: false extended l2: false

为了确保一切正常,我们现在可以启动来宾系统,不应报告任何错误。

结论

Qcow2 磁盘映像默认使用精简配置,因此仅在来宾系统实际使用时才分配磁盘空间,但在释放时不会“释放”回来。在本文中,我们了解了如何“稀疏”qcow2 映像,以便使虚拟磁盘映像上未使用的空间在主机系统上再次可用,并且我们学习了如何扩展或缩小 qcow2 映像。在此过程中,我们了解了如何在 Linux 上使用 NBD 协议将磁盘映像连接到主机系统。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有