如何调整VirtualBox vmdk文件的大小

561

我在虚拟机磁盘(vmdk格式)上的空间用尽了,需要调整虚拟镜像大小。使用如下命令进行调整:

vboxmanage modifyhd Machine-disk1.vmdk --resize 30720

显示以下错误信息:

Progress state: VBOX_E_NOT_SUPPORTED
VBoxManage: error: Resize hard disk operation for this format is not implemented yet!

如何调整vmdk镜像的大小?

15个回答

832

如果您想重新获得一个vmdk硬盘(也许您有兴趣在vwmare中使用该硬盘),则完整的步骤如下:

VBoxManage clonemedium "source.vmdk" "cloned.vdi" --format vdi
VBoxManage modifymedium "cloned.vdi" --resize 51200
VBoxManage clonemedium "cloned.vdi" "resized.vmdk" --format vmdk

上述操作将把硬盘大小调整为50GB(50 * 1024MB)。

完成此操作的话,您还需要调整驱动器的大小!为了实现这一点,您可以下载gparted iso文件并从该文件启动以调整驱动器的大小(在virtualbox设置中选择iso文件)。

附言:如果您的新大小太小,即使使用新的vdi文件也会出现相同的错误。


17
这个方法有效!我想补充说,您也可以跳过第三步,并将磁盘保留为VDI格式。我刚使用Oracle 12c镜像完成了这个过程,没有第三步也可以正常运行。只需在设置中用克隆的VDI替换旧的“硬盘”即可。此外,别忘了使用Gparted调整大小,然后就可以开始使用了! - Avindra Goolcharan
15
对于尚未将VirtualBox添加到PATH变量的Windows用户,请记得切换到Virtual Box目录以使用VBoxManage程序,例如:“cd C:\ Program Files \ Oracle \ VirtualBox”。 - Cleanshooter
2
我已经将来自我的SSD的vm文件建立了符号链接到一个大的SSD上。我不得不指定符号链接路径VBoxManage clonehd“〜/path/to/symlink/packer-centos-6.5-x86_64-disk1.vmdk”“/media/k0pernikus/thatFatSlowDisk/cloned_packer-centos-6.5-x86_64-disk1.vdi”如果您指定实际路径,由于VBox认为它已在其他地方定义,命令将崩溃,出现“VBoxManage:error:Cannot register the hard disk”。 - k0pernikus
2
哇,我浪费了数小时的时间尝试和研究为什么 clonehed 会创建不受 --resize 支持的卷。原来在 clonehd 后面添加 --format vdi 是至关重要的! - datv
5
在更换原始驱动器后,UUID不匹配。 VirtualBox 5.1.12无法自动更新UUID。我必须从已知硬盘列表(文件->虚拟媒体管理器)中删除硬盘,然后将其重新添加到实例中。 - Chaim Eliyah
显示剩余10条评论

203

我能通过克隆vmdk文件并修改和调整大小来改变其大小。

vboxmanage clonehd "virtualdisk.vmdk" "new-virtualdisk.vdi" --format vdi
vboxmanage modifyhd "new-virtualdisk.vdi" --resize 30720

4
谢谢这个信息。对于在Windows上尝试运行此命令时出现“VBoxManage.exe: error: Code CO_E_SERVER_EXEC_FAILURE (0x80080005)”错误的人,请以非管理员身份运行命令提示符。 - Jim
4
@BradFJacobs,当然可以。毕竟这是合乎逻辑的事情。:P - Paul Draper
4
这将把文件保留为VDI格式,但并没有回答Brian的问题:“我如何调整vmdk镜像大小?” - user66001
注意,在调整 vmdk 文件大小后,您需要通过引导您的 VM(例如 gparted-live)来扩展分区。 - stephanfriedrich
好的...现在我有了.vdi文件,但是我该怎么办? - PeterOeClausen
显示剩余4条评论

48

我在Mac主机上有一个Windows 7客户端,这篇文章非常有用。谢谢。

我想补充一点,我没有使用gparted。我的做法是:

  1. 启动新的扩展vmdk映像。
  2. 转到开始菜单,右键单击计算机并选择管理。
  3. 点击磁盘管理
  4. 您应该会看到(在我的情况下)C驱动器上的一些灰色空间。
  5. 右键单击C驱动器并选择扩展卷。
  6. 选择大小并继续

太好了!我更喜欢这种方法,而不是使用第三方工具(带有数据丢失警告)。

干杯!


35

vmdk's :

  • 固定大小的分配(步骤1、2)。
  • 即使扩展后,在vmdk的操作系统内也不容易使用(步骤3、4、5)

步骤:

1) 首先转换为“.vdi”- VBoxManage clonehd v1.vmdk v1.vdi --format vdi

