gongxiangp2/check-zfs-snapshots.sh

101 lines
2.7 KiB
Bash

#!/bin/bash
# 检查ZFS快照脚本
# 在TrueNAS系统上运行
set -e
DATASET="PoolOne/apps/youyidian-3d"
TARGET_DIR="/mnt/PoolOne/apps/youyidian-3d/uploads"
echo "=========================================="
echo "ZFS快照检查脚本"
echo "=========================================="
echo ""
echo "目标数据集: $DATASET"
echo "目标目录: $TARGET_DIR"
echo ""
# 检查数据集是否存在
if ! zfs list "$DATASET" >/dev/null 2>&1; then
echo "❌ 错误: 数据集 $DATASET 不存在"
echo ""
echo "可用数据集列表:"
zfs list -o name | grep -E "PoolOne/apps" | head -10
exit 1
fi
echo "✅ 数据集存在"
echo ""
# 检查快照
echo "🔍 检查快照..."
echo ""
SNAPSHOTS=$(zfs list -t snapshot -o name,creation,used "$DATASET" 2>/dev/null | tail -n +2)
if [ -z "$SNAPSHOTS" ]; then
echo "❌ 未找到快照"
echo ""
echo "💡 建议:"
echo " 1. 检查TrueNAS管理界面中的快照设置"
echo " 2. 考虑从备份文件恢复"
echo " 3. 检查是否有其他数据集的快照"
else
echo "✅ 找到以下快照:"
echo ""
echo "$SNAPSHOTS" | while read -r line; do
echo " $line"
done
echo ""
# 查找1月13日之前的快照
echo "🔍 查找1月13日09:15之前的快照..."
RECENT_SNAPSHOTS=$(echo "$SNAPSHOTS" | awk '$2 <= "2026-01-13 09:15" {print $1}' | tail -5)
if [ -n "$RECENT_SNAPSHOTS" ]; then
echo "✅ 找到相关快照:"
echo ""
echo "$RECENT_SNAPSHOTS" | while read -r snap; do
echo " - $snap"
done
echo ""
echo "💡 可以使用以下命令恢复:"
echo " zfs clone <快照名> PoolOne/apps/youyidian-3d-recovered"
echo " 或"
echo " zfs rollback <快照名>"
else
echo "⚠️ 未找到1月13日09:15之前的快照"
fi
fi
echo ""
echo "=========================================="
echo "检查父数据集的快照..."
echo "=========================================="
echo ""
# 检查父数据集的快照
PARENT_DATASETS=(
"PoolOne/apps"
"PoolOne"
)
for parent in "${PARENT_DATASETS[@]}"; do
if zfs list "$parent" >/dev/null 2>&1; then
echo "检查 $parent 的快照..."
PARENT_SNAPSHOTS=$(zfs list -t snapshot -o name,creation "$parent" 2>/dev/null | tail -n +2 | head -10)
if [ -n "$PARENT_SNAPSHOTS" ]; then
echo "$PARENT_SNAPSHOTS" | while read -r line; do
echo " $line"
done
echo ""
else
echo " 未找到快照"
echo ""
fi
fi
done
echo "=========================================="
echo "检查完成"
echo "=========================================="