我发现的只是将虚拟机可用空间归零,对虚拟磁盘进行碎片整理(从Windows),然后运行qemu-img convert -c …(-c flag to compress).
我有一个Windows 7 VM,虚拟驱动器大小为100 GB.最初,此VDD在主机存储上花费了40 GB.一旦它被归零,VDD就会在主机上实现真正的100 GB.并且qemu-img -c …创建了91 GB,这与我的预期完全不同.
在现代网站上,我们可以下载小于10 GB的W7虚拟机,这怎么可能?有没有办法“真正”压缩VM映像?
感谢@dyasny,我用virt-sparsity做了一个小测试.我清理了W7 VM磁盘,禁用休眠,因此VDD仅消耗20 GB.再次降级磁盘,再次运行sdelete -z.使用–compress标志运行virt-sparsity可提供80 GB的虚拟驱动器.远非我所希望的.
编辑 – 2016年2月16日:
“刷新”这个问题,因为这里讨论的缩小VM的方法非常有效,但有一个主要缺点:它删除了所有VM快照.如果有人知道如何在保留快照的同时缩小虚拟机,请随时分享!
它很简单,但如果做得不当可能会导致数据丢失和头发丢失.
以下是使用QCOW2格式的KVM与100 GB的Windows Server 2012 guest虚拟机的步骤,我们希望将其缩小到35 GB.
重要信息:此方法不涉及修改虚拟机定义.相反,它只需要磁盘映像操作.
客人的假设:
> Guest是Windows Server 2012
> QCOW2格式的100 GB磁盘映像
>两个分区:
> 350 MB的启动
> 99.6 GB的C:驱动器,使用20 GB的空间
>我们希望将C:从99.6 GB缩小到34 GB
主持人的假设:
> Ubuntu 16 LTS服务器
> KVM(libvirt)
> 250 GB驱动器
>位于/ var / lib / libvirt / images中的虚拟映像
第1步:准备Windows Guest,缩减主C:分区
在这一步中,我们将直接从Windows减少我们的Windows分区.在此步骤结束时生成的磁盘映像将是启动分区,C:驱动器(简化)和我们将删除的剩余未使用空间(通过不将其复制到新磁盘)的总和.
>登录Windows Guest
>打开“计算机管理”实用程序,使用开始菜单搜索功能找到它.
>在左侧,单击“存储 – >磁盘管理”Storage Disk Management screenshot
>在新屏幕上,右键单击C:分区,单击“Shrink Volume …”,这会在对话框出现之前花一点时间.耐心点.
>出现“Shrink C:”对话框窗口后,在“要缩小的空间量”中输入空间量,使“收缩后的总大小(以MB为单位)”值接近所需的35 GB.然后单击“收缩”.
注意:如果新空间太小,您可能会收到错误消息,在这种情况下,您应该逐渐减少“缩小的空间量”1GB,直到错误消失并发生收缩.在实践中,我们希望保留10 GB的可用空间.
假设您能够将C:分区缩小到34 GB.
>完成后,通过打开命令提示符并键入:shutdown / s / t 0来关闭VM
>您的Windows客户已准备就绪.
第2步:收缩VM主机上的磁盘
该过程实际上不是缩小,而是我们将创建一个新的磁盘(最终大小),我们将从原始磁盘复制两个分区,并跳过未使用的空间.
目标是创建一个总大小=启动分区C:分区的磁盘.我们最终会得到一些微小的剩余空间(除非你的数学是完美的),不要担心,因为我们将在最后一步处理.
>登录linux主机
>切换到超级用户:sudo su
>转到存储虚拟映像的位置:cd / var / lib / libvirt / images
>列出文件:ls -l
>找到您的客人形象(其他地方的大量教程).我们假设我们的windows客户图像被称为“windows.qcow2”
>我们做一个备份:
mkdir backup cp windows.qcow2 backup/windows.qcow2.bak
(去喝咖啡,因为大盘需要一段时间)
>安装您可能缺少的guestfs包:
apt-get install libguestfs-tools
>好的,让我们通过使用virt-filesystems探索windows映像来仔细检查我们的Windows磁盘:
virt-filesystems --long --parts --blkdevs -h -a windows.qcow2
输出这个:
Name Type MBR Size Parent /dev/sda1 partition 07 350M /dev/sda /dev/sda2 partition 07 34G /dev/sda /dev/sda device - 100G -
请注意,我们的/ dev / sda1是我们的Windows启动分区350 MB,/ dev / sda2是我们的C:分区,现在是34 GB,总磁盘映像/ dev / sda /是100 G一堆空间来修剪.
所以这是重要的一步:算一算:34 G 350M适合35 G,因此我们将创建一个35 GB的图像.我们不可避免地会留下一些剩余的空间 – 除非你的数学是完美的 – 但不要担心,我们将在下面处理它.
>让我们创建一个新的虚拟QCOW2磁盘,我们称之为newdisk.qcow2,总大小为35 GB:
qemu-img create -f qcow2 -o preallocation=Metadata newdisk.qcow2 35G
哪个输出:
Formatting 'newdisk.qcow2',fmt=qcow2 size=37580963840 encryption=off cluster_size=65536 preallocation=Metadata lazy_refcounts=off refcount_bits=16`
>让我们通过将旧磁盘复制到新分配的磁盘来调整磁盘大小.这是绝对棒的.大多数其他指南显示一些非常复杂的东西.这只是通过这个命令完成的,之后你应该去喝更多的咖啡 – 这可能需要一段时间:
virt-resize windows.qcow2 newdisk.qcow2`
输出这个:
[ 0.0] Examining windows.qcow2 100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? --:-- ********** Summary of changes: /dev/sda1: This partition will be left alone. /dev/sda2: This partition will be left alone. There is a surplus of 439.8M. An extra partition will be created for the surplus. ********** [ 8.8] Setting up initial partition table on newdisk.qcow2 [ 9.9] Copying /dev/sda1 100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? 00:00 [ 15.1] Copying /dev/sda2 100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? 00:00 Resize operation completed with no errors. Before deleting the old disk,carefully check that the resized disk boots and works correctly.
请注意,该工具找到了多余的空间……回想一下关于Math的注释…所以你可以取消它并重新创建磁盘,或者像我们这样继续前进并像在STEP 3上那样扩展sda2分区.
>完成后.检查生成的图像:
virt-filesystems --long --parts --blkdevs -h -a newdisk.qcow2
输出这个:
Name Type MBR Size Parent /dev/sda1 partition 07 350M /dev/sda /dev/sda2 partition 07 34G /dev/sda /dev/sda3 partition 83 439.8M /dev/sda /dev/sda device - 35G -
注意/ dev / sda3的类型是什么类型的linux for the laftover space.剩下的空间没问题,除非你的数学运算完全正确.我们将在下面进一步介绍来自windows guest的额外分区.现在,请忽略它.
>交换磁盘映像:
mv windows.qcow2 backup/ mv newdisk.qcow2 windows.qcow2
>启动您的VM.
第3步:完成Window Guest上的磁盘操作
在这一步中,我们确认Windows启动正常,我们将把C分区扩展到额外的空间.
>登录Windows客户
>打开“计算机管理”实用程序,单击“存储 – >磁盘管理”
>你应该看到3个分区:boot,C:和一个439 MB的小分区(最右边). Screenshot of Computer Management showing the 3 partitions
>通过右键单击删除linux分区 – >删除卷. (对任何提示单击是)
>右键单击C:分区并单击“扩展”,然后单击对话框上的“下一步”和“确定”.它应该只提供延长最后一个分区的数量.完成后,您已调整C:的大小,并且只剩下两个分区.
>就是这样.您的Windows客户端现在只使用35 GB左右.请记住,由于所有开销等原因,实际磁盘映像可能更大(可能接近38 GB).
检查一切正常并删除映像备份或将其脱机移至存储.