VMware Workstation:如何减少.vmdk的最大大小


27

我有一个150 GB的磁盘文件(.vmdk,未预先分配),用于存储我的虚拟机。

该文件当前为20 GB,但是即使我没有在来宾文件系统中存储任何新内容,它仍在每天增长。

我一直在寻找减少这种磁盘最大大小的方法,以使它永远不会达到150 GB(我想将限制设置为30 GB,然后看看VM达到此大小会发生什么) 。

我尝试过的

  • 使用VMware Converter转换磁盘映像→不起作用,该工具仅允许创建完整副本或“链接克隆”。
  • 创建所需大小的新空白虚拟机以便将20GB数据复制到新的.vmdk→我找不到执行复制的方法,甚至无法将新磁盘连接到现有VM(因此我使用来宾操作系统)。
  • 查看.vmx文件以检查最大大小是否未以纯文本设置(不是)。

尽管此任务从技术上看似乎很简单(没有棘手的缩小,只是大小限制的简单更改),但我在这里真的没有主意...

是否有解决方案?


1
由于虚拟磁盘上的分区很可能是在创建来填充广告空间的,因此确实涉及“微缩”。
Daniel B

Answers:


25

减小.vmdk磁盘大小的常用步骤是:

  1. 通过来宾对磁盘进行碎片整理,选择一种碎片整理模式,该模式可在磁盘末端合并空白空间。对于Windows guest虚拟机,应清空回收站并关闭休眠和分页功能,在完成碎片整理后将其返回。

  2. 将磁盘上所有未使用的空间归零。
    对于Windows使用sdeletesdelete -c
    对于Linux: dd if=/dev/zero of=/mytempfile && rm -f /mytempfile

  3. 收缩磁盘(可能需要很长时间才能完成)。
    VMware Workstation:菜单VM /管理/清理磁盘。
    或使用:vmware-vdiskmanager.exe -k [VMDK PATH]
    对于ESX: vmkfstools --punchzero [VMDK PATH]

将磁盘从可增长磁盘转换为预分配磁盘可能会阻止其增长。可以使用vmware-vdiskmanager及其-t参数值为:

0 : single growable virtual disk
1 : growable virtual disk split in 2Gb files
2 : single preallocated virtual disk
3 : preallocated virtual disk split in 2Gb files

以下命令会将.vmdk从可增长转换为预分配:

vmware-vdiskmanager -r current_disk_name.vmdk -t 3 new_disk_name.vmdk

如果您希望更改磁盘的大小,则应在磁盘仍为可增长格式时执行此操作(此处为示例)。

有关更多信息,请参见《 Virtual Disk Manager用户指南》


2
但是,这不会减小内部公布的驱动器大小。
Daniel B

@DanielB:不,它不会减小最大大小,只是减小物理大小。减小最大大小可能很危险,因为某些操作系统如果没有系统磁盘上的可用空间就无法启动。
harrymc

3
这是我用来减少VMDK占用空间的有用技术。但是,这并不能完全解决我的问题,就好像我想一直将VMDK保持在30GB以下一样,我将不得不定期重复该操作(这确实需要很长时间)。
塞巴斯蒂安

如果始终可以将磁盘缩小到所需的大小,这意味着上述过程始终可以减小大小,那么将来可以通过将磁盘转换为固定大小来限制大小。
哈里姆克(Harrymc)2014年

1
@harrymc将磁盘转换为固定大小将适合我的需求。我只是没有找到使用VMWare Workstation或Converter进行此操作的方法。
塞巴斯蒂安2014年

6

该文件目前为20GB,但它每天都在增长,即使我没有在来宾文件系统中存储任何新内容。

由于操作系统及其应用程序会临时使用大量磁盘空间来存储临时文件,页面文件,休眠文件和配置文件。一旦根据操作系统的策略将其删除,则下次将使用磁盘上的新扇区。每当虚拟磁盘中使用新扇区时,VM就会从实际磁盘为虚拟磁盘分配存储。由于来宾OS始终不重用虚拟磁盘上的扇区,因此VM认为其磁盘使用情况并从实际磁盘中分配空间,这将导致虚拟磁盘映像增长。

您的问题标题不太可能解决,因为使用此类工具而不检查图像可能会导致整体灾难。但是您可以防止图像增长到30GB以上。有很多方法可以实现目标。

