Shell脚本如何克隆虚拟机实例

wen 实用脚本 1

本文目录导读:

Shell脚本如何克隆虚拟机实例

  1. VMware vSphere/ESXi
  2. KVM/QEMU
  3. VirtualBox
  4. 通用模板脚本
  5. 高级克隆脚本(含自定义功能)
  6. 使用示例
  7. 注意事项

在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

注意事项

  1. 权限要求:运行脚本需要管理员权限
  2. 存储空间:确保有足够的存储空间
  3. 网络配置:克隆后可能需要修改网络设置
  4. 主机名冲突:避免同一网络中出现同名主机
  5. 许可证问题:某些操作系统克隆后可能需要重新激活

根据你的具体需求和虚拟化平台,选择合适的克隆方法。

抱歉,评论功能暂时关闭!