江苏省吴江市双板桥路3号兴源网络

0512-63028342

ly@wjxy.net.cn

PVE 的自动快照批处理

一、 建立自动快照程序
/etc/snapshot/snapshot.sh

#!/bin/bash

# 完整路径定义,避免cron环境问题
CONFIG_FILE="/etc/snapshot/num.1"
MAX_SNAPSHOT=15
VM_IDS=(301 302 303)
QM_CMD="/usr/sbin/qm"  # 使用qm的完整路径

# 日志函数,便于调试
log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> /var/log/snapshot.log
}

# 初始化日志
log_message "=== 开始执行快照任务 ==="

# 检查qm命令是否存在
if [[ ! -x "$QM_CMD" ]]; then
    log_message "错误: 找不到qm命令或没有执行权限: $QM_CMD"
    exit 1
fi

# 读取计数器
if [[ -f "$CONFIG_FILE" ]] && [[ "$(cat "$CONFIG_FILE" 2>/dev/null)" =~ ^[0-9]+$ ]]; then
    i=$(cat "$CONFIG_FILE")
    log_message "从 $CONFIG_FILE 读取计数器值: $i"
else
    i=1
    log_message "配置文件不存在或格式错误,使用默认值: $i"
fi

# 快照操作函数
perform_snapshot_operations() {
    local snapshot_name="letter$1"
    local success_count=0
    local total_vms=${#VM_IDS[@]}

    log_message "处理快照: $snapshot_name"

    for vm_id in "${VM_IDS[@]}"; do
        # 删除旧快照(如果存在)
        if "$QM_CMD" delsnapshot "$vm_id" "$snapshot_name" 2>/dev/null; then
            log_message "  虚拟机 $vm_id: 删除旧快照 $snapshot_name 成功"
        else
            log_message "  虚拟机 $vm_id: 没有找到快照 $snapshot_name (可能不存在)"
        fi

        # 创建新快照
        if "$QM_CMD" snapshot "$vm_id" "$snapshot_name" --description "auto"; then
            log_message "  虚拟机 $vm_id: 创建快照 $snapshot_name 成功"
            ((success_count++))
        else
            log_message "  虚拟机 $vm_id: 创建快照 $snapshot_name 失败"
        fi
    done

    log_message "完成: 成功处理 $success_count/$total_vms 台虚拟机"
}

# 根据计数器值执行操作
if [[ $i -lt $MAX_SNAPSHOT ]]; then
    log_message "当前计数器 $i < $MAX_SNAPSHOT,执行正常循环"
    perform_snapshot_operations "$i"
    ((i++))
else
    log_message "当前计数器 $i >= $MAX_SNAPSHOT,重置为1"
    i=1
    perform_snapshot_operations "$i"
fi

# 保存计数器值
if echo "$i" > "$CONFIG_FILE" 2>/dev/null; then
    log_message "保存计数器值 $i 到 $CONFIG_FILE 成功"
else
    log_message "错误: 无法保存计数器值到 $CONFIG_FILE"
    exit 1
fi

log_message "=== 快照任务执行完成 ===\n"
exit 0


二、 创建任务 修改crontab文件,#前最后一行加入
00 00 * * * root /etc/snapshot/snapshot.sh
三、 重新cron服务
Service cron restart

发表回复