2014-02-13 22:54:55 +0000 2014-02-13 22:54:55 +0000
72
72

如何在Windows中用modifyhd命令改变固定大小的VDI?

我想知道如何改变VDI文件的大小。我是VirtualBox的新手,我有很多东西要学。但我想我已经掌握了基本的窍门。我已经安装了Windows 7作为我的第一个客人。主机也是Windows 7。我不确定要分配多少磁盘空间,所以我选择了40GB的VDI大小,并且固定大小以提高性能。但是我现在改变了主意,我想再增加10GB。我一直在点击程序,阅读帮助菜单的内容,但没有帮助。它解释了磁盘控制器,SAS,SATA,SCSI,yada,yada,但不是我想要的。

我在世界范围内搜索了一下答案,VirtualBox论坛上说,如果你想用最简单的方法,应该用Gparted(某版主发了一个贴子)。有些用户讨论使用dd命令。但那都是Linux的东西。另外,在SU这里有很多关于增加和减少VDI文件大小的问题,但都是关于使用Linux作为主机,Windows作为客人。

我找到了这个不错的博客帖子,介绍了如何用VBoxManage的modifyhd命令来做。这个家伙也是在Linux作为主机操作系统上做的。他甚至希望他的VDI文件和我的文件大小相同(50 GB),真是太巧了。所以我想无论如何我都要试一试,要么成功,要么失败。有什么可能出错呢……嗯?好吧,这就是我得到的丑陋的惊喜。

C:\Program Files\Oracle\VirtualBox>VBoxManage.exe modifyhd "%userprofile%\virtua
lbox vms\sg2_win7_x64_lab\sg2_win7_x64_lab.vdi" --resize 51200
0%...
Progress state: VBOX_E_NOT_SUPPORTED
VBoxManage.exe: error: Resize hard disk operation for this format is not impleme
nted yet!

C:\Program Files\Oracle\VirtualBox>

现在说什么呢!……不能调整VDI格式的虚拟硬盘大小?你不说?不支持自己的格式?现在怎么…

真的没有简单的方法来改变VDI文件的大小吗,最好是在VirtualBox里面点击几下?有什么进展吗?

答案 (9)

126
126
126
2014-02-15 22:56:20 +0000

摘要:

  • VBoxManage.exe modifyhd --resize可以增加(但不能减少)磁盘映像的逻辑大小(客人操作系统看到的大小)。
  • VBoxManage.exe modifyhd inputfile.vdi --compact 可以减少物理磁盘映像的大小(主机操作系统看到的磁盘上映像文件的大小)。但这不会改变逻辑磁盘的大小。请注意,只有在客户操作系统中的空闲空间已被清零的情况下,这才会起作用。
  • modifyhd 仅适用于动态格式变体(“动态分配的映像”)。
  • modifyhd 仅适用于 VDI 和 VHD 映像格式。
  • 如果您使用快照,您必须从 “快照 "子文件夹中克隆最新的快照VDI。

详情请参见手册中的 8.23. VBoxManage modifyhd


尚未实施减少 VDI 逻辑磁盘大小的原因是为了防止可能发生的数据损坏,您将因此而无法启动虚拟机。因此,当使用--resize选项时,新磁盘大小必须大于当前大小。它不允许小于或等于当前大小。换句话说,一个40GB的磁盘只能调整为41GB或大于41GB,不能调整为40GB(这简直是傻子)或39GB或小于39GB。

旧版本的VirtualBox将VDI文件创建为 "固定 "格式的变量。新的默认设置是在创建新的VDI(虚拟磁盘镜像)文件时创建 "动态 "格式变量。(我猜测这是自引入动态格式变体以来的情况,不管是哪个版本引入的。)

所以,"对该格式的操作尚未实现 "的错误信息意味着你的VDI文件使用了 "固定 "格式变体。要解决这个问题,您必须使用clonehd命令克隆您的VDI文件。要查看你的VDI文件目前是什么格式变体,你可以使用showhdinfo命令。

工作示例

显示当前磁盘的VDI信息.

输入命令。vboxmanage.exe showhdinfo path\inputfile.vdi

C:\Program Files\Oracle\VirtualBox>VBoxManage.exe showhdinfo "%userprofile%\virt
ualbox vms\sg2_win7_x64_lab\sg2_win7_x64_lab.vdi"
UUID: 132e9af1-0428-49f4-bc45-4d84680e17f5
Parent UUID: base
State: created
Type: normal (base)
Location: C:\Users\Name\VirtualBox VMs\sg2_win7_x64_lab\sg2_win7_x64_lab.
vdi
Storage format: VDI
Format variant: fixed default
Capacity: 40960 MBytes
Size on disk: 40962 MBytes
In use by VMs: sg2_win7_x64_lab (UUID: dcd106b3-7ed6-4f19-ad94-820ab4dc10d3)

