我有一个 150 GB 的磁盘文件(.vmdk,非预分配),用于存储我的虚拟机。
该文件目前为 20 GB,但它每天都在增长,即使我没有在客户文件系统中存储任何新内容。
我已经花了几个小时寻找一种方法减少此磁盘的最大大小,这样它就永远不会达到 150 GB(我想将限制设置为 30 GB,看看当虚拟机达到这个大小时会发生什么)。
我已尝试过:
- 使用 VMware Converter 转换磁盘映像 → 这不起作用,该工具仅允许创建完整副本或“链接克隆”。
- 创建一个所需大小的新空白虚拟机以便将 20GB 数据复制到新的 .vmdk → 我找不到执行复制的方法,甚至无法将新磁盘连接到我现有的虚拟机(以便我使用客户操作系统执行复制)。
- 查看 .vmx 文件以检查是否未以纯文本设置最大大小(事实并非如此)。
虽然这个任务在技术上看起来很简单(没有涉及棘手的缩小,只是简单地改变尺寸限制),但我真的没有主意了......
有没有什么解决办法?
答案1
减少 .vmdk 磁盘大小的常用方法是:
通过客户机对磁盘进行碎片整理,选择一种碎片整理模式,将磁盘末尾的空白空间合并在一起。对于 Windows 客户机,您应该清空回收站并关闭休眠和分页,在碎片整理完成后将其恢复。
将磁盘上所有未使用的空间清零。
对于 Windows,请使用删除:sdelete -z
将可用空间清零。
对于 Linuxdd if=/dev/zero of=/mytempfile && rm -f /mytempfile
:。缩小磁盘(可能需要很长时间才能完成)。VMware
Workstation:菜单 VM / 管理 / 清理磁盘。
或者使用:vmware-vdiskmanager.exe -k [VMDK PATH]
。
对于 ESXvmkfstools --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
如果你想改变磁盘的大小,应该在磁盘仍处于可增长格式时进行(示例这里)。
更多信息请参阅 虚拟磁盘管理器用户指南。
答案2
该文件目前为 20GB,但它每天都在增长,即使我没有在客户文件系统中存储任何新内容。
因为操作系统及其应用程序会临时使用大量磁盘空间来存储临时文件、页面文件、休眠文件和配置文件。一旦删除这些文件,根据操作系统的策略,下次将使用磁盘上的新扇区。每当虚拟磁盘中使用新扇区时,虚拟机都会从实际磁盘为虚拟磁盘分配存储空间。由于虚拟磁盘上的扇区始终不会被客户操作系统重用,因此虚拟机会认为这是磁盘使用情况,并从实际磁盘中分配空间,这将导致虚拟磁盘映像不断增大。
您的问题标题不太可能得到解决,因为使用这样的工具而不检查图像可能会导致彻底的灾难。但您可以防止图像超过 30GB。有很多方法可以实现目标。
A. 仅使用 30GB 分区,其余留作可用空间。如果您已经分区了更多空间,则需要缩小/删除它,然后创建一个新分区,然后将其转储为零并按 @harrymc 所述将其打孔。由于未分区区域中的空间从未使用过,因此虚拟磁盘永远不会超过 30GB。
B. 创建快照并在使用后恢复到该快照。创建快照后,VM 将数据存储到新的映像文件中。如果您恢复到该快照,而不保存或制作新的快照,则所有更改的数据都将被删除,从而释放空间。
C. 创建一个最大 30GB 的新虚拟磁盘,将其作为新磁盘添加到当前虚拟机中,使用备份工具将所有数据移动到新虚拟磁盘。您可以使用实时 Linux 进行克隆。
建议选项是 A
答案3
@harrym 的回答很好,但实际上并没有回答问题。原帖者想要减少最大尺寸。问题是虚拟机管理程序不知道操作系统实际使用了多少显示的大小(即最大大小)。压缩(vmware-vdiskmakager -k)适用于可增长的 vmdk。它对预分配的 vmdk 不执行任何操作。
因此缩小磁盘的步骤如下:
- 通过操作系统或合适的实时 CD 调整磁盘分区的大小
- 调整 vmdk 设备的大小,仔细选择边界,不要削减任何可用的分区空间。您总是可以在映像中留下比实际需要更多的空间。
第一步涉及虚拟机内部的一个过程,并随客户操作系统而变化。第二步可以由 vmware 命令支持,但我还没有找到一种深刻的方法来实现这一点。因此,这是一种黑客方法。
这是一个不太快(由于涉及大量数据移动)且肮脏的解决方案,但却起了作用。我们需要有等于最大设备大小的可用空间。
警告:请记住在任何操作之前备份重要数据!
找到一种方法来调整客户分区的大小,并在设备末尾留下未分配的空间。两个例子:
从客户操作系统:Windows 7
- 您可以使用在线调整大小功能。最好先在任务操作系统内对磁盘进行碎片整理。
- 运行 diskmgmt.msc,选择要调整大小的磁盘上的分区(卷),右键单击->缩小卷。在出现的对话框中,根据您的要求缩小大小。请注意,由于分区正在使用中(如果它是系统磁盘,或者碎片严重),您可能无法恢复大部分可用空间。预留额外的可用空间。
- 现在我们想知道分区以磁盘扇区(或字节)结尾。假设这是设备上的唯一分区,我们取我的电脑上显示的卷大小->选择磁盘->右键单击->属性->容量:记下字节数。(例如,在我的示例中,107371032576 表示 99.9GB)。为安全起见,请添加几百兆(+204800)(例如 107371237376)。为确保不需要添加任何缺失的内容,我们可以使用 diskpart cmd 行实用程序从设备开始处查找分区的偏移量。运行 diskpart 然后:列出磁盘,选择磁盘ID、列出部分、选择部分ID,详细信息。例如:
DISKPART>详细部分
分区 1
偏移量(以字节为单位):1048576
确保至少将此数字添加到磁盘大小中。现在我们需要将字节转换为扇区,除以 512 并向上舍入(上限)。例如 209709448。请记下此数字以用于步骤 3。
通过实时 CD:SystemResqueCD
- 或者,您可以使用 resque cd,(系统恢复光盘是我的建议),下载可启动 ISO,将其作为虚拟 CD-ROM 设备安装到您的 VM 上,从 CD 启动(通过在 VMWare 启动屏幕上按 Esc 键,您可能需要尝试几次,因为它出现得非常快)。到达命令提示符时输入:startx,这有望将您带到图形界面。
- 进入 systemresque 桌面后,启动 gparted(例如从终端启动)。找到要调整大小的分区(必须彻底卸载该分区,如果有疑问,请从客户操作系统执行磁盘扫描)。调整大小,仔细规划您的空间需求。
- 再次,我们需要找到分区的扇区(或字节)的结束偏移量。打开终端并输入 parted [设备],然后单位 s,打印。例如
编号 起始 结束 大小 类型 文件系统 标志
1 2048s 113455103s 113453056s 主 ntfs 启动
记下结束扇区并加 1。例如 113455104。记下此数字以供步骤 3 使用。
由于该 hack 适用于单个文件预分配(类型 2)vmdk(尚未尝试过多种文件类型),我们首先将可增长文件转换为预分配文件。我们将暂时需要一个具有物理空间作为设备最大大小的分区。(例如 150GB)。
vmware-vdiskmanager.exe -r源vmdk-t 2目标视频存储设备
现在最棘手的部分是,对于预分配的磁盘,应该有 2 个 vmdk
磁盘.vmdk 磁盘平面.vmdk
前者只有 KB 长,后者保存着扩展的数据。打开第一个 (disk.vmdk)当 VMWare 工作站关闭时,使用文本编辑器(我建议使用 Notepad++)。找到以下行
RW 113455104 FLAT “Windows 7_x64-fl-flat.vmdk” 0
是的,您明白了,第二个字段是分配给设备的扇区数。作为验证,乘以 512 并找到以字节为单位的大小,然后除以 1073741824(1024**3)以找到以 GB 为单位的大小。这应该是前一个设备的大小。
现在用第一步中记下的数字替换该数字并保存文件。警告:这里如果出现错误,您最终可能会修剪文件系统上使用的实际数据。(但我们在设备开始时调整了 fs 的大小,并进行了正确且安全的计算,对吗?)
到目前为止,还没有触及任何数据。执行这最后一步来实际修剪扩展。我们将使用 vmware-vdiskmanager 的重命名功能来重新创建 vmdk,其大小现已修剪。
vmware-vdiskmanager.exe -n目标视频存储设备 源vmdk
答案4
有一种迂回的方式使用VMWare 转换器创建一个新的 VM 和更小的 VMDK 大小,然后将原始 VMDK 转换为新创建的更小的 VMDK。
详细步骤这里。
请注意,对 VMDK 大小的任何更改也需要相应的更新分区表。