文章目录
- 问题现象
- 虚拟机文件目录结构
- 处理方法
- 清除宿主机文件和虚拟机快照
- 虚拟机磁盘瘦身
问题现象
-
2月7日下午四点多,我已经休假了,某县的客户运维方打来电话,说平台挂了,无法访问
-
客户是提供的一台
Windows server2016
机器部署平台,是使用VirtualBox6.1
工具安装的CentOS7.9
虚拟机 -
最终排查发现是虚拟机磁盘文件和备份快照磁盘文件一起把机器磁盘撑满了,机器空间不足引发了这个报错,有兴趣的可以看下《virtualbox虚拟机运行中断,启动报错“获取 VirtualBox COM 对象失败”》
-
看了下虚拟机文件262G,备份快照218G,一下子就480G了,而机器只有500+G,加上其他文件,慢慢就爆满了
-
使用
df -h
命令查看,虚拟机总共也就占用100G左右,没有使用那么多 -
搜索后,知道了一个原因:默认情况下VirtualBox会创建动态磁盘,而动态分配的虚拟磁盘,只是逐渐占用物理硬盘的空间(直至达到分配的大小)。不过当其内部空间不用时,不会自动缩减占用的物理硬盘空间
-
我自己测试了下,往虚拟机里上传了一个3GB的文件,发现
.vdi
文件增大了3G,我删除这个文件,.vdi
文件并未变小 -
.vdi
文件比较大时,生成备份快照或导出分享,都不太方便,当我们宿主机磁盘空间不足且无法新增磁盘扩展时,还是需要一个方法对.vdi
文件进行瘦身,VirtualBox
自带有这个工具
虚拟机文件目录结构
- 进行磁盘清理前,我们需要先了解下
VirtualBox
相关的一些文件结构 VirtualBox
没有指定的情况下,默认会在C盘(C:\Users\Administrator
)创建2个文件夹,.VirtualBox
与VirtualBox VMs
.VirtualBox
是虚拟机实时运行时维护的文件,包含定时更新的VirtualBox.xml
和一些日志文件等
VirtualBox VMs
是默认创建的虚拟机文件存储位置,我们导入或新建的虚拟机都在这里面
- 对于使用virtualbox创建的虚拟机,默认情况下(没有备份快照时)会有这样的文件结构
- vName- Logs- VBox.log- VBoxHardening.log- vName.vbox- vName.vbox-prev- vName.vdi
- 其中
vName
指虚拟机名称,.vbox
文件是定时刷新的配置文件,.vbox-prev
是配置的先前的备份文件.vdi
是磁盘文件 - 当我们有了备份快照时,会增加一个
Snapshots
文件夹
- vName- Logs- VBox.log- VBoxHardening.log- Snapshots- {ID1}.vdi- {ID2}.vdi- 2024-01-10T06-49-42-931165700Z.sav- vName.vbox- vName.vbox-prev- vName.vdi
-
其中
Snapshots
文件夹里的.vdi
,是该快照的磁盘文件,是相对于上一个快照(或根目录的vdi)的变动的文件。每个快照一个.vdi
文件,该快照的变动,都会记录到该文件里。对于.sav
文件,有时候创建、删除快照时,系统还是运行状态,文件是会变动的,就会存入.sav
文件 -
示例如下:
-
关于
Snapshots
与.sav
文件的更细的解释如下
在 VirtualBox 中,快照(Snapshots)功能允许您保存虚拟机(VM)的某个状态,这样您可以在未来的某个时间点恢复到该状态。这在进行可能会对系统造成重大更改的操作之前,比如安装软件、测试配置等情况下非常有用。.sav 文件是 VirtualBox 快照的一部分,这是 VirtualBox 保存的虚拟机的内存状态文件。当您为虚拟机创建一个快照时,VirtualBox 实际上做了以下几件事情:1. 它将虚拟机当前的物理内存状态保存到一个 .sav 文件中。
2. 它会保存虚拟机的当前设置和配置。
3. 它会记录虚拟磁盘在快照时间点的精确状态,从而在恢复快照时能回到该时刻。当你选择恢复到某个快照时,VirtualBox 会读取 `.sav` 文件来把虚拟机的内存状态回复到当时的状况。结合磁盘镜像文件(例如,以 `.vdi`、`.vmdk` 等格式存储)的快照,这样完整的快照状态让虚拟机返回到之前保存快照时完全相同的工作状态。简而言之,.sav 文件是虚拟机状态的一种形式,它对于快照功能是至关重要的,尤其是当您希望保留VM当前正在进行的操作以及内存中的数据时。
- 对于
VirtualBox
工具,一般默认安装到C盘的C:\Program Files\Oracle\VirtualBox
里,里面有该软件的所有文件,我们需要的虚拟机磁盘瘦身工具VBoxManage.exe
也在里面
处理方法
清除宿主机文件和虚拟机快照
- 磁盘空间不足,可以是虚拟机或者宿主机,这里的问题主要是指宿主机磁盘
- 可以删除宿主机机器磁盘上不用的文件、压缩包等,留出更多的磁盘空间给虚拟机
- 可以通过
VirtualBox
工具删除多余的虚拟硬盘(已经删除的虚拟机,未删除虚拟机磁盘的),这些未被使用的磁盘会继续占用大量空间,不需要的情况下可以删掉 - 也可以删除多余的备份快照,对于不需要的备份快照,即时删除,可以节省大量空间
- 也可以定时删除和创建快照备份。删除备份时,快照与当前系统文件比较合并,相当于删除了绝大部分重复的文件,释放了很多空间,定时删除创建快照,这样保持快照文件不会特别大
虚拟机磁盘瘦身
- 磁盘瘦身前,可以先删除所有的备份快照,只保留一个vdi文件存储我们的虚拟机状态,这样后续的磁盘瘦身更有效果
- 除了处理快照,虚拟机磁盘本身也需要清理,可以删除不需要的文件,卸载不再使用的程序,清空回收站等,获取更多的可用空间
- 文件删除会产生一些磁盘碎片,Windows系统是有一个磁盘碎片清理功能,而我们虚拟机的是CentOS7.9,可以使用
dd
命令实现,写文件再删除,需要用空数据去覆盖那些空间(未使用空间,包含磁盘碎片),再去删除,命令如下:
cd /
sudo dd if=/dev/zero of=/free
sudo rm -rf /free
- 如果你不止一个root目录,还有home等,可以选一个剩余空间最大的盘,将
/free
换成对应的,如/home/free
。注意:这个命令可能执行很久,和磁盘大小与类型有关 - 最后,使用virtualbox自带的压缩命令对虚拟机硬盘文件进行压缩,对VDI文件压缩瘦身
- dos窗口,执行命令
VBoxManage modifyhd v2.0.0-disk1.vdi --compact
- 执行
VBoxManage
命令时,参数是是不允许有空格的,否则会报错,我们可以换个思路,进到磁盘VDI文件所在位置,再执行
- 使用
Win + R
,输入cmd
,进入DOS
命令窗口,再进到虚拟机磁盘文件所在目录,以我当前截图的过VirtualBox
和v2.0.0
虚拟机为例,命令如下(实际执行请换成自己的目录路径和VDI
文件名称):
cd C:\Users\Administrator\VirtualBox VMs\version\v2.0.0"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyhd v2.0.0-disk1.vdi --compact
- 这个过程也会比较慢,可以看到类似这样
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
的进度条,执行完成后可以看到磁盘占用变小了 - 注意:如果省掉磁盘清理那一步,也可以执行这个命令,只不过磁盘压缩效果不是很好