Zabezpieczenie danych - system ZFS

Z Baza Wiedzy
Skocz do: nawigacji, wyszukiwania

System plików ZFS charakteryzuje się dużą pojemnością i jest zależny od ilości dostępnych dysków twardych. Jest bardzo odporny na wszelkiego rodzaju błędy. Jednak pomimo tego faktu, warto zdecydować się na jakąś metodę zabezpieczenia danych np. za pomocą skryptu w powłoce BASH, który nie jest idealny, ale zawsze może być jakąś alternatywą.

backup_zfs.sh

#!/usr/local/bin/bash

LOCK="/tmp/backup.lock"
if [ -f ${LOCK} ]; then
    exit
fi

/usr/bin/touch ${LOCK}

current=$(/bin/date -u '+%F')

# backup location
backupdir=/backup/zfs/

exist_in_array() {
    local tmparr tmpval=$1
    shift
    for tmparr; do
        [[ $tmparr == $tmpval ]] && return 0
    done
    return 1
}

# exclude ZFS filesystems
declare -a Excludes
index=0
 for EXC in `/bin/cat exclude.txt`
  do
    Excludes[index]="$EXC"
    ((index++))
  done

# name zpool
zpoolname=$(/sbin/zpool list -H -o name)

# create ZFS snapshots
 for filesystem in $( /sbin/zfs list -o name | /usr/bin/grep $zpoolname ) ; do
  exist_in_array $filesystem "${Excludes[@]}" && BACKUP=no || BACKUP=yes
  case $BACKUP in
   "yes" )
    # -------------------- Begin Snapshot -----------------------
    snap=$(echo "$filesystem@$current")
    com=$(zfs snapshot $snap > /dev/null 2>&1)
    # -------------------- End  Snapshot  -----------------------
    ;;
  esac
 done

 echo "Processing..."

# latest available snapshot
 com=$(zfs list -tsnapshot -oname | /usr/bin/grep $zpoolname)

 if [ -z "$com" ]; then
  echo "No datasets available... "
  /bin/rm -f ${LOCK} > /dev/null 2>&1
  exit 0
 fi

snapshots=( $com );
 
# display snapshot information 
# for (( i=0; i<${#snapshots[@]}; i++ )); do
#    echo "["$i"] "${snapshots[$i]};
# done;

# snapshot - backup 
for x in "${snapshots[@]}"
do
 filename=$(echo $x|sed 's/\//-/g')
 com=$(zfs send $x | gzip > $backupdir$filename.gz)
 echo "Snapshot $x."
done

 echo "Done."

# delete all snapshots
for snapshot in `/sbin/zfs list -H -t snapshot | /usr/bin/cut -f 1`
 do
  if [ `zfs get -H type $snapshot | awk '{print $3}'` == "snapshot" ]; then
   /sbin/zfs destroy $snapshot
  fi 
 done

/bin/rm -f ${LOCK} > /dev/null 2>&1
exit 0