我有一个VirtualBox VM,它配置了非常大的硬盘大小(比主机大)。由于我的错误,VM上的程序会生成大量日志文件,并且VDI文件的大小会不断增长,直到主机上没有空间为止。

现在我删除了日志文件,但是使用VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compact后VDI文件的大小并没有变小。谢谢!

#1 楼

您必须执行以下步骤:


在来宾中运行碎片整理(仅Windows)


使可用空间无效:
Linux Guest运行以下命令:
 dd if=/dev/zero of=/var/tmp/bigemptyfile bs=4096k ; rm /var/tmp/bigemptyfile

或:
 telinit 1
 mount -o remount,ro /dev/sda1
 zerofree -v /dev/sda1

使用Windows Guest,从Sysinternals下载SDelete并运行此命令:
 sdelete.exe c: -z



(用VDI的驱动器号替换C :)


关闭来宾VM


现在运行VBoxManage的modifymedium使用--compact选项的命令:
对于Linux主机,请运行此: br />
 vboxmanage modifymedium --compact /path/to/thedisk.vdi

VBoxManage位于此处:/Applications/VirtualBox.app/Contents/MacOS/VBoxManage


这减小了vdi的大小。

评论


对于下一个人,我的命令最终如下所示:“ C:\ Program Files \ Oracle \ VirtualBox \ VBoxManage.exe” Modifyhd“ C:\ Users \ daniel \ VirtualBox VMs \ .... \ thedisk.vdi”- -紧凑

–丹尼尔(Daniel)
2013年12月13日在17:57

根据Zerofree Linux实用程序的联机帮助页(manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html),对于这项工作,zerofree应该比dd更好。不建议使用dd,因为“它很慢”,“使磁盘映像(临时)增长到最大程度”,“(临时)使用了磁盘上的所有可用空间,因此其他并发写入操作可能会失败”。 Zerofree可通过apt在Ubuntu Linux上使用,也可以自己编译。

– Dakatine
2014年2月20日在13:16



有趣的是,zerofree的联机帮助页指出,dd并发写入将失败,但是zerofree需要将文件系统以只读方式挂载! * du *

– Madarco
2014年2月25日在12:04

提示:将两个命令放在一行上,如下所示:dd ...; rm / bigfile,如果您不等待dd完成,这将最大程度减少使用完整磁盘的时间。

– jlh
2014年5月14日17:45

@Dakatine使用VirtualBox 4.3.10,磁盘映像文件没有达到最大程度。 VirtualBox足够聪明,不必费心将所有零块写入物理磁盘。

– jlh
2014年5月14日17:50

#2 楼

我在装有Windows guest虚拟机的Windows 7主机上,这是一个批处理文件,是我将所有VDI写入Compact文件夹树中的文件。
编辑
好吧,毕竟,我尝试了CloneVDI工具,它用更少的时间和一次点击就完成了出色的工作。

评论


您会认为在此类站点上,DOS会有某种语法高亮显示,但没有。在Notepad ++中看起来更漂亮

– CAD bloke
2015年1月9日在10:26

@CAD_bloke,它需要一个解析引擎,并且当您考虑在SE上发布的不同语言的数量时,您正在寻找一个巨大的项目。试想一下,例如有多少个DOS版本和方言,而这甚至还没有进入Linux等。

– Calor
2015年9月17日在9:58

很好的一点。具有讽刺意味的是,它在堆栈交换iOS应用程序中突出显示。

– CAD bloke
2015年9月17日于10:32

是的,CloneVDI是更好,更快的个人使用方式

–user398328
15年11月14日在9:51

该论坛主题的第1页上附有CloneVDI工具的下载:forums.virtualbox.org/viewtopic.php?f=6&t=22422

– Peter Wippermann
5月5日14:04

#3 楼

Windows主机上的Debian guest使用废弃物/ TRIM。
这并不是一个直接的答案,因为我在解决问题,而不是问题。此解决方案无需定期压缩映像,而是使用丢弃来自动删除主机的VM磁盘映像中未使用的块。
此解决方案需要支持连续TRIM的来宾文件系统。
Arch Linux Wiki包含以下列表:支持TRIM操作的文件系统。
由于安全性方面的考虑,FDE和cryptoroot并未明确涵盖,并且其他任何解决方案都不允许压缩。 Arch Linux Wiki包含有关TRIM和dm-crypt设备的信息。
从理论上讲,这将适用于使用VDI存储的VBox主机上的所有Linux来宾。
主机配置
退出VBox且没有虚拟机正在运行,通过在虚拟机的配置文件中为每个磁盘设置discardnonrotational来为磁盘添加丢弃支持。此时,discard不在GUI中,但是nonrotational显示为“固态硬盘”复选框。 (参考:vbox论坛,放弃支持)
<AttachedDevice discard="true" nonrotational="true" type="HardDisk" [..other options..] >

启动虚拟机,并验证是否启用了TRIM支持:
sudo hdparm -I /dev/sda | grep TRIM

访客配置
如果LVM在使用时,请在/etc/lvm/lvm.conf中更改丢弃设置。 (参考:debian wiki,lvm.conf示例)
devices {
...
    issue_discards = 1
}

在fstab中,将discard选项添加到您要自动丢弃的文件系统中(参考:debian wiki,fstab示例)
UUID=8db6787f-1e82-42d8-b39f-8b7491a0523c   /   ext4    discard,errors=remount-ro   0   1
UUID=70bfca92-8454-4777-9d87-a7face32b7e7   /build  ext4    discard,errors=remount-ro,noatime   0   1

重新安装文件系统,以使它们能够使用新选项。 fstrim使用已安装的文件系统,而不是支持它的块设备。代替在fstrim中设置连续丢弃,可以每周执行一次cron。 (建议对可能对TRIM的支持有问题的物理SSD每周执行一次Cron计划,但这与此处无关,因为底层的SSD由主机OS处理。请参见:ssd trim warning。)。
sudo mount -o remount /
sudo mount -o remount /build