C:\Program Files\Oracle\VirtualBox>

看到哪里写着 "固定默认 "了吗?这就是为什么当你试图调整它的大小时,它会吐出上面的错误。

将旧的VDI文件克隆到一个新的VDI文件。

输入命令。vboxmanage.exe clonehd path\inputfile.vdi path\outputfile.vdi

C:\Program Files\Oracle\VirtualBox>VBoxManage.exe clonehd "%userprofile%\virtual
box vms\sg2_win7_x64_lab\sg2_win7_x64_lab.vdi" "%userprofile%\virtualbox vms\sg2
_win7_x64_lab\sg2_win7_x64_lab_clone.vdi"
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone hard disk created in format 'VDI'. UUID: 34dafa68-3093-4946-926a-8237ea263
e5c

C:\Program Files\Oracle\VirtualBox>

Voilà! 旧文件现在已经被克隆到一个新文件中。由于新版本的VirtualBox的默认设置是使用 "动态 "格式变体,所以你不必明确地定义它。不过,如果您使用的是旧版本的VirtualBox,那么您可能希望将选项设置为 "动态"(如果有的话),以确保与未来版本的VirtualBox更好的兼容性和/或灵活性。

显示有关克隆磁盘的VDI信息。

输入命令。vboxmanage.exe showhdinfo path\inputfile_clone.vdi

C:\Program Files\Oracle\VirtualBox>VBoxManage.exe showhdinfo "%userprofile%\virt
ualbox vms\sg2_win7_x64_lab\sg2_win7_x64_lab_clone.vdi"
UUID: 34dafa68-3093-4946-926a-8237ea263e5c
Parent UUID: base
State: created
Type: normal (base)
Location: C:\Users\Name\virtualbox vms\sg2_win7_x64_lab\sg2_win7_x64_lab_
clone.vdi
Storage format: VDI
Format variant: dynamic default
Capacity: 40960 MBytes
Size on disk: 7806 MBytes

C:\Program Files\Oracle\VirtualBox>

看到它现在怎么说 "动态默认 "了吗?多么好啊!

(附带说明! 这里之所以说7806 MB是物理大小,是因为我在原始VDI文件上使用了--compact选项,试图强制转换为动态格式变量。只是我在VirtualBox论坛上读到的一些东西,据说在旧版本中也能用,所以我想我不妨试试。没成功)

调整克隆磁盘的大小。

输入命令。vboxmanage.exe modifyhd path\inputfile.vdi --resize 51200

C:\Program Files\Oracle\VirtualBox>VBoxManage.exe modifyhd "%userprofile%\virtua
lbox vms\sg2_win7_x64_lab\sg2_win7_x64_lab_clone.vdi" --resize 51200
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

C:\Program Files\Oracle\VirtualBox>

成功! 没有格式化的废话了。只要记得调整新的、克隆的磁盘的大小,而不是原来的磁盘。请记住,大小是以MB为单位的。我相信你可以使用例如51200以及50G(或者可能是 "GB")。还有一个选项--resizebyte可以用来表示字节的大小。

显示关于调整大小的克隆磁盘的VDI信息。

输入命令。vboxmanage.exe showhdinfo path\inputfile_clone.vdi

C:\Program Files\Oracle\VirtualBox>VBoxManage.exe showhdinfo "%userprofile%\virt
ualbox vms\sg2_win7_x64_lab\sg2_win7_x64_lab_clone.vdi"
UUID: 34dafa68-3093-4946-926a-8237ea263e5c
Parent UUID: base
State: created
Type: normal (base)
Location: C:\Users\Name\virtualbox vms\sg2_win7_x64_lab\sg2_win7_x64_lab_
clone.vdi
Storage format: VDI
Format variant: dynamic default
Capacity: 51200 MBytes
Size on disk: 7806 MBytes

C:\Program Files\Oracle\VirtualBox>

就这样! 从这里开始,你要做的是将这个克隆的驱动器添加为虚拟机的新VDI。你可以在VirtualBox里面进行。我就不多说了。如果你已经能够阅读和理解这些,那么你可能不需要进一步的指导。你可以删除旧的 "固定 "文件,或者留下它作为备份。确保你在删除原源文件之前测试新的VDI文件。

