Shell脚本如何创建虚拟机快照

wen 实用脚本 1

本文目录导读:

Shell脚本如何创建虚拟机快照

  1. VMware vSphere/ESXi (使用PowerCLI)
  2. KVM/QEMU (使用virsh)
  3. VirtualBox (使用VBoxManage)
  4. XenServer/XCP-ng (使用xe)
  5. 功能完整的通用脚本
  6. 使用示例
  7. 注意事项

在Shell脚本中创建虚拟机快照主要取决于你使用的虚拟化平台,以下是几种常见平台的脚本实现:

VMware vSphere/ESXi (使用PowerCLI)

#!/bin/bash
# VMware ESXi/vSphere 快照脚本
VM_NAME="your-vm-name"
SNAPSHOT_NAME="auto-snapshot-$(date +%Y%m%d-%H%M%S)"
SNAPSHOT_DESC="自动创建的快照"
# 使用PowerCLI创建快照
powershell -Command "
    Connect-VIServer -Server vcenter.example.com -User admin -Password 'password'
    Get-VM -Name '$VM_NAME' | New-Snapshot -Name '$SNAPSHOT_NAME' -Description '$SNAPSHOT_DESC'
    Disconnect-VIServer -Confirm:\$false
"

KVM/QEMU (使用virsh)

#!/bin/bash
# KVM虚拟机快照脚本
VM_NAME="vm-name"
SNAPSHOT_NAME="snapshot-$(date +%Y%m%d-%H%M%S)"
# 检查虚拟机是否存在
if ! virsh list --all | grep -q "$VM_NAME"; then
    echo "错误: 虚拟机 $VM_NAME 不存在"
    exit 1
fi
# 创建快照
echo "正在为 $VM_NAME 创建快照: $SNAPSHOT_NAME"
virsh snapshot-create-as --domain "$VM_NAME" \
    --name "$SNAPSHOT_NAME" \
    --description "自动创建于 $(date '+%Y-%m-%d %H:%M:%S')"
if [ $? -eq 0 ]; then
    echo "快照创建成功: $SNAPSHOT_NAME"
else
    echo "快照创建失败"
    exit 1
fi

VirtualBox (使用VBoxManage)

#!/bin/bash
# VirtualBox虚拟机快照脚本
VM_NAME="vm-name"
SNAPSHOT_NAME="snapshot-$(date +%Y%m%d-%H%M%S)"
# 检查虚拟机是否存在
if ! VBoxManage list vms | grep -q "$VM_NAME"; then
    echo "错误: 虚拟机 $VM_NAME 不存在"
    exit 1
fi
# 创建快照
echo "正在为 $VM_NAME 创建快照: $SNAPSHOT_NAME"
VBoxManage snapshot "$VM_NAME" take "$SNAPSHOT_NAME" \
    --description "自动创建于 $(date '+%Y-%m-%d %H:%M:%S')"
if [ $? -eq 0 ]; then
    echo "快照创建成功: $SNAPSHOT_NAME"
else
    echo "快照创建失败"
    exit 1
fi

XenServer/XCP-ng (使用xe)

#!/bin/bash
# XenServer/XCP-ng 快照脚本
VM_NAME="vm-name"
SNAPSHOT_NAME="snapshot-$(date +%Y%m%d-%H%M%S)"
# 获取虚拟机UUID
VM_UUID=$(xe vm-list name-label="$VM_NAME" --minimal)
if [ -z "$VM_UUID" ]; then
    echo "错误: 虚拟机 $VM_NAME 不存在"
    exit 1
fi
# 创建快照
echo "正在创建快照: $SNAPSHOT_NAME"
SNAPSHOT_UUID=$(xe vm-snapshot vm="$VM_UUID" new-name-label="$SNAPSHOT_NAME")
if [ $? -eq 0 ]; then
    echo "快照创建成功: $SNAPSHOT_NAME (UUID: $SNAPSHOT_UUID)"
else
    echo "快照创建失败"
    exit 1
fi

功能完整的通用脚本

#!/bin/bash
# 完整功能的虚拟机快照管理脚本
set -e
# 配置
VM_NAME="vm-name"
SNAPSHOT_PREFIX="auto"
RETENTION_COUNT=5
LOG_FILE="/var/log/snapshot.log"
# 日志函数
log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# 根据平台选择快照方法
create_snapshot() {
    local vm_name=$1
    local snapshot_name="${SNAPSHOT_PREFIX}-$(date +%Y%m%d-%H%M%S)"
    log_message "开始为虚拟机 $vm_name 创建快照: $snapshot_name"
    # 检测平台
    if command -v virsh &> /dev/null; then
        # KVM
        virsh snapshot-create-as --domain "$vm_name" \
            --name "$snapshot_name" \
            --description "自动快照 $(date '+%Y-%m-%d %H:%M:%S')"
    elif command -v VBoxManage &> /dev/null; then
        # VirtualBox
        VBoxManage snapshot "$vm_name" take "$snapshot_name" \
            --description "自动快照 $(date '+%Y-%m-%d %H:%M:%S')"
    elif command -v xe &> /dev/null; then
        # XenServer
        vm_uuid=$(xe vm-list name-label="$vm_name" --minimal)
        xe vm-snapshot vm="$vm_uuid" new-name-label="$snapshot_name"
    else
        log_message "错误: 未检测到支持的虚拟化平台"
        return 1
    fi
    if [ $? -eq 0 ]; then
        log_message "快照 $snapshot_name 创建成功"
        # 清理旧快照
        clean_old_snapshots "$vm_name"
        return 0
    else
        log_message "快照创建失败"
        return 1
    fi
}
# 清理旧快照
clean_old_snapshots() {
    local vm_name=$1
    log_message "开始清理旧快照..."
    if command -v virsh &> /dev/null; then
        # 获取快照列表并删除旧的
        local snapshots=$(virsh snapshot-list "$vm_name" --name | grep "^${SNAPSHOT_PREFIX}-")
        local count=$(echo "$snapshots" | wc -l)
        if [ "$count" -gt "$RETENTION_COUNT" ]; then
            local delete_count=$((count - RETENTION_COUNT))
            echo "$snapshots" | head -n "$delete_count" | while read -r snapshot; do
                virsh snapshot-delete "$vm_name" "$snapshot"
                log_message "删除旧快照: $snapshot"
            done
        fi
    fi
}
# 主函数
main() {
    if [ -z "$VM_NAME" ]; then
        echo "用法: $0 [虚拟机名称]"
        exit 1
    fi
    if [ -n "$1" ]; then
        VM_NAME="$1"
    fi
    create_snapshot "$VM_NAME"
}
# 执行主函数
main "$@"

使用示例

# 基本使用
./create_snapshot.sh my-vm
# 设置定时任务(crontab)
# 每天凌晨2点创建快照
0 2 * * * /path/to/create_snapshot.sh my-vm
# 用于备份脚本
#!/bin/bash
BACKUP_DIR="/backup/snapshots"
./create_snapshot.sh web-server
./create_snapshot.sh database-server

注意事项

  1. 权限问题:通常需要root权限或相应的虚拟化管理权限
  2. 存储空间:确保有足够的磁盘空间存储快照
  3. 性能影响:创建快照时可能会影响虚拟机性能
  4. 快照链:避免创建过多快照,可能导致性能问题
  5. 恢复测试:定期测试快照恢复功能

根据你的虚拟化平台选择合适的脚本,并可以根据需要调整参数和功能。

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