如何使用 mke2fs/fallocate 创建厚置备虚拟磁盘文件?

如何使用 mke2fs/fallocate 创建厚置备虚拟磁盘文件?

我目前专门为存储大小配额制作虚拟磁盘。我可以制作一个 10GB 的磁盘,例如:

touch myShare-10G
truncate -s 10G myShare-10G
mke2fs -t ext4 -F myShare-10G
fallocate -l 10G myShare-10G
ls -s myShare-10G --block-size=G

显示已使用 11GB。

复制 5GB 的数据后,文件大小仍然正确地保持在 11GB。

我的问题是,删除 5GB 的数据后,文件大小下降到 6GB,而不是保持在 11GB 大小。

如何使我的虚拟磁盘保持“厚”配置(也就是说,无论里面的内容如何,​​文件大小都保持固定)?

答案1

一种简单的方法是使支持设备不可丢弃。您可以通过 HDD 支持的 LVM 卷免费获得此功能,并将其用作 VM 的虚拟磁盘驱动器。使用原始块设备也是获得最佳性能的常见建议:

https://www.linux-kvm.org/page/Tuning_KVM

QEMU 支持多种存储格式和后端。最容易使用的是 raw 和 qcow2 格式,但为了获得最佳性能,最好使用 raw 分区。您可以创建逻辑卷或分区 [...]

然而,一旦你转向SSD存储,它自然会再次丢弃。 LVM 精简配置卷也会发生同样的情况,即使它是 HDD ( man lvmthin)。

在这种情况下,您只需告诉虚拟机不允许这样做。对于 qemu/KVM,可以使用该discard=ignore参数来完成。我认为其他虚拟化解决方案在某处也有类似的设置。

来自 qemu 联机帮助页:

           "discard=discard"
               discard is one of "ignore" (or "off") or "unmap" (or "on")
               and controls whether "discard" (also known as "trim" or
               "unmap") requests are ignored or passed to the filesystem.
               Some machine types may not support discard requests.

为了明确意图,即使当前在您的配置中不可能丢弃,指定也没有什么坏处。


顺便说一句,您的设置命令可以更短:

# create a new allocated file
fallocate -l 10G myShare-10G
# format it without discarding it
mke2fs -t ext4 -E nodiscard myShare-10G

这应该会得到与上面 4 个命令链相同的结果。

如果您要覆盖现有文件系统并且不希望出现提示,则仅需要 -F。对于新文件,应该没有必要。

相关内容