答:仅使用30GB分区,剩下的留为可用空间。如果已经分区了更多空间,则需要缩小/删除它,创建一个新分区,然后将其转储为零,然后按@harrymc的说明进行打孔。由于从未使用的未分区区域中的空间,虚拟磁盘将永远不会超过30GB。

B.创建快照并在使用后还原到快照。创建快照VM之后,将数据存储到新的映像文件中。如果还原到该数据库,而不保存或制作新的快照,则所有更改的数据都将被删除,从而释放空间。

C.创建一个最大30GB的新虚拟磁盘,将其作为新磁盘添加到当前虚拟机中,使用备份工具将所有数据移至新虚拟磁盘。您可以使用实时Linux进行克隆。

推荐选项是A


2

为什么不简单地将涉及的磁盘大小从150GB设置为30GB。

您必须将所有分区的总和设置为小于30GB。您必须随身缩小分区的大小。这个站点上有很多关于如何缩小分区的文档,因此我不再在此重复。

如果您没有足够的空间来支持最大大小,为什么还要创建一个150GB(瘦分区)?好像是自找麻烦。


5
我没有亲自创建VM,这就是为什么。
塞巴斯蒂安2013年

如何缩小磁盘本身?我的磁盘中的分区缩小了,但是vdiskmanager.exe -k [VMDK PATH]在另一个答复中建议不要缩小驱动器。
亚伦·弗兰克

问题尚未明确记录,是如何调整vmdk设备的大小(当然,在调整分区大小之后)。另外@mdpc我认为您的答案没有建设性。在很多情况下,您需要在现有 vm 上调整数据大小,因此没有必要指望应该正确创建VM。
basos

2

使用VMWare Converter创建新的VM和较小的VMDK,然后将原始VMDK转换为新创建的较小的VMDK,是一种绕行方式。

缩小VMDK

详细步骤在这里

请注意,对VMDK大小的任何更改也将需要对分区表进行相应的更新


这是VMWare Workstation VM,Converter不为此类VM提供这些高级复制选项。它只是不允许我更改磁盘的大小。
塞巴斯蒂安

2

该功能仅适用于稀疏VMDK(非预分配) 。在缩小之前需要进行碎片整理,以确保已用空间是连续的

在Windows中进行碎片整理

在Windows虚拟机中,必须首先从Windows内部运行磁盘碎片整理。Windows中的碎片整理可确保所有使用的空间都是连续的。然后,您可以减小虚拟磁盘的大小。

缩小虚拟磁盘

收缩虚拟磁盘:

打开VMware Tools控制面板/工具箱:

在Windows中:

双击系统任务栏中的VMware Tools图标,或单击开始>控制面板> VMware Tools。

在Linux中:

打开终端并运行以下命令:

vmware-工具箱

注意:在Workstation 9.x(Windows)及更高版本中,清理磁盘时会自动完成收缩。因此,此选项已从VMware Tools面板中删除。转到虚拟机>管理>清理磁盘。Linux版本的VMware Workstation 9.x和更高版本中不提供此功能。

单击收缩选项卡。选择要缩小的驱动器。单击准备收缩,然后按照屏幕上的说明进行操作。注意:磁盘收缩时,请勿关闭虚拟机或主机。另外,请勿尝试取消该过程。中断此过程可能会对您的虚拟磁盘造成无法修复的损害,并且您可能无法再次启动虚拟机。

VMWare知识库


首先阅读现有答案可以避免重复的答案。
哈里麦克(Harrymc)2014年

1
抱歉,无论如何我都将其完整的过程和来源重新发布了。这可以帮助他更多
贾拉勒·穆斯塔法

也不回答op。OP希望缩小最大限制,而不是当前大小。
Ryuu

2

@harrym的答案很好,但实际上并不能回答问题。OP希望减小最大尺寸。问题是管理程序不知道操作系统确实使用了多少显示大小(即最大大小)。压缩(vmware-vdiskmakager -k)适用于可增长的vmdk。它对预分配的对象不起作用。

因此,缩小磁盘的步骤是:

  1. 通过操作系统或合适的实时CD调整磁盘上分区的大小
  2. 调整vmdk设备的大小,仔细选择边界以免削减任何可用的分区空间。您总是可以在图像中留下比实际需要更多的空间。

第一步涉及到VM内部的过程,并随来宾OS的不同而不同。vmware命令可以支持第二步,但是我还没有找到一种深刻的方法。因此,骇人听闻的方法。

