虚拟盒 vdi 占用的空间比实际大小大得多

虚拟盒 vdi 占用的空间比实际大小大得多

我有一个动态磁盘 ubuntu 实例,df 报告正在使用 30gig(这也是报告的内容df),但 vdi 文件在磁​​盘上是 130gig:

在此处输入图片描述

在此处输入图片描述

我不记得它之前占用了这么多空间 -(但不是 100%) - 就好像客人使用了更多的磁盘空间,然后有一天主机突然将其调整为比所需的大得多的尺寸。

我不太想缩小动态大小的磁盘(这是不可能的),但我想知道为什么实际的 VDI 需要假设底层客户机的空间为 5 倍——这似乎不太“动态”

答案1

答案其实很简单。

每当您的客户机在以前未写入过的位置写入磁盘时,VDI 的大小就会增大以容纳“新”数据。VirtualBox 不知道磁盘上存储了什么。因此,它是否是未使用的空间并不重要。唯一重要的是,该空间在某个时候被使用过。

现在,如果客户机写入了 20Gb 的连续数据(一个字节接着一个字节),那么 VDI 文件将需要 20GB 的物理硬盘空间。

但实际情况并非如此。相反,客户虚拟机将不断读取/写入/移动数据。即使将相同的 20GB 数据移动到分区的新区域,VDI 也会增长以容纳“新”数据。

VDI 文件永远不会缩小,最终将始终达到您预定义的最大尺寸。

答案2

薄(在 VirtualBox 术语中称为稀疏或动态)磁盘映像的大小会随着时间的推移而增大,但永远不会缩小。以下是一个例子:您创建 10GB 的薄 VDI 磁盘,挂载它,然后开始循环创建/删除一系列相对较小的文件。即使每个小文件都不会大于 100MB - 您的 VDI 磁盘也会很快增长到最大大小。

让我们从刚刚创建并安装的 10G 磁盘开始。这是它在 VM 中的样子

[root@localhost ~]# df -h | egrep "^Filesystem|test"
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/test-lvol    9.9G   23M  9.4G   1% /mnt

这是它在虚拟机外部(主机上)的样子

ls -lh|grep New
-rw-------  1 dmitryzayats  staff    94M Oct 28 23:33 NewVirtualDisk1.vdi

因此它在主机上仅占用略少于 100M 的空间。

现在我们将按顺序运行这个一行脚本。创建和删除 1000 个相对较小的 100M 文件。在任何给定时间点,我们的虚拟机将显示我们只在文件系统上消耗了 200M。

for i in {1..1000}; do echo "Run=$i"; dd if=/dev/urandom of=/mnt/testfile${i} bs=1M count=100; df -h; rm -f /mnt/testfile$(($i-1)); done

Run=319
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.944908 s, 111 MB/s
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 992M     0  992M   0% /dev
tmpfs                   1001M     0 1001M   0% /dev/shm
tmpfs                   1001M  584K 1000M   1% /run
tmpfs                   1001M     0 1001M   0% /sys/fs/cgroup
/dev/mapper/fedora-root   13G  4.3G  7.4G  37% /
/dev/sda1                976M   82M  828M   9% /boot
tmpfs                   1001M  4.0K 1001M   1% /tmp
tmpfs                    201M     0  201M   0% /run/user/0
/dev/mapper/test-lvol    9.9G  223M  9.2G   3% /mnt

但从东道主的角度来看,情况会有很大不同。

ls -lh|grep New
-rw-------  1 dmitryzayats  staff   9.8G Oct 29 00:13 NewVirtualDisk1.vdi

原因是每次创建新文件时 - 操作系统都可以将数据写入块设备上的不同位置。然后当文件被删除时 - 从 VM 空间的角度来看现在是空闲的,但在底层 VDI 空间上已经保留,VDI 文件的大小会增加,并且无法缩小它。有一些可能性可以实际减少它,但这需要关闭 VM 并在 VDI 文件中打洞。您可以谷歌搜索“在稀疏文件中打洞”。

某些工作负载在精简磁盘上的表现尤其糟糕。例如,如果 Oracle 数据库处于存档模式 - 它将创建许多存档日志,即使通过运行 rman 定期删除这些日志 - 它也很快就会将精简磁盘填满到最大大小。

相关内容