From 5901afdaaed3766ec9f179cc187185be2436f163 Mon Sep 17 00:00:00 2001 From: m8in Date: Sat, 21 Jun 2025 00:39:42 +0200 Subject: [PATCH] zfs snaphots --- script/zfs/snapshot/snapshot-cleanup.sh | 33 ++++++++++++++ script/zfs/snapshot/snapshot-minutly.sh | 13 ++++++ script/zfs/snapshot/snapshot.sh | 57 +++++++++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100755 script/zfs/snapshot/snapshot-cleanup.sh create mode 100755 script/zfs/snapshot/snapshot-minutly.sh create mode 100755 script/zfs/snapshot/snapshot.sh diff --git a/script/zfs/snapshot/snapshot-cleanup.sh b/script/zfs/snapshot/snapshot-cleanup.sh new file mode 100755 index 0000000..df9a96a --- /dev/null +++ b/script/zfs/snapshot/snapshot-cleanup.sh @@ -0,0 +1,33 @@ +#!/bin/bash +MIN_MIN=$(date --date="- 5 minutes" -u "+%Y%m%d%H%M") +HOUR_MIN=$(date --date="- 1 days" -u "+%Y%m%d%H") +DAY_MIN=$(date --date="- 7 days" -u "+%Y%m%d") +MONTH_MIN=$(date --date="- 3 years" -u "+%Y%m") + +zfs list -Hr -o name -t snapshot -r "zpool1/persistent" | grep -E "^zpool1/persistent/[a-zA-Z0-9_-]+@(SNAPHOURLY|SNAPDAILY|SNAPMONTHLY|SNAPMINUTLY)_[0-9]{6,12}$" | while read SNAPSHOT; do + SNAPSHOT_TIME=$(echo "$SNAPSHOT" | grep -oE "[0-9]+$") + if [[ ${#SNAPSHOT_TIME} == 12 && "$SNAPSHOT_TIME" < "${MIN_MIN}" ]]; then + zfs destroy "${SNAPSHOT}" + fi + if [[ ${#SNAPSHOT_TIME} == 10 && "$SNAPSHOT_TIME" < "${HOUR_MIN}" ]]; then + zfs destroy "${SNAPSHOT}" + fi + if [[ ${#SNAPSHOT_TIME} == 8 && "${SNAPSHOT_TIME}" < "${DAY_MIN}" ]]; then + zfs destroy "${SNAPSHOT}" + fi + if [[ ${#SNAPSHOT_TIME} == 6 && "${SNAPSHOT_TIME}" < "${MONTH_MIN}" ]]; then + zfs destroy "${SNAPSHOT}" + fi +done + + + +MONTH_MIN_QA=$(date --date="- 1 month" -u "+%Y%m") + +zfs list -Hr -o name -t snapshot -r "zpool1/persistent" | grep -E "^zpool1/persistent/[a-zA-Z0-9_-]+-qa@SNAPMONTHLY_[0-9]{6}$" | while read SNAPSHOT_QA; do + SNAPSHOT_TIME_QA=$(echo "$SNAPSHOT_QA" | grep -oE "[0-9]+$") + if [[ "${SNAPSHOT_TIME_QA}" < "${MONTH_MIN_QA}" ]]; then + zfs destroy "${SNAPSHOT_QA}" + fi +done + diff --git a/script/zfs/snapshot/snapshot-minutly.sh b/script/zfs/snapshot/snapshot-minutly.sh new file mode 100755 index 0000000..a2ce53a --- /dev/null +++ b/script/zfs/snapshot/snapshot-minutly.sh @@ -0,0 +1,13 @@ +#!/bin/bash +PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin + +_TIMESTAMP="$(date -u "+%Y%m%d%H%M")" +_ZFS_FILESYSTEM="${1:?"Missing first parameter ZFS_FILESYSTEM."}" +echo "${_ZFS_FILESYSTEM}" | grep -E '\-prod$' &> /dev/null \ + && zfs snapshot "${_ZFS_FILESYSTEM}@SNAPMINUTLY_${_TIMESTAMP}" \ + && exit 0 + +echo "Snapshot konnte nicht angelegt werden:" +echo " - ${_ZFS_FILESYSTEM}@SNAPMINUTLY_${_TIMESTAMP}" +echo " (Minuten-Snapshots sollen nur auf 'PROD'-Containeren angelegt werden, sodass diese dann syncronisiert werden)" +exit 1 diff --git a/script/zfs/snapshot/snapshot.sh b/script/zfs/snapshot/snapshot.sh new file mode 100755 index 0000000..a48999b --- /dev/null +++ b/script/zfs/snapshot/snapshot.sh @@ -0,0 +1,57 @@ +#!/bin/bash +HOUR=$(date -u "+%Y%m%d%H") +DAY=${HOUR:0:8} +MONTH=${HOUR:0:6} +HOSTOWNER=$(cat /invra/hostowner) +if [ ! -d /tmp/locks ]; then + mkdir /tmp/locks +fi + +zfs list -Hr -o name zpool1/persistent | grep -v -- -BACKUP | tail -n +2 | while read DATASET; do + CONTAINER=${DATASET#zpool1/persistent/} + ( + flock -n 9 || exit 1 + + MODE_FILE="/invra/state/$HOSTOWNER/containers/$CONTAINER/snapshot-mode" + HOURLY=1 + DAILY=1 + MONTHLY=1 + + if [ -f "$MODE_FILE" ]; then + grep -i "NONE" "$MODE_FILE" &> /dev/null + if [ $? -eq 0 ]; then + exit + fi + grep -i "HOURLY" "$MODE_FILE" &> /dev/null + if [ $? -ne 0 ]; then + HOURLY=0 + fi + grep -i "DAILY" "$MODE_FILE" &> /dev/null + if [ $? -ne 0 ]; then + DAILY=0 + fi + grep -i "MONTHLY" "$MODE_FILE" &> /dev/null + if [ $? -ne 0 ]; then + MONTHLY=0 + fi + fi + SNAPSHOT_HOUR="${DATASET}@SNAPHOURLY_${HOUR}" + SNAPSHOT_DAY="${DATASET}@SNAPDAILY_${DAY}" + SNAPSHOT_MONTH="${DATASET}@SNAPMONTHLY_${MONTH}" + + zfs list -H -t snapshot -o name -r "$DATASET" | grep -E "^${SNAPSHOT_HOUR}$" > /dev/null + if [[ $? -ne 0 && $HOURLY -eq 1 ]]; then + zfs snapshot "${SNAPSHOT_HOUR}" + fi + + zfs list -H -t snapshot -o name -r "$DATASET" | grep -E "^${SNAPSHOT_DAY}$" > /dev/null + if [[ $? -ne 0 && $DAILY -eq 1 ]]; then + zfs snapshot "${SNAPSHOT_DAY}" + fi + + zfs list -H -t snapshot -o name -r "$DATASET" | grep -E "^${SNAPSHOT_MONTH}$" > /dev/null + if [[ $? -ne 0 && $MONTHLY -eq 1 ]]; then + zfs snapshot "${SNAPSHOT_MONTH}" + fi + ) 9>>/tmp/locks/snapshot.${CONTAINER}.lock +done