2) 使用命令行扩展大小(参考:tvial's博客以获得逐步信息)

或者

从VirtualBox中的虚拟媒体管理器扩展。

[现在-在VM内部]

3) 扩展驱动器的大小,使用新的分配(例如,对于在虚拟机上运行的Ubuntu:使用GParted

enter image description here enter image description here

4) 扩展文件系统 - lvextend -L +50G <file-system-identifier>

说明:

$ lsblk
NAME                       MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
...
sda                          8:0    0   200G  0 disk 
└─sda1                       8:1    0   200G  0 part 
  ├─myfs-vg-cloud          253:0    0    99G  0 lvm  /
  └─myfs-vg-swap-1         253:1    0   980M  0 lvm  [SWAP]


$ lvextend -L +100G /dev/mapper/myfs-vg-cloud

$ lsblk
NAME                       MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
...
sda                          8:0    0   200G  0 disk 
└─sda1                       8:1    0   200G  0 part 
  ├─myfs-vg-cloud          253:0    0   199G  0 lvm  /
  └─myfs-vg-swap-1         253:1    0   980M  0 lvm  [SWAP]

5) 扩大"/home" - resize2fs <文件系统标识符>

说明:

$ df -h /home/
Filesystem                        Size  Used Avail Use% Mounted on
/dev/mapper/myfs-vg-cloud         97G   87G  6.0G  94%   /

$ resize2fs /dev/mapper/myfs-vg-cloud

$ df -h /home/
Filesystem                        Size  Used Avail Use% Mounted on
/dev/mapper/myfs-vg-cloud         196G   87G  101G  47%  /

您的系统现在应该准备就绪,具有扩展分配!


VBoxManage 明显无法胜任此任务,我认为您混淆了 VDI 和 VMDK 文件格式。 - benathon
没有任何困惑,请查看链接。必须将VMDK转换为VDI进行处理。 - tvial
@tvial - 不幸的是,据我所知,将VMDK转换为VDI的过程将丢失您拥有的任何快照,这对许多人来说是不可接受的。因此,仅仅声明它“解决了问题”有点夸张。 - Jules
@Jules,我的回答与问题有关。Brian试图使用VBoxManage,我不仅仅是在说它可以使用。我花了几个小时写了一篇带有截图的逐步博客文章。你说得对,可能会有关于快照的遗漏信息。 - tvial
当然,但这并不是最佳解决方案。提供建议使用软件调整VMDK大小而无需转换为VDI的答案(例如@micwallace和@davidehrman提供的答案)对于许多人来说显然是更好的解决方案(原始提问者是否属于其中之一并不清楚)。 - Jules

31

实际上,只需要这些命令:

VBoxManage clonehd "source.vmdk" "cloned.vdi" --format vdi
VBoxManage modifyhd "cloned.vdi" --resize 51200

然后,在Virtualbox GUI存储中选择cloned.dvi。

之后,按照Code Chops的方法启动虚拟Windows并扩展C盘。

无需将*.vdi文件转换回*.vmdk文件。


23

由于这是一个vmdk文件,如果您的平台可用,您可以使用VMWare的vdiskmanager。VMWare有x86 Linux、Windows和OS X版本(在右侧附件中查看)

然后您只需执行以下操作:

1023856-vdiskmanager-windows-7.0.1.exe -x 30720M Machine-disk1.vmdk

它避免了克隆和扩展磁盘的步骤。现在,缺点是您需要额外的工具,并且vmdk是VMware的磁盘格式,而您仍在使用Virtualbox,因此可能存在不兼容性。

qemu-img也可能有效,但我不确定它是否支持调整vmdk文件的大小。它将类似于:

qemu-img resize Machine-disk1.vmdk +8G

提醒一下,在使用这些工具调整磁盘大小后,您仍需要扩展分区。所有这些工具本质上都是 dd if=/dev/old_disk of=/dev/new_disk bs=16M


下载vdiskmanager的链接对我来说不起作用。我从https://download3.vmware.com/software/fusion/file/VMware-Fusion-11.5.1-15018442.dmg下载了VMWare Fusion试用版,然后挂载了.dmg文件。然后可以在/Volumes/VMware\ Fusion/VMware\ Fusion.app/Contents/Library/vmware-vdiskmanager找到vdiskmanager工具。 - user674669

18

尝试了这里的所有解决方案,但似乎都没有效果。经过数小时的挖掘,我发现了这篇博客文章,就像魔法一样,一切都有效了。我需要做一些小调整,所以这是修改后的版本。测试使用的Docker版本为17.06.0-ce,构建版本为02c1d87。

