如何减少Virtualbox vdi文件的虚拟大小/容量


8

我想将运行MS Windows 7的物理机转换为VirtualBox虚拟机。这很容易,我之前已经做过,但是这次我需要将磁盘的虚拟大小/容量固定为较小的大小。

它需要修复,因为出于合规性原因我将在其上安装PGP磁盘加密。这会将动态磁盘扩展到最大大小。

除了这种特殊情况外,还有其他一些原因需要磁盘更小和固定。是我的经验。例如,如果您在动态扩展的磁盘上运行Jenkins构建服务器,则可能会看到该磁盘迅速扩展到其最大大小,而在来宾操作系统中,磁盘空间使用率稳定且有很多可用空间。

使用Disk2vhd我创建了一个vhdx文件。我将此文件转换为vdi格式。

vboxmanage clonehd --format VDI MSWIN7.VHDX MSWIN7.vdi

据说,使用vdi可以通过类似于以下命令来减小虚拟大小/容量

vboxmanage modifyhd MSWIN7.vdi --resize 160000

我发现这行不通。即使您尝试使用变体,您也会持续收到以下错误消息:

进度状态:VBOX_E_NOT_SUPPORTED VBoxManage:错误:此格式的硬盘操作尚未调整大小!

以下是我的vdi磁盘的磁盘布局。我将其添加到Ubuntu VM,以使用Gparted和CloneZilla对其进行查看。容量约为300GB。未分配145GB。使用的容量约为153GB。

我想将容量缩小到160GB左右。这应该足以适合/dev/sdb1/dev/sdb2

顺便说一句,我尝试了CloneZilla,但它似乎也不希望将容量缩小到较小的磁盘上。我在CloneZilla中尝试了各种设置,但没有成功。

如何减少虚拟大小/容量?

在此处输入图片说明

Answers:


15
  1. 来宾操作系统中的磁盘末尾释放空间,其中空间> = size(源磁盘)-size(新磁盘)。通常通过收缩最后一个分区
  2. 关闭虚拟机。
  3. 创建具有所需大小的新虚拟盒磁盘。
  4. 将内容从旧磁盘移动到新磁盘内部:

    vboxmanage clonehd "source-disk.vmdk" "new-disk.vmdk" --existing
    
  5. 打开虚拟机。

  6. 您可能必须在来宾OS中调整分区大小以填充磁盘的其余部分,具体取决于在步骤1中释放的空间。

2
这是将使用很大分区创建的动态vdi转换为新vdi(出于性能原因可能是固定大小格式)的真正正确方法。我不知道为什么没有人回答这个问题,而更喜欢dd方法……
zw963

“在磁盘末尾分配空间”是什么意思?您是要缩小主机上的vdi文件吗,例如以下问题:superuser.com/questions/529149/…–
mikezter

在来宾操作系统中,我已经澄清了帖子
Andre Figueiredo

完善!非常感谢你!
Yamakuzure

1
使用vboxmanage clonehd "source-disk.vdi" "new-disk.vdi" --existing会破坏目标映像上的分区表。
Mogens TrasherDK

3

最后,我设法使用预装的命令行实用程序以一种意想不到的简单方法解决了这个难题,dd请参阅磁盘克隆。如下所示,我现在将我的160GB驱动器存储在一个160GB固定VirtualBox vdi文件中的客户机操作系统中。

在此处输入图片说明

我使用以下步骤解决了问题:

  1. 在MS Windows中使用“ 磁盘管理”将磁盘调整为等于或更好的大小,该大小等于或小于VDI的大小。
  2. MSWIN7.vdi带有MS Windows 7的源vdi 作为第二个磁盘添加到Ubuntu VM。
  3. 创建一个新的固定160GB vdi,并将其添加到Ubuntu VM。现在有三个磁盘:/dev/sda1运行的Ubuntu VM,/dev/sdb2MSWIN7.vdi/dev/sdc1新的vdi。
  4. 在上创建正确的分区/dev/sdc。CloneZilla为我做到了。它没有复制数据,但确实创建了我想要的分区。当然,您可以手动执行此操作。
  5. 复制sdbsdc具有dd类似命令sudo dd if=/dev/sdb of=/dev/sdc。该命令以无空剩余错误消息结尾,这是预期的。我忽略了这一点,因为这只是复制失败的未分配空间。

我认为可以为每个分区运行命令。也许更好,并且不会显示错误消息。sudo dd if=/dev/sdb1 of=/dev/sdc1sudo dd if=/dev/sdb2 of=/dev/sdc2

