本文目录导读:

在Shell脚本中克隆虚拟机实例的方法取决于你使用的虚拟化平台,以下是几种主流平台的脚本示例:
VMware vSphere/ESXi
#!/bin/bash
# VMware vSphere 克隆脚本
VM_SOURCE="source-vm-name"
VM_CLONE="clone-vm-name"
DATASTORE="datastore-name"
CLUSTER="cluster-name"
# 使用 govc 工具
# 创建完整克隆
govc vm.clone -vm $VM_SOURCE -name $VM_CLONE -ds=$DATASTORE -cluster=$CLUSTER
# 创建链接克隆
govc vm.clone -vm $VM_SOURCE -name $VM_CLONE -ds=$DATASTORE -cluster=$CLUSTER -linked
# 使用 vmware-vim-cmd
vmware-vim-cmd vmsvc/getallvms | grep $VM_SOURCE | awk '{print $1}' | while read VM_ID; do
vim-cmd vmsvc/clone $VM_ID $VM_CLONE $DATASTORE
done
KVM/QEMU
#!/bin/bash
# KVM 克隆脚本
SOURCE_VM="source-vm"
CLONE_VM="clone-vm"
STORAGE_PATH="/var/lib/libvirt/images"
# 创建磁盘快照
qemu-img create -f qcow2 -b $STORAGE_PATH/$SOURCE_VM.qcow2 \
$STORAGE_PATH/$CLONE_VM.qcow2
# 导出并修改 XML 配置
virsh dumpxml $SOURCE_VM > /tmp/$CLONE_VM.xml
# 修改 VM 名称和 UUID
sed -i "s/<name>$SOURCE_VM<\/name>/<name>$CLONE_VM<\/name>/" /tmp/$CLONE_VM.xml
UUID=$(uuidgen)
sed -i "s/<uuid>.*<\/uuid>/<uuid>$UUID<\/uuid>/" /tmp/$CLONE_VM.xml
# 修改磁盘路径
sed -i "s|$SOURCE_VM.qcow2|$CLONE_VM.qcow2|g" /tmp/$CLONE_VM.xml
# 定义新虚拟机
virsh define /tmp/$CLONE_VM.xml
VirtualBox
#!/bin/bash
# VirtualBox 克隆脚本
SOURCE_VM="source-vm-name"
CLONE_VM="clone-vm-name"
# 完整克隆
VBoxManage clonevm "$SOURCE_VM" --name "$CLONE_VM" --register
# 链接克隆
VBoxManage clonevm "$SOURCE_VM" --name "$CLONE_VM" --options Link --register
# 指定克隆类型
VBoxManage clonevm "$SOURCE_VM" --name "$CLONE_VM" \
--mode machine --register
通用模板脚本
#!/bin/bash
# 通用虚拟机克隆脚本
set -e
# 配置变量
source_vm="${1:?请提供源虚拟机名称}"
clone_vm="${2:?请提供克隆虚拟机名称}"
vm_type="${3:-vmware}" # 可选: vmware, kvm, virtualbox
clone_vmware() {
echo "克隆 VMware 虚拟机: $source_vm -> $clone_vm"
govc vm.clone -vm "$source_vm" -name "$clone_vm"
}
clone_kvm() {
echo "克隆 KVM 虚拟机: $source_vm -> $clone_vm"
local disk_path=$(virsh domblklist "$source_vm" | grep vda | awk '{print $2}')
local clone_disk="${disk_path/$source_vm/$clone_vm}"
# 克隆磁盘
qemu-img create -f qcow2 -b "$disk_path" "$clone_disk"
# 克隆配置
virsh dumpxml "$source_vm" > "/tmp/${clone_vm}.xml"
sed -i "s/$source_vm/$clone_vm/g" "/tmp/${clone_vm}.xml"
virsh define "/tmp/${clone_vm}.xml"
}
clone_virtualbox() {
echo "克隆 VirtualBox 虚拟机: $source_vm -> $clone_vm"
VBoxManage clonevm "$source_vm" --name "$clone_vm" --register
}
# 执行克隆
case $vm_type in
vmware)
clone_vmware
;;
kvm)
clone_kvm
;;
virtualbox)
clone_virtualbox
;;
*)
echo "不支持的虚拟机类型: $vm_type"
exit 1
;;
esac
echo "虚拟机克隆完成: $clone_vm"
高级克隆脚本(含自定义功能)
#!/bin/bash
# 高级克隆脚本,支持网络配置和主机名修改
set -euo pipefail
# 函数:克隆后配置
configure_clone() {
local vm_name="$1"
local new_hostname="$2"
local network_config="$3"
case $vm_type in
vmware)
# 修改 VM 网络设置
govc vm.change -vm "$vm_name" -e "guestinfo.hostname=$new_hostname"
;;
kvm)
# 修改 KVM 虚拟机配置
virsh set-user-metadata "$vm_name" "hostname" "$new_hostname"
;;
esac
# 启动虚拟机
echo "启动克隆虚拟机: $vm_name"
case $vm_type in
vmware) govc vm.power -on "$vm_name" ;;
kvm) virsh start "$vm_name" ;;
virtualbox) VBoxManage startvm "$vm_name" --type headless ;;
esac
# 等待 VM 就绪
sleep 30
# SSH 配置(需要 SSH密钥认证)
if command -v ssh &> /dev/null; then
local ip=$(get_vm_ip "$vm_name")
echo "配置主机名: $new_hostname @ $ip"
ssh -o StrictHostKeyChecking=no "root@$ip" \
"hostnamectl set-hostname $new_hostname"
fi
}
get_vm_ip() {
local vm_name="$1"
case $vm_type in
vmware) govc vm.ip "$vm_name" ;;
kvm) virsh domifaddr "$vm_name" | grep ipv4 | awk '{print $4}' | cut -d'/' -f1 ;;
*) echo "192.168.1.100" ;;
esac
}
# 主执行流程
clone_vm "$source_vm" "$clone_vm"
configure_clone "$clone_vm" "new-server-01" "dhcp"
使用示例
# 克隆 VMware 虚拟机 ./clone_vm.sh source-vm clone-vm vmware # 克隆 KVM 虚拟机 ./clone_vm.sh source-vm clone-vm kvm # 克隆 VirtualBox 虚拟机 ./clone_vm.sh source-vm clone-vm virtualbox
注意事项
- 权限要求:运行脚本需要管理员权限
- 存储空间:确保有足够的存储空间
- 网络配置:克隆后可能需要修改网络设置
- 主机名冲突:避免同一网络中出现同名主机
- 许可证问题:某些操作系统克隆后可能需要重新激活
根据你的具体需求和虚拟化平台,选择合适的克隆方法。