![如何减少 Virtualbox vdi 文件的虚拟大小/容量](https://linux22.com/image/683560/%E5%A6%82%E4%BD%95%E5%87%8F%E5%B0%91%20Virtualbox%20vdi%20%E6%96%87%E4%BB%B6%E7%9A%84%E8%99%9A%E6%8B%9F%E5%A4%A7%E5%B0%8F%2F%E5%AE%B9%E9%87%8F.png)
我想将运行 MS Windows 7 的物理机变成 VirtualBox 虚拟机。这很容易,我以前做过,但这次我需要磁盘的虚拟大小/容量为固定且较小尺寸。
需要修复它,因为出于合规性原因,我将在其上安装 PGP 磁盘加密。这会将动态磁盘扩展到最大大小。
除了这种特殊情况之外,还有其他原因需要磁盘更小且固定。这是我的经验。例如,如果您在动态扩展磁盘上运行 Jenkins 构建服务器,则可以看到磁盘快速扩展到其最大大小,而在客户操作系统中,磁盘空间使用率稳定,并且有大量可用空间。
使用磁盘2vhd我创建了一个 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 中尝试了各种设置,但没有成功。
如何减少虚拟大小/容量?
答案1
释放磁盘末尾的空间客户操作系统,其中空间 >= 大小(源磁盘) - 大小(新磁盘)。通常通过缩小最后一个分区。
关闭虚拟机。
创建具有所需大小的新 Virtual Box 磁盘。
将内容从旧磁盘移动到新磁盘:
vboxmanage clonemedium disk "source-disk.vmdk" "new-disk.vmdk" --existing
打开虚拟机。
您可能需要调整分区大小客户操作系统根据步骤 1 中释放的空间填充磁盘的其余部分。
答案2
最后,我使用预安装的命令行实用程序dd
(请参阅)以一种意想不到的简单方式解决了这个难题磁盘克隆。如下所示,我现在在客户操作系统中拥有 160GB 的驱动器,存储在一个 160GB 固定大小的 VirtualBox vdi 文件中。
我按照以下步骤解决了这个问题:
- 使用以下方法调整磁盘大小磁盘管理在 MS Windows 中,其大小等于或略小于 VDI 的大小。
- 将带有 MS Windows 7 的源 vdi 添加
MSWIN7.vdi
到 Ubuntu VM 作为第二个磁盘。 - 创建一个新的固定 160GB vdi,并将其添加到 Ubuntu VM。现在有三个磁盘:
/dev/sda1
正在运行的 Ubuntu VM、/dev/sdb2
源MSWIN7.vdi
和/dev/sdc1
新的 vdi。 - 在 上创建正确的分区
/dev/sdc
。CloneZilla 帮我做了这件事。它没有复制数据,但它确实创建了我想要的分区。当然,您可以手动执行此操作。 - 使用类似于的命令复制
sdb
到。该命令以无剩余空间错误消息结束,这是意料之中的。我忽略了这一点,因为这只是未分配的空间,无法复制。sdc
dd
sudo dd if=/dev/sdb of=/dev/sdc
我认为可以对每个分区运行该命令。也许这样更好,并且不会显示错误消息。sudo dd if=/dev/sdb1 of=/dev/sdc1
和sudo 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
答案3
就我而言,我将一个带有 50GB vdi 的 Windows VM 缩小到了 20GB。
我努力了安德烈·菲格雷多解决方案,但我遇到了克隆的问题vdi
。
当我申请时安德烈·菲格雷多解决方案并将缩小的程序附加vdi
到虚拟机,在启动时,Virtualbox 会因 I/O 错误而停止。
也许这与我的文件系统有关btrfs
(我听说这btrfs
会导致 Vritualbox 出现问题vdi
)。
我的解决方案:
我尝试了另一种解决方案来缩小虚拟机磁盘(vdi
),名为卵巢早衰,(卵巢早衰磁盘大小为 50GB,单个 ntfs 分区有 40GB 可用空间)。
让我们按照以下步骤操作(这是我的情况,你可以调整/发明不同的虚拟专用网络名称):
停止虚拟机(关机)
vdi
创建一个名为的新磁盘( )錄影所需大小(我的是 20GB..)附錄影到虚拟机
启动虚拟机并安装实用程序 EaseUS Backup Free
执行 EasyUS 并使用 EasyUS克隆函数(它克隆卵巢早衰MBR 和 ntfs 分区卵巢早衰通过缩小到新磁盘錄影)
关闭虚拟机
分离卵巢早衰来自虚拟机
检查是否錄影是虚拟机的第一个启动设备
重启虚拟机
玩得开心
不要忘记删除卵巢早衰体积。
按照这些步骤,我成功地将虚拟机磁盘大小从 50GB 减少到了 20GB
答案4
正如其他人提到的,Andre Figueiredo 的答案是基于运气的,因为不能保证“第一个 X gb”的空间是你的空间,除非你进行碎片整理,在这种情况下它仍然是有风险的。
Paul Hursky 的答案更安全。我将列出我执行的一些额外步骤(请注意,这是针对 Windows 的,我的是 XP,但它也适用于其他系统):
1)在此链接中获取“MiniTool Partition Wizard Free 12”的免费版本
2) 将其安装在客户操作系统内并调整驱动器大小,留出一些喘息空间以确保安全(不要将其完全拉回...)。由于您很可能调整当前操作系统的硬盘大小,因此它将为您提供重新启动并执行操作的选项,请执行此操作。
3) 现在使用相同的 MiniTool Partition 程序,选择您现在未分配的空间(下方*:
)-> 右键单击 -> 擦除分区 -> 用零填充扇区(快速)。
4) 现在安全关闭客户操作系统。转到 VBoxManage.exe 所在的 VirtualBox 文件夹,在此路径中打开 cmd 并运行以下命令:
vboxmanage modifymedium C:\PATH_TO_YOUR_VDI\CHANGE_ME.vdi --compact
5) 现在一切都应该奇迹般地工作了。当您下次打开客户操作系统时,它将运行检查磁盘,让它运行,它会找到看起来像系统文件的“孤立文件”。