VirtualBox虚拟机磁盘VDI文件压缩瘦身

文章目录

    • 问题现象
    • 虚拟机文件目录结构
    • 处理方法
      • 清除宿主机文件和虚拟机快照
      • 虚拟机磁盘瘦身

问题现象

  • 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个文件夹,.VirtualBoxVirtualBox 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命令窗口,再进到虚拟机磁盘文件所在目录,以我当前截图的过VirtualBoxv2.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%的进度条,执行完成后可以看到磁盘占用变小了
  • 注意:如果省掉磁盘清理那一步,也可以执行这个命令,只不过磁盘压缩效果不是很好
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/692185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AIOps探索 | 从单一告警管理到统一告警管理

原作者:擎创科技 资深产品专家 布博士 前言 最近发现我们的一些客户,仍在使用十多年前的流程和思想来思考业务和产品的未来。我们认为做产品必须明确该产品未来的业务发展方向,否则研发出的东西只是应对当前可见的需求(即项目需求…

【教程】详解相机模型与坐标转换

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 由于复制过来,如果有格式问题,推荐大家直接去我原网站上查看: 相机模型与坐标转换 - 生活大爆炸 目录 经纬度坐标系 转 地球直角坐标系大地直角坐标系 转 经纬度坐标系地理坐标…

感觉我国的程序员前景一片灰暗,是这样吗?

程序员也分为好几等,在现在看来大部分的Android、Java、前端等等开发。已经看不到希望了,很多人都在边缘挣扎;刚看到一位Android开发者,过完年回公司就通知被裁;可见每年都会有很多互联网公司倒闭,或者裁员…

手把手教你:gitee的注册以及代码的提交(上)

个人主页(找往期文章包括但不限于本期文章中不懂的知识点):我要学编程(ಥ_ಥ)-CSDN博客 gitee的介绍 首先,我们得了解什么是gitee? gitee是一个基于Git的代码托管和研发协作平台,上面可以托管个人或者公…

【AI学习】LangChain学习

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

服务器遭受 DDoS 攻击的常见迹象有哪些?

服务器遭受 DDoS 攻击的现象很常见,并且有时不容易预防,有部分原因是它们的形式多种多样,而且黑客手段越来越隐蔽。如果您怀疑自己可能遭受 DDoS 攻击,可以寻找多种迹象。以下是 DDoS 攻击的5个常见迹象: 1.网络流量无…

虚拟机+麒麟海光+达梦数据库linux 安装教程

一 下载 虚拟机下载地址下载 VMware Workstation Pro | CN 达梦数据库下载地址 产品下载 | 达梦数据库 (dameng.com) 银河麒麟下载地址 国产操作系统、银河麒麟、中标麒麟、开放麒麟、星光麒麟——麒麟软件官方网站 (kylinos.cn) 二 安装 虚拟机安装 https://www.cnblogs…

python+selenium 定位到元素,无法点击的解决方法

今天小编就为大家分享一篇pythonselenium 定位到元素,无法点击的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 selenium.common.exceptions.WebDriverException: Message: Element is not clickable at point (234.75, 22)…

【JavaScript 漫游】【017】异步操作概述

文章简介 本文为【JavaScript 漫游】专栏的第 017 篇文章,主要记录了 ES5 规范中异步操作的基本知识点。 单线程模型同步任务和异步任务任务队列和事件循环异步操作的模式 单线程模型 单线程模型指的是,JS 只在一个线程上运行。它同时只能执行一个任…

Mysql如何优化数据查询方案

mysql做读写分离 读写分离是提高mysql并发的首选方案。 Mysql主从复制的原理 mysql的主从复制依赖于binlog,也就是记录mysql上的所有变化并以二进制的形式保存在磁盘上,复制的过程就是将binlog中的数据从主库传输到从库上。 主从复制过程详细分为3个阶段…

每日OJ题_二叉树dfs②_力扣129. 求根节点到叶节点数字之和

目录 力扣129. 求根节点到叶节点数字之和 解析代码 力扣129. 求根节点到叶节点数字之和 129. 求根节点到叶节点数字之和 难度 中等 给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字&am…

基于Windows搭建ftp服务器

WinR搜索’服务器管理器’,配置–用户和组 创建用户和组,将用户添加到组里 按图示创建一个文件,右键属性–安全 将刚才创建的组添加到对象里,并赋予他读取和写入的权限 角色–添加角色 勾选web服务器IIS 搜索IIS–网站右键–添加FTP站点…

【软考中级备考笔记】计算机体系结构

计算机体系结构 2月19日 – 天气:阴转小雪 1. 冯诺依曼计算机体系结构 冯诺依曼将计算机分为了五大部分,分别是: 控制器:主要负责协调指令到执行运算器:负责算数和逻辑运算存储器:负责存储在指令执行过程…

全网最 2024 GitHub Copilot超详细免费激活教学-干货

全网最🔥 2024 GitHub Copilot免费超详细激活教学 尊重原创,编写不易 ,帮忙点赞关注一下~转载小伙伴请注明出处!谢谢 GitHub Copilot 概述 GitHub Copilot 是由 GitHub 和 OpenAI 合作开发的一款人工智能编程助手。它利用机器…

JS基础(语法结构变量数据类型运算符流程控制)

JS基础(语法结构/变量/数据类型/运算符/流程控制) 目录 JS基础(语法结构/变量/数据类型/运算符/流程控制)什么是js?注释语法语法结构引入方式【1】script标签内部直接书写js代码【2】script标签src属性引入外部js代码 JS基础数据类型变量与常量变量的定义常量的定义…

ONLYOFFICE 8.0:引领数字化办公新纪元

目录 前言 软件安装 软件启动 软件新版本特性 个人评价 总结 前言 在当今快节奏的数字化世界中,高效的办公软件已成为企业竞争力的关键因素。ONLYOFFICE,作为全球领先的办公解决方案提供商,始终致力于通过技术创新来优化用户体验。如今…

Java使用Redis实现消息队列

近期刷Java面试题刷到了“如何使用Redis实现消息队列”,解答如下: 一般使用 list 结构作为队列, rpush 生产消息, lpop 消费消息。当 lpop 没有消息的时候,要适当sleep 一会再重试。若不使用sleep,则可以用…

【力扣 - 二叉树的最大深度】

题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 提示&#xff1a; 树中节点的数量在 [0, 10^4] 区间内。 -100 < Node.val < 100方法一&#xff1a;深度优先搜索 思路与算法 如…

Rust中不可变变量与const有何区别?

Rust作者认为变量默认应该是immutable&#xff0c;即声明后不能被改变的变量。这一点是让跨语言学习者觉得很别扭&#xff0c;不过这一点小的改变带来了诸多好处&#xff0c;本节我们来学习Rust的变量。 什么是变量&#xff1f; 如果你初次学习编程语言&#xff0c;变量会是一…

使用go-llama.cpp 运行 yi-01-6b大模型,使用本地CPU运行,速度挺快的

1&#xff0c;视频地址 2&#xff0c;关于llama.cpp 项目 https://github.com/ggerganov/llama.cpp LaMA.cpp 项目是开发者 Georgi Gerganov 基于 Meta 释出的 LLaMA 模型&#xff08;简易 Python 代码示例&#xff09;手撸的纯 C/C 版本&#xff0c;用于模型推理。所谓推理…