折腾虚拟机的时候发现虚拟机硬盘竟然只支持扩大不支持缩小……虽然理论上来讲hypervisor确实不知道客户机的文件系统分布,但是这也太反人类了……所以还是手动来吧~
官方方法
据说vmtools有命令 sudo vmware-toolbox-cmd disk shrinkonly
可以缩小,但是我这虚拟机服务开的比较多会报错
The shrink feature is not available,
either because you are running an old version of a VMware product, or because too many communication channels are open.
If you are running an old version of a VMware product, you should consider upgrading.
If too many communication channels are open, you should power off your virtual machine and then power it back on.
如果能用那最好了,不能用可以尝试下面的手动方法。
手动缩小
分区
首先我们需要把空余空间全部移到虚拟硬盘尾,这样在shrink的时候才不会丢数据。
- Windows可以使用自带的磁盘管理器或者高级一点的DiskGenius,划分出需要减少的磁盘空间,注意务必确保划分出的【未分配】黑色块在最右侧(磁盘尾)。
- Linux可以使用GParted GUI镜像分区,一样需要确保空闲空间在磁盘尾即可,注意如果不想改引导的话不要动/boot分区的起始位置(分区的时候也有提示的)
缩小磁盘
-
开启ESXi ssh,登陆上去cd到要缩小的vmdk的目录,
vi src.vmdk
(注意不是src-flat.vmdk
),大概长这样# Disk DescriptorFile version=1 encoding="UTF-8" CID=f0e8b00f parentCID=ffffffff createType="vmfs" # Extent description RW 536870912 VMFS "src.vmdk" # The Disk Data Base #DDB ddb.adapterType = "lsilogic" ddb.geometry.cylinders = "33418" ddb.geometry.heads = "255" ddb.geometry.sectors = "63" ddb.longContentID = "af809bef9bb4064db539125bf0e8b00f" ddb.toolsInstallType = "2" ddb.toolsVersion = "10358" ddb.uuid = "60 00 C2 92 4e 02 fb bc-bb f3 dc 07 32 c2 c0 85" ddb.virtualHWVersion = "14"
需要改两个地方,一个是RW那一行,我这是256G(
256*1024*1024*1024/512=536870912
),改成你的目标大小比如128G就是268435456,还有一个是ddb.geometry.cylinders
,这个我也不会算,可以新建一个相应大小的虚拟机cat一下看看这个值是多少,测试过的几个是- 16G=2088
- 32G=4177
- 128G=16709
- 256G=33418
- 我们需要把-flat文件缩小,用自带的工具
vmkfstools -i src.vmdk dest.vmdk
将原来的vmdk克隆一份,多余的空间会被自动去除 - 将原来的
src.vmdk src-flat.vmdk
删除,将dest.vmdk dest-flat.vmdk
重命名为src.vmdk src-flat.vmdk
- 再次
vi src.vmdk
,将RW那一行的文件名改成src-flat.vmdk
,如果有多一行deletable
的需要删掉。
刷新数据
回到ESXi界面,右击【虚拟机-快照-整合硬盘】,然后进去刷新下就能看到硬盘已经缩小了~ 开机测试下就行了