· zfs snapshot all volumes & zfs rollback all volumes
针对zfs文件系统的全卷快照与回滚脚本(全盘备份与还原脚本/终端/命令行)
消歧义:本文的“全盘”词汇释义为“总体,全部;全面”。实际操作的是所有卷(volumes)。
1 全盘快照脚本
#!/bin/bash
# zfs_manual_create_snapshot.sh
# 快照名称前缀,可以根据需要修改
SNAPSHOT_PREFIX="user-manual-snapshot"
# SNAPSHOT_PREFIX="user-before-rollback"
# 获取当前日期和时间
DATE=$(date +%Y-%m-%d_%H-%M-%S)
# 组合快照名称
SNAPSHOT_NAME="${SNAPSHOT_PREFIX}-${DATE}"
# 获取所有 ZFS 文件系统和卷,排除已有快照
DATASETS=$(zfs list -H -o name | grep -v '@')
# 为每个数据集创建快照
for DATASET in $DATASETS; do
zfs snapshot "${DATASET}@${SNAPSHOT_NAME}"
if [ $? -eq 0 ]; then
echo "Snapshot created: ${DATASET}@${SNAPSHOT_NAME}"
else
echo "Failed to create snapshot for ${DATASET}"
fi
done
2 全盘回滚脚本
#!/bin/bash
#"/zfs_rollback.sh
echo "===zfs rollback all volumes script==="
# List all snapshot including "user-"
echo "Available manual snapshots:"
zfs list -H -o name -t snapshot | grep "user"
# user enter snapshot version
read -p "Enter the snapshot version (Example: 2024-06-27_19-40-51): " SNAPSHOT_VERSION
# user confirm rollback
read -p "zfs rollback to 'user-manual-snapshot-${SNAPSHOT_VERSION}'? (yes/no): " CONFIRMATION
if [ "$CONFIRMATION" != "yes" ]; then
echo "Rollback canceled"
exit 0
fi
# Do the rollback
for snapshot in $(zfs list -H -o name -t snapshot | grep "user-manual-snapshot-${SNAPSHOT_VERSION}"); do
zfs rollback -r $snapshot
if [ $? -eq 0 ]; then
echo "Rolled back: $snapshot"
else
echo "Failed to rollback: $snapshot"
fi
done
echo "Rollback Succeed"