vagrant@devops:~$ sudo dd if=/dev/sdb of=/dev/sdc
dd: writing to ‘/dev/sdc’: No space left on device
335544321+0 records in
335544320+0 records out
171798691840 bytes (172 GB) copied, 6360.3 s, 27.0 MB/s

2

我相信此解决方案非常危险!它依赖于所有文件位于原始300 GB分区的前153 GB中。dd命令不复制文件。它只是按顺序复制所有块。因此,如果您不幸在160 GB切断后无法保存重要文件,则dd将不知道要复制它们。

我在许多帖子中看到的典型解决方案是启动Windows VM并使用碎片整理工具和管理工具的某种组合将所有文件整合到磁盘的前端-困难在于许多碎片整理工具不会移动不动Windows系统文件(我必须关闭系统恢复才能删除7 GB的不可移动磁盘块),这些文件位于您要合并的空间中间。

将文件合并到磁盘前面之后(MyDefrag是一个免费软件工具,可显示文件在磁盘上的位置),您必须减小Windows分区的大小。我使用了diskpart工具和收缩选项。

此时,您可以使用dd将现在较小的分区复制到新的vdi。

我还在Linux主机上使用了vboxmanage Modifymedium win10.vdi --compact,但是我首先必须在Windows系统中运行sdelete.exe,以首先将所有未使用的空间清零(sdelete -zc :)。使用vboxmanage压缩现有的vdi文件可让您就地进行所有操作(但始终要进行备份)。


我忘记提及的是,我首先将MS Windows中的分区大小调整为合适的大小。这样可以确保文件位于153GB部分中。MS Windows将移动文件/数据。请注意,由于文件无法移动,MS Windows有时不会调整大小。
onknows's

2

以我为例,我有一个Windows VM,其vdi容量为50GB,可缩小到20GB。

我已经尝试过Andre Figueiredo解决方案,但是克隆的文件存在问题vdi

当我应用Andre Figueiredo解决方案并将缩小的附件附加vdi到VM时,在引导时,Virtualbox会因I / O错误而停止。

也许这与我的btrfs文件系统有关(我听说btrfs导致Vritualbox出现问题vdi)。

我的解决方案:

为了缩小VM磁盘(vdi)的大小,我尝试了另一种解决方案,名为OVdiOVdi的磁盘大小为50GB,单个ntfs分区具有40GB的可用空间)。

让我们按照以下步骤操作(这是我的情况,您可以改编/发明不同的vdi名称):

  • 停止虚拟机(关机)

  • 创建一个vdi具有所需大小的名称DVdi的新磁盘()(我的情况为20GB。)

  • DVdi附加到VM

  • 引导VM并安装实用程序EaseUS Backup Free

  • 执行EasyUS并使用EasyUS 克隆函数(它克隆OVdi MBR,以及NTFS分区OVdi通过收缩到新的磁盘DVdi

  • 关闭虚拟机电源

  • 从VM 分离OVdi

  • 检查DVdi是否是VM的第一个引导设备

  • 重启虚拟机

  • 玩得开心

不要忘记删除OVdi卷。

按照这些步骤,我成功地将VM磁盘大小从50GB减小到20GB


0

正如其他人提到的那样,安德烈·菲格雷多(Andre Figueiredo)的回答是基于运气的,因为不能保证空间的“第一个X gb”就是您的空间,除非您进行碎片整理,否则这仍然有风险。

保罗·赫斯基(Paul Hursky)的答案要安全得多。我将列出我所做的一些额外步骤(请注意,这适用于Windows,我的操作系统是XP,但也适用于其他操作系统):

1)在此链接中获得“ MiniTool Partition Wizard Free 12”的免费版本

2)将其安装在来宾OS内并调整驱动器的大小,为安全起见留出一些喘息的空间(不要将其完全拉回..)。由于您很可能会调整当前操作系统的硬盘大小,因此可以选择重新启动并执行操作,请执行此操作。

3)现在使用相同的MiniTool分区程序,选择您现在未分配的空间(在下方*:)->右键单击->擦除分区->用零填充扇区(快速)。

4)现在安全关闭来宾操作系统。转到存在VBoxManage.exe的VirtualBox文件夹,在此路径中打开cmd并运行以下命令:

vboxmanage modifymedium C:\PATH_TO_YOUR_VDI\CHANGE_ME.vdi --compact

5)现在一切都应该神奇地起作用。下次打开来宾OS时,它将运行检查磁盘LET IT RUN,它会找到看起来像系统文件的“孤立文件”。

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.