实用脚本能批量快照吗?

wen 实用脚本 10

本文目录导读:

实用脚本能批量快照吗?

  1. 虚拟机快照(以 VMware Workstation / ESXi 为例)
  2. 云服务器磁盘快照(以阿里云 CLI / AWS CLI 为例)
  3. 文件系统快照(ZFS / Btrfs)
  4. 批量截图/窗口快照(用于报告等)
  5. 通用型:一键多快照工具(推荐)
  6. 重要提醒(针对批量快照)

可以,批量快照是非常实用的功能,尤其在以下场景中很常用:

  • 虚拟机环境:对多个 VM 或容器同时做快照(备份/回滚点)。
  • 云服务器:对多个 ECS 实例创建磁盘快照。
  • 文件系统:对多个目录或文件进行快照(如 ZFS/Btrfs 快照)。
  • 设计工具:如对 Sketch/Figma 中的多个图层做快照(导出)。

这里按几种常见的技术对象,给你几个能直接用的实用脚本


虚拟机快照(以 VMware Workstation / ESXi 为例)

场景:你需要同时对 3 个或更多 Linux/Windows 虚拟机打快照,不能一个一个手动点。

脚本思路:使用 vmrun(VMware 命令行工具)。

Windows 批处理脚本(batch) batch_snapshot.bat

@echo off
set VMRUN_PATH="C:\Program Files (x86)\VMware\VMware VIX\vmrun.exe"
set SNAPSHOT_NAME="DailyBackup_%date:~0,4%%date:~5,2%%date:~8,2%"
REM 列出你的虚拟机 VMX 文件列表(可以用绝对路径或网络路径)
set VM_LIST=(
    "D:\VMs\WebServer\WebServer.vmx"
    "D:\VMs\DBServer\DBServer.vmx"
    "D:\VMs\CacheServer\CacheServer.vmx"
)
for %%v in %VM_LIST% do (
    echo Creating snapshot for %%v as %SNAPSHOT_NAME% ...
    %VMRUN_PATH% snapshot %%v %SNAPSHOT_NAME%
)
pause
  • 优点:一次性对多个 VM 做快照,自动带上日期。
  • 增强版:也可以改成支持从文本文件读取 VM 列表。

云服务器磁盘快照(以阿里云 CLI / AWS CLI 为例)

场景:你有 N 台云服务器的系统盘/数据盘,需要在凌晨做批量快照。

Shell 脚本(Bash),使用阿里云 CLI aliyun

#!/bin/bash
# 指定要打快照的磁盘 ID 列表(用空格分隔)
DISK_IDS="d-bp1hxxxxxxx01 d-bp1hxxxxxxx02 d-bp1hxxxxxxx03"
# 或者自动获取所有磁盘(需谨慎,建议加入过滤)
# DISK_IDS=$(aliyun ecs DescribeDisks --RegionId cn-hangzhou --PageSize 100 | jq -r '.Disks.Disk[].DiskId')
SNAPSHOT_TAG="BatchBackup_$(date +%Y%m%d%H%M)"
for disk_id in $DISK_IDS; do
    echo "Creating snapshot for disk: $disk_id"
    aliyun ecs CreateSnapshot \
        --DiskId "$disk_id" \
        --SnapshotName "${SNAPSHOT_TAG}_${disk_id}"
    # 建议加短暂延迟,避免 API 限流
    sleep 1
done
echo "All snapshots created."
  • 安全提示:建议在测试环境先用 --dry-run 测试。
  • AWS 版:换成 aws ec2 create-snapshot --volume-id vol-xxx 即可。

文件系统快照(ZFS / Btrfs)

场景:如果你用的是 ZFS(FreeBSD/Linux)或 Btrfs(openSUSE/Fedora),你可以瞬间大量快照。

ZFS 脚本(Bash) zfs_batch_snapshot.sh

#!/bin/bash
# 要快照的数据集列表(空格分隔)
DATASETS="tank/data tank/home tank/backup"
SNAPSHOT_NAME="daily_$(date +%Y%m%d_%H%M%S)"
for ds in $DATASETS; do
    echo "Creating snapshot: ${ds}@${SNAPSHOT_NAME}"
    zfs snapshot "${ds}@${SNAPSHOT_NAME}"
done
# 可选:删除 7 天前的旧快照
for ds in $DATASETS; do
    zfs list -H -o name -t snapshot | grep "${ds}" | grep -v "$(date +%Y%m%d)" | xargs -r zfs destroy
done
  • 快感来源:ZFS 快照几乎是瞬间完成的(Copy-on-Write),搞几百个数据集的快照也就一两秒。

批量截图/窗口快照(用于报告等)

场景:你有一堆窗口程序或网页,需要给它们批量截图。

PowerShell 脚本(Windows)

# 假设你想截图所有打开的记事本
$notepadWindows = Get-Process notepad | Where-Object { $_.MainWindowHandle -ne 0 }
$notepadWindows | ForEach-Object {
    $filename = "Snapshot_$($_.Id)_$([System.DateTime]::Now.ToString('yyyyMMdd_HHmmss')).png"
    # 需要 Add-Type 调用 user32.dll 等 API,这里简化展示思路
    Write-Host "Taking snapshot of window ID: $($_.Id) -> $filename"
    # 实际截图需调用 .NET 的 Graphics.CopyFromScreen 或第三方库
}
  • 完整实现需要一些 API 调用,但在有 Python 的环境下,用 pygetwindow + PIL 更简单,核心代码只需几行。

通用型:一键多快照工具(推荐)

如果你经常需要做这类操作,可以使用 Python 脚本把逻辑集中起来,支持 CSV 配置文件:

# batch_snapshot.py (简易框架)
import subprocess
import csv
import datetime
def create_vm_snapshot(vm_path, snap_name):
    subprocess.run(["vmrun", "snapshot", vm_path, snap_name])
def create_disk_snapshot(disk_id, region):
    subprocess.run(["aliyun", "ecs", "CreateSnapshot", "--DiskId", disk_id, "--RegionId", region])
# 从 CSV 读取任务
with open('snapshot_tasks.csv', 'r') as f:
    reader = csv.DictReader(f)
    for row in reader:
        task_type = row['type']
        target = row['target']
        timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
        snap_name = f"AutoSnap_{timestamp}"
        if task_type == 'vmware':
            create_vm_snapshot(target, snap_name)
        elif task_type == 'aliyun':
            create_disk_snapshot(target, row['region'])
        # ...扩展更多类型
        print(f"✅ Snapshot created for {target}")

CSV 文件示例 snapshot_tasks.csv

type,target,region
vmware,/path/to/machine.vmx,
aliyun,d-bp1xxxxx01,cn-hangzhou
aliyun,d-bp1xxxxx02,cn-beijing

重要提醒(针对批量快照)

  1. 检查依赖:确保命令行工具已安装并配置好(vmrunaliyunawszfs)。
  2. API 频率限制:云服务商通常对批量创建快照有速率限制(如 QPS=10),脚本中加入 sleep 1 是良好的习惯。
  3. 快照是有成本的:无论是存储空间还是费用,批量快照如果长期保留,需要及时清理过期快照。
  4. 应用一致性:对数据库虚拟机的快照,建议使用静默快照或提前触发锁表/冻结 I/O,否则恢复后数据库可能需要修复。

你需要针对哪种场景(虚拟机/云磁盘/文件系统/截图)的脚本?我可以给你写一个可以直接运行的具体版本。

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