手动备份虚拟机不仅繁琐易错,还容易遗忘。本文将介绍如何通过编写一个Python自动化脚本,结合Windows任务计划程序,实现VMware Workstation虚拟机的定时、自动备份,彻底解放运维生产力。
一、准备工作
在开始之前,请确保您的系统已安装Python,并明确要备份的虚拟机。
- 创建项目目录:在桌面或其他方便的位置新建一个文件夹,例如
vm_backup,用于存放脚本及相关文件。
- 创建脚本文件:在上述文件夹内,新建一个文本文件,并将其重命名为
backup.py。
二、脚本代码与配置
以下为完整的自动化备份脚本。您需要修改其中的关键配置以适应您的环境。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
VMware虚拟机自动备份脚本
功能:创建快照并备份关键虚拟机文件
"""
import os
import subprocess
import datetime
import shutil
# ===================== 配置区域 =====================
# 请根据您的实际路径修改以下三个变量
# 1. vmrun.exe 的完整路径
VMRUN_PATH = r"C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe"
# 2. 要备份的虚拟机 .vmx 配置文件完整路径
VMX_PATH = r"D:\VMs\CentOS7\CentOS7.vmx"
# 3. 备份文件存放的目录
BACKUP_DIR = r"C:\VM_Backups"
# ===================================================
def check_paths():
"""检查关键路径是否存在"""
print("🔍 检查配置路径...")
errors = []
if not os.path.exists(VMRUN_PATH):
errors.append(f"❌ 未找到 vmrun.exe: {VMRUN_PATH}")
print("提示:请在VMware安装目录中搜索此文件。")
if not os.path.exists(VMX_PATH):
errors.append(f"❌ 未找到虚拟机配置文件: {VMX_PATH}")
print("提示:在VMware中右键虚拟机,选择‘设置’可查看.vmx文件位置。")
if not os.path.exists(BACKUP_DIR):
os.makedirs(BACKUP_DIR)
print(f"✅ 已创建备份目录: {BACKUP_DIR}")
if errors:
print("\n⚠️ 配置错误,请修改代码中的路径!")
for error in errors:
print(f" {error}")
input("\n按回车键退出...")
return False
print("✅ 所有路径检查通过!")
return True
def create_snapshot():
"""为虚拟机创建快照"""
print("\n📸 正在创建快照...")
now = datetime.datetime.now()
snapshot_name = f"AutoBackup_{now.strftime('%Y%m%d_%H%M')}"
print(f"快照名称: {snapshot_name}")
cmd = [
VMRUN_PATH,
"-T", "ws",
"snapshot",
VMX_PATH,
snapshot_name
]
try:
result = subprocess.run(cmd, capture_output=True, text=True, encoding='gbk')
if result.returncode == 0:
print("✅ 快照创建成功!")
return snapshot_name
else:
print("❌ 快照创建失败")
if result.stderr:
print(f"错误信息: {result.stderr}")
return None
except Exception as e:
print(f"❌ 执行出错: {str(e)}")
print("可能原因:VMware服务未运行、虚拟机状态异常或权限不足。")
return None
def backup_vm_files(snapshot_name):
"""备份虚拟机核心文件"""
if not snapshot_name:
print("⚠️ 因快照创建失败,跳过文件备份。")
return False
print("\n💾 开始备份虚拟机文件...")
vm_dir = os.path.dirname(VMX_PATH)
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M")
backup_folder = os.path.join(BACKUP_DIR, f"backup_{timestamp}")
os.makedirs(backup_folder, exist_ok=True)
file_extensions = [".vmdk", ".vmx", ".vmsd", ".vmsn", ".nvram"]
files_copied = 0
print(f"源目录: {vm_dir}")
print(f"目标目录: {backup_folder}")
for filename in os.listdir(vm_dir):
if any(filename.endswith(ext) for ext in file_extensions):
src_path = os.path.join(vm_dir, filename)
dst_path = os.path.join(backup_folder, filename)
try:
shutil.copy2(src_path, dst_path)
print(f" ✅ {filename}")
files_copied += 1
except Exception as e:
print(f" ⚠️ 跳过 {filename} (文件可能被锁定)")
print(f"\n✅ 文件备份完成!共备份 {files_copied} 个文件。")
return True
def write_log(success, snapshot_name):
"""记录备份日志"""
log_file = os.path.join(BACKUP_DIR, "backup_log.txt")
status = "成功" if success else "失败"
time_str = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open(log_file, "a", encoding="utf-8") as f:
f.write(f"[{time_str}] {status} | 快照: {snapshot_name}\n")
print(f"\n📝 操作日志已记录至: {log_file}")
def main():
"""主函数"""
print("=" * 50)
print(" VMware 虚拟机自动备份工具")
print("=" * 50)
if not check_paths():
return
print("\n⚠️ 操作前请确认:")
print("1. 目标虚拟机已关机或暂停。")
print("2. 备份期间请勿操作虚拟机。")
response = input("\n是否开始执行备份?(y/n): ").strip().lower()
if response != 'y':
print("操作已取消。")
return
snapshot_name = create_snapshot()
success = backup_vm_files(snapshot_name)
write_log(success, snapshot_name)
print("\n" + "=" * 50)
if success:
print("🎉 备份任务执行完毕!")
print(f"快照: {snapshot_name}")
print(f"文件: {BACKUP_DIR}")
print("\n🔍 验证方式:")
print("1. 启动VMware Workstation。")
print("2. 右键虚拟机 →‘快照’→‘快照管理器’,查看新快照。")
else:
print("❌ 备份任务执行失败。")
print("请检查虚拟机状态、VMware服务及磁盘空间。")
print("=" * 50)
input("\n按回车键退出...")
if __name__ == "__main__":
main()
三、配置与运行步骤
3.1 修改脚本配置
打开 backup.py 文件,找到配置区域(代码第16-18行附近),根据您的实际情况修改以下三个路径:
VMRUN_PATH = r"您的VMware安装路径\vmrun.exe"
VMX_PATH = r"您的虚拟机.vmx文件完整路径"
BACKUP_DIR = r"您希望存放备份的目录路径"
3.2 执行单次备份
- 在VMware Workstation中,将需要备份的虚拟机关机或暂停。
- 双击运行
backup.py 脚本,根据提示输入 y 确认后,脚本将自动执行备份流程。
四、配置自动定时备份(Windows任务计划)
为实现无人值守的全自动备份,可以将其配置为Windows任务计划程序。
- 按下
Win + R,输入 taskschd.msc 打开“任务计划程序”。
- 在右侧操作栏点击“创建基本任务”。
- 按照向导进行配置:
- 名称:
VMware自动备份
- 触发器:选择“每天”,并设置具体执行时间(如凌晨2点)。
- 操作:选择“启动程序”。
- 程序或脚本:浏览选择您系统中的
python.exe(通常位于Python安装目录)。
- 添加参数:填写您的
backup.py 脚本的完整路径,例如:"C:\Users\YourName\Desktop\vm_backup\backup.py"
- 起始于:填写
backup.py 脚本所在的目录路径,例如:"C:\Users\YourName\Desktop\vm_backup"
完成设置后,系统将在指定时间自动执行备份脚本,实现虚拟机的定时、自动化备份。
|