我想把运行MS Windows 7的物理机器变成一个VirtualBox虚拟机。 这很容易,我以前做过这个,但是这次我需要磁盘的虚拟大小/容量是固定的和更小的大小。
它需要被修复,因为我将在其上安装PGP磁盘encryption。 这会将dynamic磁盘扩展到最大尺寸。
除了这种特殊情况之外,还有其他的原因希望磁盘变小和固定。 是我的经验。 如果在dynamic扩展磁盘上运行Jenkins构build服务器,则可以看到该磁盘快速扩展到其最大大小,而在来宾操作系统中,磁盘空间使用情况稳定且有大量可用空间。
使用Disk2vhd我创build了一个vhdx文件。 这个文件我转换为vdi格式。
vboxmanage clonehd --format VDI MSWIN7.VHDX MSWIN7.vdi
据称与vdi你可以减less虚拟的大小/容量与类似的命令
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中尝试了各种设置,但没有成功。
我怎样才能减less虚拟大小/容量?
将内容从旧磁盘移动到新磁盘中:
vboxmanage clonehd "source-disk.vmdk" "new-disk.vmdk" --existing
打开虚拟机。
最后,我设法使用预安装的命令行实用工具dd以一种非常容易的方式解决了这个难题。请参阅磁盘克隆 。 如下图所示,我现在在我的客户操作系统中有160GB硬盘,存储在一个160GB固定的VirtualBox vdi文件中。
我使用以下步骤解决它:
MSWIN7.vdi添加到Ubuntu VM作为第二个磁盘。 /dev/sda1 ,源MSWIN7.vdi /dev/sdb2和具有新vdi的/dev/sdc1 。 /dev/sdc上创build正确的分区。 CloneZilla为我做了这个。 它没有复制数据,但确实创build了我想要的分区。 当然,你可以手动做到这一点。 sudo dd if=/dev/sdb of=/dev/sdc dd命令将sdb复制到sdc 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
我相信这个解决scheme是非常危险的! 它依赖于原始300 GB分区的前153 GB中的所有文件。 dd命令不会复制文件。 它只是顺序复制所有的块。 因此,如果你不幸在160 GB截止后有重要的文件,dd将不知道复制它们。
我在很多很多post中看到的典型解决scheme是启动Windows VM,并使用碎片整理工具和pipe理工具的一些组合来将所有文件整合到磁盘的前端 – 困难在于许多碎片整理工具不会移动不可移动Windows系统文件(我不得不closures系统恢复来删除一个7GB的不可移动的磁盘块),这是在你想要整合的空间中间的某个地方。
将文件合并到磁盘前(MyDefrag是一个免费的工具,提供文件在磁盘上的显示位置),则必须缩小Windows分区的大小。 我使用了收缩选项的diskpart工具。
此时,您可以使用dd将现在较小的分区复制到新的vdi。
我也在我的Linux主机上使用了vboxmanage modifymedium win10.vdi –compact,但是我首先必须在Windows系统中运行sdelete.exe,以便首先清除所有未使用的空间(sdelete -zc :)。 使用vboxmanage来压缩现有的vdi文件可以让你做所有的事情(但总是有一个备份)。