21.14. virt-sparsify:回收 Empty 磁盘空间
virt-sparsify 命令行工具可用于生成虚拟机磁盘(或任何磁盘镜像)稀疏。这也被称为精简配置。磁盘镜像上的可用磁盘空间转换为主机上可用空间。
virt-sparsify 命令可以处理大多数文件系统,如 ext2、ext3、ext4、btrfs、NTFS。它还可用于 LVM 物理卷。virt-sparsify 可以针对任何磁盘镜像操作,而不只是虚拟机磁盘镜像。
警告
使用 virt-sparsify on live 虚拟机或与其他磁盘编辑工具同时存在,可能会导致磁盘崩溃。在使用 此命令之前,必须 关闭虚拟机。另外,不应同时编辑磁盘镜像。
命令也可用于在某些磁盘格式间进行转换。例如,virt-sparsify 可以将原始磁盘镜像转换为精简置备的 qcow2 镜像。
注意
如果虚拟机有多个磁盘并使用卷管理,virt-sparsify 将正常工作,但它不会非常有效。
如果输入是 raw,则默认输出为 raw sparse。输出镜像的大小必须使用了解稀疏性的工具进行检查。
$ ls -lh test1.img -rw-rw-r--. 1 rjones rjones 100M Aug 8 08:08 test1.img $ du -sh test1.img 3.6M test1.img
请注意,ls 命令将映像大小显示为 100M。但是,du 命令可以正确地显示到 3.6M 的镜像大小。
重要限制
以下是一些重要限制列表:
- 在使用 virt-sparsify 前必须关闭虚拟机。
- 在最糟糕的情况中,virt-sparsify 可能需要最多 2 个源磁盘镜像的虚拟大小。用于临时复制,另一个用于目标镜像。如果您使用
--in-place
选项,则不需要大量的临时空间。 - virt-sparsify 无法用于调整磁盘镜像大小。要重新定义磁盘镜像大小,请使用 virt-resize。有关 virt-resize 的详情请参考 第 21.8 节 “virt-resize:重新定义虚拟机大小”。
- virt-sparsify 无法使用加密磁盘,因为加密磁盘无法被解析。
- virt-sparsify 无法对分区之间的空间进行解析。此空间通常用于引导加载程序等关键项目,因此这不是实际未使用的空间。
- 在
复制
模式中,qcow2 内部快照不会复制到目的地镜像。
示例
要安装
virt-sparsify
,请运行以下命令之一:
# yum install /usr/bin/virt-sparsify
或
# yum install libguestfs-tools-c
sparsify 一个磁盘:
# virt-sparsify /dev/sda1 /dev/device
将
/dev/sda1
的内容复制到 /dev/device
,使输出稀疏。如果 /dev/device
已存在,它会被覆盖。已检测到 /dev/sda1
格式,并用作 /dev/device
的格式。
在格式间进行转换:
# virt-sparsify disk.raw --convert qcow2 disk.qcow2
尝试在源磁盘镜像中找到的每个文件系统上归零并报出可用空间。
要防止特定文件系统上的零覆盖可用空间:
# virt-sparsify --ignore /dev/device /dev/sda1 /dev/device
从磁盘镜像中的所有文件系统创建稳定的磁盘映像,而不会用零覆盖文件系统上的可用空间。
在不创建临时副本的情况下生成磁盘镜像稀疏:
# virt-sparsify --in-place disk.img
使指定的磁盘镜像稀疏,覆盖镜像文件。
virt-sparsify 选项
以下命令选项可用于 virt-sparsify:
命令 | 描述 | 示例 |
---|---|---|
--help | 显示有关特定命令或 virt-sparsify 实用程序的简短帮助条目。详情请查看 virt-sparsify man page。 | virt-sparsify --help |
--check-tmpdir ignore |继续 |warn |失败 | 估计,如果 tmpdir 有足够的空间来完成操作。如果没有足够的空间来完成操作,则指定选项将决定该行为。
--in-place 选项一起使用。 |
virt-sparsify --check-tmpdir ignore
/dev/sda1 /dev/device
virt-sparsify --check-tmpdir continue
/dev/sda1 /dev/device
virt-sparsify --check-tmpdir warn
/dev/sda1 /dev/device
virt-sparsify --check-tmpdir 失败
/dev/sda1 /dev/device
|
--compress | 压缩输出文件。这只有在 输出格式是 qcow2 时有效。这个选项不能与 --in-place 选项一起使用。 | virt-sparsify --compress /dev/sda1 /dev/device |
--convert |
使用指定格式创建稀疏镜像。如果没有指定格式,则使用输入格式。
支持以下输出格式并已知可以正常工作:raw、qcow、vdi
您可以使用 QEMU 模拟器支持的任何格式。
建议您使用
--convert 选项。这样,virt-sparsify 不需要猜测输入格式。
这个选项不能与
--in-place 选项一起使用。
|
virt-sparsify --convert raw
/dev/sda1 /dev/device
virt-sparsify --convert qcow2
/dev/sda1 /dev/device
virt-sparsify --convert other_format indisk outdisk
|
--format | 指定输入磁盘镜像的格式。如果没有指定,则会从镜像中检测到格式。在使用不受信任的原始格式客户机磁盘镜像时,请确保指定格式。 |
virt-sparsify --format raw
/dev/sda1 /dev/device
virt-sparsify --format qcow2
/dev/sda1 /dev/device
|
--ignore |
忽略指定的文件系统或卷组。
当指定文件系统且未指定
--in-place 选项时,文件系统的可用空间不会为零。但是,现有零块被 sparsified。当指定 --in-place 选项时,该文件系统将完全忽略。
当指定卷组时,卷组将被忽略。应该在没有 /dev/ 前缀的情况下使用卷组名称。例如: --ignore vg_foo
--ignore 选项可以多次包含在命令中。
|
virt-sparsify --ignore filesystem1
/dev/sda1 /dev/device
virt-sparsify --ignore volume_group
/dev/sda1 /dev/device
|
--in-place |
使镜像稀疏原位,而不是制作临时副本。虽然原位问题比复制问题更高效,但它不能像复制差异一样恢复太多的磁盘空间。使用丢弃(也称为 trim 或 unmap)支持进行原位升级。
要使用原位解析,请指定一个要进行替换的磁盘镜像。
当指定原位升级时,无法使用以下选项:
| virt-sparsify --in-place disk.img |
-x | 启用 libguestfs API 调用追踪。 | virt-sparsify -x filesystem1 /dev/sda1 /dev/device |
如需更多信息,包括附加选项,请参阅 libguestfs.org。