注意!您不会立即看到克隆磁盘的新大小。你必须用它来启动虚拟机,然后你必须使用你的分区管理工具来扩展你的分区以填充虚拟磁盘(或创建更多分区)。对于Windows来说,只要运行diskmgmt.msc,你就可以在里面扩展分区。

Screen Screen

Reference

11
11
11
2014-09-26 15:48:23 +0000

下面是一个相当简单的过程,我在Mac(OS X 10.9.4)上将VirtualBox(v. 4.3.16)的固定大小的磁盘调整为60GB的动态磁盘,Linux(Ubuntu 14.04)作为客人操作系统运行。

在Mac上的终端中,将光盘放入有VDI文件的目录,然后输入以下内容。

VBoxManage showhdinfo mydisk.vdi  
VBoxManage clonehd mydisk.vdi mydiskClone.vdi  
VBoxManage modifyhd mydiskClone.vdi --resize 61440  
VBoxManage showhdinfo mydiskClone.vdi

在VirtualBox应用程序存储部分,添加mydiskClone.vdi作为第二个HD,然后正常启动虚拟机。

在客体操作系统上的shell中,键入。

sudo fdisk /dev/sdb
- delete all partitions
- create new partition on full disk

重新启动客户机。当它重新启动时,再次进入 shell 并键入:

sudo resize2fs /dev/sdb1

重新启动客户机。

0x1&

关闭客人操作系统。

再在VirtualBox应用存储部分,设置mydiskClone.vdi为启动盘。然后启动客人操作系统,在文件浏览器中使用 “计算机 "的属性验证新的磁盘大小。

5
5
5
2014-11-11 19:34:53 +0000

克隆其实是一个比较好的解决办法,而且有一个比较简单的方法。

从 “文件 "菜单中,选择 "虚拟媒体管理器",然后点击 "复制"。源头将是你原来的固定大小的vdi硬盘,目的地将是你选择的新的东西(包括新的选项)。

4
4
4
2014-09-30 17:50:33 +0000

好了,我在没有克隆的情况下实现了**。

我有一个100GB的VDI文件(固定格式),上面有Ubuntu。工作正常。我想通过缩小虚拟机来释放主机中的一些空间。

步骤。

1.清理

删除不需要的文件。腾出45GB。我只需要释放30GB。

1.修复访客操作系统

我只有一个分区,所以不能从访客Ubuntu里面做任何事情。在虚拟机中挂载Ubuntu Live,并从它启动。

使用gparted将分区缩小到70GB。在ext4中未使用的空间创建一个新分区。

1.擦除空闲空间

新分区中的空闲空间(30GB)。

按照这个指南: 使用zerofree在Ubuntu上以Guest和Host OS收缩虚拟硬盘

我的新分区是/dev/sda3

$ sudo apt-get install zerofree
$ sudo init 1

...

# mkdir /tmp3
# mount -o ro -t ext4 /dev/sda3 /tmp3
# zerofree -v /dev/sda3

1.压缩VDI

花了点时间,但还是成功了!

2
2
2
2016-10-11 12:51:47 +0000

以下是我如何调整大小/增大/扩展固定VDI镜像(我缩小它们的过程在另一个答案中):

