如何阻止 Linux 虚拟机将数据写入空磁盘块?

如何阻止 Linux 虚拟机将数据写入空磁盘块?

我有一个在 qemu 中运行的 Ubuntu 20 虚拟机,它使用 qcow2 磁盘文件和另一个 qcow2 磁盘文件作为后备存储。该虚拟机是根据最近的 Canonical 分布式云映像和 cloud-init 构建的。

一旦我启动它,它的磁盘文件就开始以每五分钟约一千兆字节的速度变得越来越大。

它是一个 ext4 文件系统,没有配置交换。精简配置磁盘映像配置为 1 TB,实际使用的只有 4.2 GB;磁盘映像本身为 4.4 GB。虚拟机所做的就是引导并启动其 GUI。

“iotop”显示“ext4lazyinit”正在运行,所以我认为它正在初始化 inode 表。

当我关闭它并使用 debugfs 的“dump_unused”检查其磁盘映像时,它在未使用的磁盘块中显示了各种随机数据。

我不明白的是,如果磁盘归零,为什么它会这样做,以及为什么它会写入所有这些随机混乱。

ext4 上的空 inode 表全为零吗?它是否可能将磁盘块的一小部分写入作为索引节点表,然后磁盘块的其余部分被垃圾填充而不是全部为零?有什么办法让它写零而不是垃圾吗?

答案1

这是 ext4lazy_itable_init线程,它在挂载后将 inode 表清零,而不是作为mke2fs.在 e2fsprogs commit v1.46.4-25-gbd2e72c5c552 中,有一个补丁(mke2fs:为预置零存储设备添加扩展选项)添加该-E assume_storage_prezeroed选项,以便您可以告诉它设备已经归零并且不显式覆盖 inode 表块。这应该避免增加磁盘映像的大小,并避免在初始安装时发生无关的磁盘 IO。

虽然它出现该提交将在 1.46.5 版本中,看起来它仅在分支上master,并且可能只会打包在基于 1.47 的版本中,除非您从源代码(分支master或樱桃选择此补丁)构建 e2fsprogs到maint)。

相关内容