找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2410

积分

1

好友

333

主题
发表于 2025-12-25 11:06:04 | 查看: 34| 回复: 0

手动备份虚拟机不仅繁琐易错,还容易遗忘。本文将介绍如何通过编写一个Python自动化脚本,结合Windows任务计划程序,实现VMware Workstation虚拟机的定时、自动备份,彻底解放运维生产力。

一、准备工作

在开始之前,请确保您的系统已安装Python,并明确要备份的虚拟机。

  1. 创建项目目录:在桌面或其他方便的位置新建一个文件夹,例如 vm_backup,用于存放脚本及相关文件。
  2. 创建脚本文件:在上述文件夹内,新建一个文本文件,并将其重命名为 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 执行单次备份

  1. 在VMware Workstation中,将需要备份的虚拟机关机或暂停。
  2. 双击运行 backup.py 脚本,根据提示输入 y 确认后,脚本将自动执行备份流程。

四、配置自动定时备份(Windows任务计划)

为实现无人值守的全自动备份,可以将其配置为Windows任务计划程序。

  1. 按下 Win + R,输入 taskschd.msc 打开“任务计划程序”。
  2. 在右侧操作栏点击“创建基本任务”。
  3. 按照向导进行配置:
    • 名称VMware自动备份
    • 触发器:选择“每天”,并设置具体执行时间(如凌晨2点)。
    • 操作:选择“启动程序”。
    • 程序或脚本:浏览选择您系统中的 python.exe(通常位于Python安装目录)。
    • 添加参数:填写您的 backup.py 脚本的完整路径,例如:"C:\Users\YourName\Desktop\vm_backup\backup.py"
    • 起始于:填写 backup.py 脚本所在的目录路径,例如:"C:\Users\YourName\Desktop\vm_backup"

完成设置后,系统将在指定时间自动执行备份脚本,实现虚拟机的定时、自动化备份。




上一篇:PostgreSQL递归CTE与位运算实战:用一条SQL高效求解数独难题
下一篇:Flash存储中的追加型数据结构:嵌入式日志与快照管理方案解析
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-11 20:15 , Processed in 0.309546 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表