这是一个不太快(由于涉及大量数据移动)和肮脏的解决方案的窍门。我们将需要具有等于最大设备大小的可用空间

警告:切记在执行任何操作之前备份重要数据!

  1. 找到一种方法来调整来宾分区的大小,并在设备末尾保留未分配的空间。两个例子:

    在来宾操作系统中:Windows 7

    1. 您可以使用在线调整大小功能。首先从Quest OS内对磁盘进行碎片整理是一个好主意。
    2. 运行diskmgmt.msc,在要调整大小的磁盘上选择分区(卷),右键单击->“缩小卷”。在出现的对话框中,根据您的要求减小尺寸。请注意,由于该分区正在使用中(如果它是系统磁盘,或者是碎片很大的分区),您可能无法恢复大部分可用空间。准备留下额外的可用空间。
    3. 现在我们想知道以磁盘扇区(或字节)结尾的分区。假设这是设备上的唯一分区,我们采用我计算机上显示的卷的大小->选择磁盘->右键单击->属性->容量:请注意字节数。(例如在我的示例中为99.9GB的107371032576)。为了安全起见,添加几百兆(+204800)(例如107371237376)。为确保我们不需要添加任何丢失的东西,我们可以使用diskpart cmd行实用程序来查找分区从设备开始处的偏移量。然后运行diskpart:列出磁盘,选择磁盘ID,列出部分,选择部件ID,详细信息。例:

    DISKPART>详细部分

    分区1

    字节偏移量:1048576

    确保至少在磁盘大小上添加此数字。现在,我们需要将字节转换为除以512并向上舍入(上限)的扇区。例如209709448。在第3步中记下该数字。

    通过现场CD:SystemResqueCD

    1. 或者,您可以使用resque cd,(我建议使用SystemResqueCD),下载可引导的ISO,将其作为虚拟cd rom设备安装到VM上,从CD引导(通过按VMWare引导屏幕上的Esc键,您可能需要尝试有时会很快出现)。当到达命令提示符类型:startx时,希望可以将您带到图形界面。
    2. 进入systemresque的桌面后,启动gparted(例如从终端)。找到要调整大小的分区(必须将其彻底卸载,如果有疑问,请从客户机操作系统中扫描磁盘)。调整大小,仔细规划您的空间需求。
    3. 同样,我们需要找到分区的扇区(或字节)中的结束偏移量。打开终端并写入分区的[ 设备 ],然后以单位s打印。例如

编号开始结束大小类型文件系统标志

1 2048s 113455103s 113453056s主ntfs引导

记下结束扇区并添加1。例如113455104。请记下此数字以用于步骤3。

  1. 由于该骇客攻击已预先分配的单个文件(类型2)vmdks(尚未尝试多种文件类型),因此我们首先将可增长文件转换为预先分配的文件。我们将临时需要一个具有物理空间的分区作为设备的最大大小。(例如150GB)。

    vmware- vdiskmanager.exe -r 源vmdk -t 2 destvmdk

  2. 现在棘手的部分,对于预分配的磁盘,应该有2个vmdks

    disk.vmdk disk-flat.vmdk

    前者只有KB长,而后者则保留数据。在VMWare工作站关闭时打开第一个(disk.vmdk),然后打开文本编辑器(我的建议是Notepad ++)。找到线

    RW 113455104 FLAT“ Windows 7_x64-fl-flat.vmdk” 0

    是的,您知道了,第二个字段是为设备分配的扇区数。作为验证,请乘以512并找到以字节为单位的大小,然后除以1073741824(1024 ** 3)以找到以GB为单位的大小。这应该是先前设备的大小。

    现在,用第一步中记录的编号替换该编号,然后保存文件。警告:这是一个错误,您可能最终会修剪文件系统上使用的实际数据。(但是我们在设备开头调整了fs的大小,并进行了正确和安全的计算,对吗?)

  3. 到目前为止,尚未触及任何数据。完成最后一步,以实际修剪延伸。我们将使用vmware-vdiskmanager的重命名功能来重新创建已减小大小的vmdk。

    vmware- vdiskmanager.exe -n destvmdk 源vmdk


0

对于vmware linux guest虚拟机操作系统,请运行:

sudo vmware-toolbox-cmd disk shrinkonly

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.