答案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 定期删除这些日志 - 它也很快就会将精简磁盘填满到最大大小。