此时,VM内文件系统的大小和VM映像的大小应该非常接近值。
经过以下测试:Guest1:Debian 8.7,内核:linux 4.8从反向端口获取grsec,文件系统:ext4
来宾2:Debian 9 RC2,内核:linux 4.9,文件系统:ext4
主机1:VBox 5.1.14,Win7,映像fmt:VDI
主机2:VBox 5.1 .14,Win8.1,图像fmt:VDI


评论


我自己更喜欢定期修剪:“ sudo systemctrl enable fstrim.timer”

– StellarVortex
11月14日22:16

#4 楼

我将其用于安装在Windows VirtualBox中的虚拟Debian上的VDI映像。这不是一般的解决方案,但至少应该让您了解我的工作。

Debian中的命令:

root@debian:~# lsblk  # show partitions



NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT 
sdb 8:16 0 128G 0 disk 
└─sdb1 8:17 0 128G 0 part /mnt/web  # THIS IS THE PARTITION OF INTEREST!
sda 8:0 0 64G 0 disk 
├─sda1 8:1 0 61,4G 0 part / 
├─sda2 8:2 0 1K 0 part 
└─sda5 8:5 0 2,7G 0 part 
[SWAP] sr0 11:0 1 56,3M 0 rom



root@debian:~# service mysql stop  # terminate all operations with partition
root@debian:~# service apache2 stop  # terminate all operations with partition
root@debian:~# umount /mnt/web  # unplug partition
root@debian:~# apt-get install zerofree  # install tool for filling in zeros to empty space
root@debian:~# zerofree -v /dev/sdb1  # fill with zeros
root@debian:~# poweroff  # shut down machine


Windows中的命令:

C:\Program Files\Oracle\VirtualBox>VBoxManage.exe modifyhd --compact "D:\VirtualBox VMs\web.vdi"  # convert zeros to empty space


希望它帮助:)

#5 楼

对于MacOS Guest,请执行以下操作:



取消来宾系统中的可用空间:

diskutil secureErase freespace 0 "/Volumes/Macintosh HD"


(替换/ Volumes / Macintosh HD(带有您的驱动器名称)

关闭来宾VM

运行此命令以减小VDI磁盘映像大小

VBoxManage modifyhd /path/to/thedisk.vdi --compact


OR

VBoxManage modifymedium /path/to/thedisk.vdi --compact




#6 楼

旧版(〜1997-2007)操作系统的重要说明

一般来说,先前给出的答案中的技术有效;但是,有一个非常重要的特殊情况。

几年来-大约是1997-2007年-32位操作系统仍然是标准配置,但硬盘大于2GB已经在使用中。结果,当尝试通过写零文件来消耗所有可用空间时(应始终以root身份执行,以包括root的特权可用空间,其他人都无法接触),您可能会看到:

文件太大

而不是您期望的结果:

设备上没有剩余空间。

如果发生这种情况,则很可能达到2GB的文件大小限制。这在当时很常见,因为许多文件操作返回的结果都是带符号的32位整数,因此负值可以报告错误代码。这实际上意味着无需特殊措施即可将偏移结果限制为2 ^ 31字节。

解决方法很简单:继续创建单独的,名称不同的清零文件,直到磁盘实际空间不足为止。 />
如果您想在课堂上演示这种情况,那么使用带Red Hat Linux 7.0旧副本的4GB磁盘映像就足够了。

评论


地址历史信息:Linux大文件支持始于glibc 2.2 + linux 2.4.0。 Windows大文件支持始于NTFS,尽管像Win2k这样的旧版本将具有其他磁盘限制(48位LBA→最大128 GiB磁盘等)。

–安德鲁·多马塞克(Andrew Domaszek)
4月21日16:10

#7 楼

我不想在OS中启用TRIM支持,因为每次删除数据都会强制将VDI文件中的数据压缩,从而使VDI文件位于经典旋转磁盘上时,来宾系统无法使用。对我来说更好的是用手进行压实,例如每月一次。

在正常压缩期间,VDI文件内容被复制到新文件。这需要主机磁盘上有一些(有时很大)可用空间。

我的解决方案与Andrew Domaszek指出的类似。即使在NTFS(Windows10)上,它也能很好地工作。

要执行此操作:


创建一个新的虚拟机,该虚拟机使用GParted Live CD引导(您可以使用最喜欢的Linux发行版。)
编辑机器设置并设置SATA磁盘控制器
添加要压缩的现有VDI文件

将基于VDI的磁盘更改为具有TRIM支持的SSD可见:

VBoxManage storageattach "gpared live" --storagectl "SATA" --port 0 --discard on --nonrotational on
VBoxManage storageattach "gpared live" --storagectl "SATA" --port 1 --discard on --nonrotational on


启动机
在Linux根shell中,安装NTFS分区mount /dev/sda2 /mnt

零可用空间dd if=/dev/zero of=/mnt/bigfile

rm /mnt/bigfile
压缩VDI而不创建新文件:fstrim -v /mnt



#8 楼

补充公认的答案的一个非常巧妙的技巧是,通过使用主机上的压缩文件系统(例如,选择压缩虚拟机上NTFS属性上的虚拟驱动器的文件夹),可以在将客户机空间归零后完全不进行任何压缩。 Windows主机)。实际上,这样做的好处是可以节省更多空间,因为操作系统倾向于保存大量重复的文本或二进制文件(例如,将15GB的空间清零的30GB来宾驱动器可以在主机驱动器上变为4GB)。 />
注意事项包括:实际硬件上的驱动器访问可能会增加,并且CPU使用率会略有增加。