一行命令解决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, memSizedebian.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. 启动虚拟机
注意勾选:我已复制