1.使用VirtualBox创建一个所需大小的新磁盘(大小_必须至少与原始磁盘相同)。为此,打开客体虚拟机的 VirtualBox 设置,导航到 “存储",单击 "HDD 控制器"(如 "SATA"),然后单击 ”+“来添加硬盘。然后根据需要对新磁盘进行配置。 2. 下载gparted live ISO,并配置客体虚拟机从其启动(同样是存储设置)。 3. 备份客体虚拟机的当前存储。 4. 启动客体虚拟机(应该启动到 gparted live 环境中)。从gparted环境内部。 1.使用gparted应用程序验证你现有的磁盘是”/dev/sda",而你的新(较大)磁盘是"/dev/sdb"(右上角下拉)。 2. 关闭 gparted 应用程序。 3. 打开一个具有root权限的终端(右键点击桌面->终端->具有root权限的终端)。 4. 输入以下命令。dd if=/dev/sda of=/dev/sdb status=progress bs=128M 并等待它完成。这将把原来的磁盘逐字节复制到新的磁盘上,包括MBR等(注意:这可能需要一段时间才能完成,取决于原来磁盘的大小、主机上磁盘的速度等)。(注意:如果你的客体虚拟机有分配给它的内存大于1GB,你可以把'bs'参数改为 “bs=256M",这样可能会加快一点复制速度)。 5. 重新打开gparted程序 6. 从右上角的下拉菜单中选择新的(更大的)驱动器(应该是/dev/sdb)。 7. 根据需要展开分区。要扩展一个不在最后的分区,你可能需要移动在你要扩展的分区之后的分区。根据您的分区方案的具体情况,您可能需要分多个步骤进行,比如将最后一个分区扩展到最后,然后通过将所有东西移动到最后来缩小它。在我的例子中,我的最后一个分区是linux-swap,所以我简单地删除了它,根据需要扩展我的主分区,然后在最后重新创建swap分区(小心复制它的原始分区方案)。 8. 应用更改。 9. 此时你应该有一个新的固定大小的磁盘,里面有所有原来的内容,而且比原来的空间更大。你可以在gparted live env中挂载新的磁盘并进行验证。 10. 关闭客体虚拟机(gparted live),并从虚拟机驱动器中删除ISO。 5. 转到客座虚拟机的 VBox 设置,导航到 "存储",并从列表中删除原始磁盘(右键单击并选择 "删除附件")。这应该会为虚拟机留下您新创建的磁盘。注意:这一步只是将磁盘从客体虚拟机的配置中移除–您的原始客体虚拟机磁盘(即小磁盘)在主机上仍然可用。 6. 启动虚拟机,享受吧! 7. 7.(一旦确认一切都按预期工作,您就可以删除原来的虚拟机磁盘了。

虽然上面的方法对我来说多次都很好用,但如果使用LVM,似乎还需要多走几步。注:如果使用LVM,你可以简单地添加一个所需大小的新磁盘,然后将该磁盘添加到卷组中)。在使用LVM的CentOS 6.6中,我也必须增加LVM内的空间。因此,在启动上面创建的新磁盘后,我做了一些类似这样的事情(根据你的设置名称,不同的部分会有所不同):

1.获取关于LVM设置的信息。

  1. 扩展物理卷(PV)(卷组(VG)将自动反映相同的增加)。

  2. 扩展逻辑卷(LV):

  3. 扩展文件系统。

2
2
2
2015-06-01 00:22:30 +0000

虽然有点晚了,但我还是要加上我的2分钱。首先我要说的是,这是一个令人费解的过程,大多数普通用户都会为了弄清楚而发疯。为什么Oracle没有在VBox GUI中加入这个功能,这是一个谜。

第1步:使用windows命令行(VBoxmanage)来增加硬盘大小。这里的一个小窍门是使用vdi驱动器的ID,而不是无休止地尝试输入文件位置并得到错误信息。

步骤2:然后你需要扩展你的主分区来利用新的空间。下载gparted iso并在VBox中创建一个新的虚拟机,使用它作为IDE源。然后使用现有的VDI驱动器作为sata磁盘。不要为这个机器创建一个虚拟驱动器。启动新机器,你就会看到gparted Gui在运行。这可能需要几次重启才能解决。

一旦 gparted 运行起来,你会看到你想要调整大小的 vdi 驱动器的分区。重要的是:你将不得不删除扩展分区和交换文件空间来增加主分区的大小,所以不要把所有的新空间都分配给PP。一旦你这样做,那么你将不得不为新的扩展分区指定剩余的空间,并在其中创建一个新的交换文件空间。我发现这样做比在命令行上乱动要简单得多。

虽然不是小菜一碟,但还是可以做到的……我花了半天的时间在网上研究才弄明白。在VBox上运行win8.1 / Ubuntu

Willie

1
1
1
2017-03-18 23:21:15 +0000

下面是我如何调整/缩小/缩减一个固定VDI镜像的过程(我的扩容过程在同一主题的另一个答案中):

首先简单介绍一下我为什么需要这样做的背景(因为缩减VDI有很多情况,有些情况可能用这种方法不可行)。几年前,我为一个Windows Server的客人创建了一个固定的VDI,大小为600GB。我不记得我为什么选择这个大小,但到今天为止,我在该客人中只消耗了100GB,我想回收大部分剩余空间。所以在我的情况下,我想保留客人中的所有数据,我只是想释放客人中未使用的空间。

(下面的步骤主要是根据我过去2个小时做的记忆,如果我错过了什么,请原谅。)

