Dee*_*Two 344 virtualbox vdi
我有一个 VirtualBox VM,它配置了一个非常大的硬盘大小(比主机大)。由于我的错误,VM 上的程序生成了大量日志文件,并且 VDI 文件大小不断增长,直到主机上没有空间为止。
现在我已经删除了日志文件,但使用后 VDI 文件大小并没有变小 VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compact
有没有办法真正压缩 VDI 文件大小?谢谢!
mag*_*981 584
您必须执行以下步骤:
在来宾中运行碎片整理(仅限 Windows)
取消可用空间:
使用Linux 来宾运行:
dd if=/dev/zero of=/var/tmp/bigemptyfile bs=4096k ; rm /var/tmp/bigemptyfile
Run Code Online (Sandbox Code Playgroud)
或者:
telinit 1
mount -o remount,ro /dev/sda1
zerofree -v /dev/sda1
Run Code Online (Sandbox Code Playgroud)
使用Windows 来宾,从 Sysinternals下载SDelete并运行:
sdelete.exe c: -z
Run Code Online (Sandbox Code Playgroud)
(将 C: 替换为 VDI 的驱动器号)
关闭来宾 VM
现在modifymedium使用以下--compact选项运行 VBoxManage 的命令:
使用Linux 主机运行:
vboxmanage modifymedium --compact /path/to/thedisk.vdi
Run Code Online (Sandbox Code Playgroud)
使用Windows 主机运行:
VBoxManage.exe modifymedium --compact c:\path\to\thedisk.vdi
Run Code Online (Sandbox Code Playgroud)
使用Mac 主机运行:
VBoxManage modifymedium --compact /path/to/thedisk.vdi
Run Code Online (Sandbox Code Playgroud)
VBoxManage 位于:/Applications/VirtualBox.app/Contents/MacOS/VBoxManage
这会减小 vdi 大小。
CAD*_*oke 14
我在带有 Windows 来宾的 Windows 7 主机上,这是我写的一个批处理文件,用于压缩文件夹树中的所有 VDI
echo off
mode con:cols=140 lines=200
cls
:: see https://forums.virtualbox.org/viewtopic.php?p=29272#p29272
:: How can I reduce the size of a dynamic VDI on disk?
:: but that page says to use sdelete -s which is suboptimal.
:: use -z as per http://technet.microsoft.com/en-us/sysinternals/bb897443.aspx
:: First run the sdelete -z c: inside the VMs that zero-out all the free space
:: THEN run this batch file
Title Compacting Free space on Virtual Machine VMs
:: http://ss64.com/nt/for_r.html
:: http://stackoverflow.com/questions/8836368/windows-batch-file-how-to-loop-through-files-in-a-directory/8836401#8836401
Setlocal EnableDelayedExpansion
:: http://ss64.com/nt/delayedexpansion.html ...
:: Notice that within the for loop we use !variable! instead of %variable%.
For /R %CD% %%G IN (*.vdi) DO (
set ohai=%%G
set lastfive=!ohai:~-5!
:: Skip snapshots which are named {guid}.vdi
if NOT !lastfive!==}.vdi (
echo .
echo Compacting %%G
"C:\Program Files\Oracle\VirtualBox\VboxManage.exe" modifyhd "%%G" --compact )
)
pause
exit
Run Code Online (Sandbox Code Playgroud)
我在评论中留下了链接,所以你可以(有点)告诉它是如何工作的。
编辑
小智 12
这本身并不是一个直接的答案,因为我正在解决问题,而不是问题。该解决方案不是定期压缩映像,而是使用丢弃来自动删除主机 VM 磁盘映像中未使用的块。
此解决方案需要一个支持连续 TRIM 的来宾文件系统。Arch Linux wiki 有一个支持 TRIM 操作的文件系统列表。
FDE 和cryptoroot 没有特别涵盖,因为存在安全问题,而且这个问题的其他解决方案都不允许压缩。Arch Linux wiki 有关于TRIM 和 dm-crypt 设备的信息。
理论上,这适用于使用 VDI 存储的 VBox 主机上的所有 Linux 来宾。
在 VBox 退出且没有 VM 运行的情况下,通过在 VM 的配置文件中为每个磁盘设置discard和nonrotational为每个磁盘添加丢弃支持。此时discard不在 GUI 中,而是显示nonrotational为“固态驱动器”复选框。(参考:vbox 论坛,放弃支持)
<AttachedDevice discard="true" nonrotational="true" type="HardDisk" [..other options..] >
Run Code Online (Sandbox Code Playgroud)
启动 VM,并验证是否启用了 TRIM 支持:
sudo hdparm -I /dev/sda | grep TRIM
Run Code Online (Sandbox Code Playgroud)
如果正在使用 LVM,请更改 中的丢弃设置/etc/lvm/lvm.conf。(参考:debian wiki,lvm.conf 示例)
devices {
...
issue_discards = 1
}
Run Code Online (Sandbox Code Playgroud)
在 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
Run Code Online (Sandbox Code Playgroud)
重新挂载文件系统,让他们选择新的选项。
sudo mount -o remount /
sudo mount -o remount /build
Run Code Online (Sandbox Code Playgroud)
现在手动修剪空闲块fstrim。fstrim使用挂载的文件系统,而不是支持它的块设备。fstab这可以在每周的 cron 中完成,而不是在 中设置连续丢弃。(建议每周 cron 用于可能对 TRIM 支持有问题的物理 SSD,但这在此处无关紧要,因为底层 SSD 由主机操作系统处理。请参阅:ssd trim warning)。
fstrim /
fstrim /build
Run Code Online (Sandbox Code Playgroud)
此时,VM 内文件系统的大小和 VM 映像的大小应该非常接近。
测试:
| 归档时间: |
|
| 查看次数: |
379415 次 |
| 最近记录: |