一旦开发人员真正开始容器化他们的应用程序,他们通常会生成大量的镜像,并迅速填满默认分配给Docker虚拟机的20GB硬盘空间。为确保Docker虚拟机有足够的磁盘空间,我们应该将/dev/sda1的大小调整为更合理的数字。

  1. 下载GParted Live CD/USB/HD/PXE Bootable Image
  2. 停止Docker虚拟机docker-machine stop default

  3. Boot2Docker软件包安装程序附带有一个VMDK卷,VirtualBox的本地工具无法调整其大小。为了调整Docker磁盘容量,首先克隆默认VMDK卷的VDI卷vboxmanage clonehd /full/path/to/disk.vmdk /full/path/to/disk_resized.vdi --format VDI --variant Standard

  4. 将新克隆的VDI卷调整为所需容量。我们建议至少使用64GB vboxmanage modifyhd /full/path/to/disk_resized.vdi --resize <size in MB>
  • 打开VirtualBox应用程序,选择 default 虚拟机并点击顶部的“设置”齿轮图标。VirtualBox Manager
  • 点击“存储”图标。移除默认的VMDK卷。enter image description here
  • 添加新的IDE控制器。IDE controller
  • 通过“添加CD/DVD设备”选项挂载GParted ISO。Add CD/DVD Device
  • 通过“添加CD/DVD设备”选项挂载克隆的VDI卷。Mount volume
  • 如果您正在使用固态硬盘计算机上运行Docker,请确保为克隆的VDI卷选择了“固态硬盘”选项。Solid-state Drive
  • 点击“开始”图标启动Docker虚拟机,它将启动GParted ISO。选择“GParted Live(默认设置)”。GParted Live(默认设置)
  • 将键映射的处理策略设置为“不更改键映射”。keymaps
  • 将语言偏好设置为选项“33”,该选项映射到“美国英语”。美国英语
  • 选择选项“1”运行“Forcevideo”并手动配置X。Forcevideo
  • 通过选择选项“2”保留默认分辨率“1024×760”。1024×760
  • 保留默认的“vesa”作为VGA卡。如果需要默认设置,请留空
  • 通过选择选项“0”来保持默认的“24”色深度。 Colour depth
  • 启动GParted后,单击“Resize/Move”图标。 GParted
  • 通过拖动滑块将新磁盘卷大小设置为所需大小。在此示例中,最大大小为127,035MB。单击“Resize/Move”按钮开始此过程。Disk volume size
  • 单击“Apply”按钮确认调整大小操作。 Bake it
  • 在调整大小操作完成后关闭计算机电源。 Hard reset, np :)
  • 删除GParted ISO文件。 Your almost done
  • 登录Docker虚拟机,通过启动命令docker-machine start default来验证卷的调整大小是否成功。
  • 如果您遇到网络问题,请重新启动 Docker Machine

  • 15

    您可以使用Vmware播放器来调整vmdk的大小。这将消除往返转换(在其他帖子中注意到),如果您想保持vmdk格式,那么就不需要进行转换。只需确保在将vmdk添加到vmware时,当提示时不要单击升级格式,保留当前格式以防VirtualBox无法接受它。


    11

    为了缩小图像大小,我使用以下步骤:

    1. 在客户端机器上运行 cat /dev/zero > z;sync;sleep 3;sync;rm -f z
    2. 关闭客户端机器
    3. 在主机上运行 VBoxManage clonehd "source.vmdk" "cloned.vdi" --format vdi
    4. 在主机上运行 VBoxManage modifyhd cloned.vdi --compact
    5. 在主机上运行 VBoxManage clonehd "cloned.vdi" "resized.vmdk" --format vmdk

    注意:已保留原文中的HTML标签。

    11

    如 Luca 在 回答 中所提到的,需要执行以下步骤:

    1. 将 VMDK 镜像克隆为 VDI 格式

      VBoxManage clonehd "source.vmdk" "cloned.vdi" --format vdi

    2. 调整 VDI 镜像大小

      VBoxManage modifyhd "cloned.vdi" --resize 51200

    3. 再次克隆回 VMDK 格式

      VBoxManage clonehd "cloned.vdi" "resized.vmdk" --format vmdk

    如果可以使用 VDI 镜像,则步骤 3 是可选的。

    所有这些步骤也可以在 VirtualBox 图形用户界面中进行,在 文件 -> 虚拟介质管理器 下选择要克隆的驱动器,然后选择 复制。会打开一个对话框,允许您选择磁盘格式和选项。要调整 VDI 镜像的大小,只需使用底部的滑块(如果不可见,请单击 属性)。

    最后,您可能还需要在客户机操作系统中更改磁盘大小:

    1. 运行客户机操作系统并调整磁盘分区大小。如果您正在运行 Linux,则可以使用 gpartedkparted

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接