本文目录导读:

- VMware vSphere/ESXi (使用PowerCLI)
- KVM/QEMU (使用virsh)
- VirtualBox (使用VBoxManage)
- XenServer/XCP-ng (使用xe)
- 功能完整的通用脚本
- 使用示例
- 注意事项
在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
注意事项
- 权限问题:通常需要root权限或相应的虚拟化管理权限
- 存储空间:确保有足够的磁盘空间存储快照
- 性能影响:创建快照时可能会影响虚拟机性能
- 快照链:避免创建过多快照,可能导致性能问题
- 恢复测试:定期测试快照恢复功能
根据你的虚拟化平台选择合适的脚本,并可以根据需要调整参数和功能。