一行命令解决Esxi虚拟机克隆问题

0. 背景

最近给闲置已久的 N6005装上了Esxi 8,准备试跑 K8s (Kubentes). 从最早开始用的Esxi 6到最新的Esxi 8,虚拟机克隆仍还是归属收费内容,部署 vCenter 对于单台主机来说太过于臃肿。在创建了一台虚拟机作为模版后,仔细分析了一下 Esxi的虚拟机文件,找到了其中克隆的门道

$ls -al D12/
total 8389760
drwxr-xr-x    1 root     root         77824 Jun 10 10:29 .
drwxr-xr-t    1 root     root         73728 Jun 10 11:00 ..
-rw-------    1 root     root     8589934592 Jun 10 10:15 debian.12-flat.vmdk
-rw-------    1 root     root           503 Jun 10 10:27 debian.12.vmdk
-rwxr-xr-x    1 root     root          3226 Jun 10 10:57 model.vmx

其中

  • model.vmx 定义了虚拟机的参数,例如 displayName, numvcpus, memSize
  • debian.12.vmdk, debian.12-flat.vmdk 定义了存储, 第一个vmdk是Disk描述文件,定义了存储路径,uuid等信息,真实的数据存储在 debian.12-flat.vmdk

那么在克隆的时候,只需要复制以上文件,然后调整model.vmx 的动态参数即可,例如

# model.vmx
displayName = "_MODEL_"
vmxstats.filename = "_MODEL_.scoreboard"
nvram = "_MODEL_.nvram"

最后配合Esxi的vim-cmd,注册导入虚拟机。当然,一切的前提要先SSH登录主机。

1. 创建克隆脚本

在模版vmx中增加变量, 用 _MODEL_暂为替代

#!/bin/sh

BASE_DIR='/vmfs/volumes/NVME/'
MODEL_DIR='/vmfs/volumes/NVME/D12'


if [ "$#" -eq 0 ]; then
    echo "None value Input"
    exit 1
fi

for arg in "$@"
do
    echo "VM INSTANCE: $arg"

    echo "> STEP1: COPY DATA.."
    cp -r $MODEL_DIR "$BASE_DIR/$arg"

    echo "> STEP2: MODIFY NAME"
    cd "$BASE_DIR/$arg"
    sed -i "s/_MODEL_/$arg/g" model.vmx
    mv model.vmx "$arg.vmx"

    echo "> STEP3: REGISTER INSTANCE"
    vim-cmd solo/registervm "$BASE_DIR/$arg/$arg.vmx"

    echo "> STEP4: SHOW INSTANCES"
    vim-cmd vmsvc/getallvms
done

2. 执行生成

./clone.sh k8s.worker.01
VM INSTANCE: k8s.worker.01
> STEP1: COPY DATA
> STEP2: MODIFY NAME
> STEP3: REGISTER INSTANCE
> STEP4: SHOW INSTANCES
Vmid       Name                         File                        Guest OS        Version   Annotation
3      k8s.worker.01   [NVME] k8s.worker.01/k8s.worker.01.vmx   debian12_64Guest    vmx-21

3. 启动虚拟机

注意勾选:我已复制

外网测速