折腾虚拟机的时候发现虚拟机硬盘竟然只支持扩大不支持缩小……虽然理论上来讲hypervisor确实不知道客户机的文件系统分布,但是这也太反人类了……所以还是手动来吧~

官方方法

据说vmtools有命令 sudo vmware-toolbox-cmd disk shrinkonly 可以缩小,但是我这虚拟机服务开的比较多会报错

1
2
3
4
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.

如果能用那最好了,不能用可以尝试下面的手动方法。

手动缩小

以下方法在ESXi 7.0 U1中测试通过,操作前务必备份数据。

分区

首先我们需要把空余空间全部移到虚拟硬盘尾,这样在shrink的时候才不会丢数据。

  • Windows可以使用自带的磁盘管理器或者高级一点的DiskGenius,划分出需要减少的磁盘空间,注意务必确保划分出的【未分配】黑色块在最右侧(磁盘尾)。
  • Linux可以使用GParted GUI镜像分区,一样需要确保空闲空间在磁盘尾即可,注意如果不想改引导的话不要动/boot分区的起始位置(分区的时候也有提示的)

缩小磁盘

  1. 开启ESXi ssh,登陆上去cd到要缩小的vmdk的目录, vi src.vmdk (注意不是 src-flat.vmdk),大概长这样

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # 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
  2. 我们需要把-flat文件缩小,用自带的工具 vmkfstools -i src.vmdk dest.vmdk 将原来的vmdk克隆一份,多余的空间会被自动去除

  3. 将原来的 src.vmdk src-flat.vmdk 删除,将 dest.vmdk dest-flat.vmdk 重命名为 src.vmdk src-flat.vmdk

  4. 再次 vi src.vmdk,将RW那一行的文件名改成 src-flat.vmdk,如果有多一行 deletable 的需要删掉。

刷新数据

回到ESXi界面,右击【虚拟机-快照-整合硬盘】,然后进去刷新下就能看到硬盘已经缩小了~ 开机测试下就行了