1.确定你想要的新大小是多大。当然,你可能会希望给客人留下一些额外的空间,超出它当前消耗的空间。这个大小必须至少与源盘/原盘中的数据相同,四舍五入到最接近的GB。 2. 使用VirtualBox创建一个新的固定大小的磁盘,其大小与上一步确定的大小相同。为此,打开客体虚拟机的 VirtualBox 设置,导航到 “存储",单击 "HDD 控制器"(如 "SATA"),然后单击 ”+“以添加硬盘。然后根据需要对新磁盘进行配置。 3. 下载 gparted live ISO ,并配置客体虚拟机从其启动(同样是存储设置)。 4. 备份客体虚拟机的当前存储。 5. 启动客体虚拟机(应启动到 gparted live 环境中)。从gparted环境里面。

  1. 转到客座虚拟机的 VBox 设置,导航到 "存储",并从列表中删除原始磁盘(右键单击并选择 "删除附件")。这应该会为虚拟机留下您新创建的磁盘。注意:此步骤只是将磁盘从客体虚拟机的配置中移除–您的原始客体虚拟机磁盘(即大型 VDI)在主机上仍然可用。
  2. 我为我的Windows客人所做的最后一步是设置/修复MBR和/或BCD。(我不知道这对Linux客户机是否需要,因为我还没有做过。) 如果我只是简单地从我的新VDI启动,我得到了一个Windows Boot Mgr错误屏幕,内容如下(不幸的是,在我修复问题之前,我没有抓取截图):

  3. 获取一个Windows安装或修复的ISO(最好是与您的操作系统版本相匹配的ISO),并配置客人虚拟机从它启动(同样是存储设置)。

  4. 启动客体虚拟机并选择从 CD/DVD 启动。

  5. 转到客体虚拟机的 VBox 设置,导航到存储,并从 CD/DVD 驱动器中删除 Windows Install/Repair ISO。

  6. 启动虚拟机并享受 12.(一旦确认一切工作与预期相符,您可以删除原始虚拟机磁盘。

0
0
0
2016-11-18 16:26:44 +0000

我提供了一个答案,扩展到任何主机操作系统上运行。这个答案假设你要增加大小(要扩展)。

注意:正如 djule5 所指出的那样(见问题后的评论),modifyhd现在被称为 modifymedium (但仍然向后兼容)。这里我使用modifymedium

1. 退出正在运行的虚拟机

是的,这个答案是针对一个已经被 VirtualBox 虚拟机使用的 VDI 文件。

2. 在你的主机上打开一个终端来调整磁盘映像的大小

命令行 VBoxManage 不想使用 VDI 文件名来调整磁盘映像的大小。

$ ls -s1 *.vdi
10260316160 my_disk_image.vdi

$ vboxmanage modifymedium my_disk_image.vdi --resizebyte 16260316160 VBoxManage: error: Cannot register the hard disk '/home/user/vm/my_disk_image.vdi' {181540c7-b791-4b2f-8e01-5feaff04a6eb} because a hard disk '/home/user/vm/my_disk_image.vdi' with UUID {181540c7-b791-4b2f-8e01-5feaff04a6eb} already exists
VBoxManage: error: Details: code NS_ERROR_INVALID_ARG (0x80070057), component VirtualBoxWrap, interface IVirtualBox, callee nsISupports
VBoxManage: error: Context: "OpenMedium(Bstr(pszFilenameOrUuid).raw(), enmDevType, enmAccessMode, fForceNewUuidOnOpen, pMedium.asOutParam())" at line 179 of file VBoxManageDisk.cpp

因此,请确定您的磁盘镜像的 UUID。

$ ls -s1 *.vdi
10260316160 my_disk_image.vdi

$ vboxmanage list hdds
UUID: 181540c7-b791-4b2f-8e01-5feaff04a6eb
Parent UUID: base
State: created
Type: normal (base)
Location: /home/user/vm/my_disk_image.vdi
Storage format: VDI
Capacity: 10240 MBytes
Encryption: disabled

扩展磁盘映像的大小。

$ vboxmanage modifymedium 181540c7-b791-4b2f-8e01-5feaff04a6eb --resizebyte 16260316160
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

3. 使用分区工具扩展逻辑分区

运行您的托管虚拟机。然后使用【分区工具】(https://en.wikipedia.org/wiki/List_of_disk_partitioning_software)。

一些用于托管GNU/Linux的工具:

如果托管系统使用的是Windows .NET系统,那么如何使用命令行调整分区大小?

您的VDI文件的大小(在您的主机系统上)可能没有改变,因为您的虚拟机还没有使用额外的空间。祝您玩得开心。

-1
-1
-1
2015-08-11 10:26:21 +0000

这对我来说是可行的,应该指定硬盘容量的总量。而不是我们需要增加的空间……

C:\Program Files\Oracle\VirtualBox>VBoxManage.exe modifyhd “D:\Virtual Machine\VirtualBox VMs\Windows 7 (FileZilla Server)\Windows 7 (FileZilla Server).vdi” –resize 15360