本文目录导读:

- VMware (使用 vmrun 命令)
- VirtualBox (使用 VBoxManage 命令)
- KVM/QEMU (使用 virsh 命令)
- 综合脚本示例(支持多个平台)
- 批量恢复脚本
- 错误处理和日志记录
- 使用注意事项
- 简化使用方法
在Shell脚本中恢复虚拟机快照,主要取决于你使用的虚拟化平台,以下是几种常见平台的脚本方法:
VMware (使用 vmrun 命令)
#!/bin/bash # 虚拟机路径 VM_PATH="/path/to/your/vm.vmx" # 快照名称 SNAPSHOT_NAME="my_snapshot" # 恢复到指定快照 vmrun revertToSnapshot "$VM_PATH" "$SNAPSHOT_NAME" # 恢复并启动虚拟机 vmrun revertToSnapshot "$VM_PATH" "$SNAPSHOT_NAME" && vmrun start "$VM_PATH" nogui # 查看可用快照列表 vmrun listSnapshots "$VM_PATH"
VirtualBox (使用 VBoxManage 命令)
#!/bin/bash # 虚拟机名称或UUID VM_NAME="my_vm" # 快照名称 SNAPSHOT_NAME="backup_snapshot" # 恢复到指定快照 VBoxManage snapshot "$VM_NAME" restore "$SNAPSHOT_NAME" # 恢复到当前快照 VBoxManage snapshot "$VM_NAME" restorecurrent # 查看快照列表 VBoxManage snapshot "$VM_NAME" list
KVM/QEMU (使用 virsh 命令)
#!/bin/bash # 虚拟机名称 VM_NAME="my_vm" # 快照名称 SNAPSHOT_NAME="clean_state" # 恢复虚拟机快照 virsh snapshot-revert "$VM_NAME" "$SNAPSHOT_NAME" # 查看可用快照 virsh snapshot-list "$VM_NAME" # 恢复并启动(如果虚拟机已关机) virsh snapshot-revert "$VM_NAME" "$SNAPSHOT_NAME" --running # 强制恢复(即使有冲突) virsh snapshot-revert "$VM_NAME" "$SNAPSHOT_NAME" --force
综合脚本示例(支持多个平台)
#!/bin/bash
# 配置
VM_NAME="test_vm"
SNAPSHOT_NAME="weekly_backup"
PLATFORM="vmware" # 可选: vmware, virtualbox, kvm
revert_snapshot() {
case "$PLATFORM" in
vmware)
vmrun revertToSnapshot "/path/to/$VM_NAME.vmx" "$SNAPSHOT_NAME"
;;
virtualbox)
VBoxManage snapshot "$VM_NAME" restore "$SNAPSHOT_NAME"
;;
kvm)
virsh snapshot-revert "$VM_NAME" "$SNAPSHOT_NAME"
;;
*)
echo "未知平台: $PLATFORM"
exit 1
;;
esac
if [ $? -eq 0 ]; then
echo "快照恢复成功: $VM_NAME -> $SNAPSHOT_NAME"
else
echo "快照恢复失败"
exit 1
fi
}
# 执行恢复
revert_snapshot
批量恢复脚本
#!/bin/bash
# 定义虚拟机列表
VMS=("vm1" "vm2" "vm3")
SNAPSHOT_NAME="clean_state"
echo "开始批量恢复虚拟机快照..."
for vm in "${VMS[@]}"; do
echo "正在恢复 $vm ..."
virsh snapshot-revert "$vm" "$SNAPSHOT_NAME"
if [ $? -eq 0 ]; then
echo "$vm 恢复成功"
else
echo "警告: $vm 恢复失败"
fi
done
echo "批量恢复完成"
错误处理和日志记录
#!/bin/bash
LOG_FILE="/var/log/vm_snapshot_revert.log"
VM_NAME="production_server"
SNAPSHOT_NAME="pre-update"
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
revert_with_validation() {
# 检查虚拟机是否存在
if ! virsh dominfo "$VM_NAME" &>/dev/null; then
log_message "错误: 虚拟机 $VM_NAME 不存在"
exit 1
fi
# 检查快照是否存在
if ! virsh snapshot-info "$VM_NAME" "$SNAPSHOT_NAME" &>/dev/null; then
log_message "错误: 快照 $SNAPSHOT_NAME 不存在"
exit 1
fi
log_message "开始恢复快照: $VM_NAME -> $SNAPSHOT_NAME"
# 执行恢复
virsh snapshot-revert "$VM_NAME" "$SNAPSHOT_NAME"
RESULT=$?
if [ $RESULT -eq 0 ]; then
log_message "快照恢复成功"
else
log_message "快照恢复失败 (退出码: $RESULT)"
exit 1
fi
}
# 执行
revert_with_validation
使用注意事项
- 权限问题:大多数命令需要root权限或sudo
- 虚拟机状态:某些平台要求虚拟机在特定状态下才能恢复快照
- 数据备份:恢复前确保重要数据已备份
- 磁盘空间:确保有足够的空间进行快照操作
简化使用方法
# 保存脚本为 revert_snapshot.sh chmod +x revert_snapshot.sh ./revert_snapshot.sh # 或者直接一行命令 virsh snapshot-revert "my_vm" "clean_state"
根据你的实际虚拟化平台选择相应的命令即可。