Následující skript zálohuje vybrané adresáře přímo na pásku. Lze nastavit tak, aby rotoval dvě (nebo více) pásek.
Pásky jsou po založení vždy smazány. Doporučuji rotovat několik pásek pro kompletní zálohu (a jednu kopii odnášet mimo serverovnu). Toto chování lze vypnout volbou SWAPPING a zálohovat pouze na jednu pásku (toto není otestováno, možná tam bude chybka).
#!/bin/bash # BAckup Script TAR Directories -- direct tape backup script # # Call this every night (from cron). On Monday (here Tuesday night) # full backup is taken, every other day incremental backup is taken. # It`s highly recommended to swap at least two tapes (one # for full backups on Mondays, second for other days). # # The script no longer operates with TAR. It uses AFIO now. # # directories to backup (separated by spaces) DIRS="/home /etc" # device to backup to (can be also a tar file) DEVICE="/dev/tape" #DEVICE="/tmp/backup.cpio" # do you swap two or more tapes # setting this to "1" will ERASE tape every Tuesday! SWAPPING=1 # e-mail of the tape operator (or empty string for no mails) TAPEOPER="ja@nekde.cz" # additional e-mail to send mails to with "-c " prefix (or empty string) CCOPER="" #CCOPER="-c kopie@nekde.cz" # mt binary and additional flags (e.g. tape device) MT="mt" #MT="test" # date of the week (0=Sunday, 1=Monday, ...) DATEOFWEEK=`date +%u` #DATEOFWEEK=4 # array of days DAYS[1]=1 DAYS[2]=2 DAYS[3]=3 DAYS[4]=4 DAYS[5]=5 DAYS[6]=6 DAYS[7]=1 # array of days (tomorrow for every day) TDAYS[1]=2 TDAYS[2]=3 TDAYS[3]=4 TDAYS[4]=5 TDAYS[5]=6 TDAYS[6]=7 TDAYS[7]=1 # afio program AFIO="/usr/local/sbin/afio" # compression program (-P $LZOP -Q -9 ) # lzop is slower in compression and provides similar results as zlib #LZOP="/usr/local/sbin/lzop" # logs LOG=/var/log/bastard-$DATEOFWEEK.log LOGERR=/var/log/bastard-$DATEOFWEEK-err.log FLIST=/var/log/bastard-$DATEOFWEEK-files.txt TIME=/var/log/bastard-${DAYS[$DATEOFWEEK]}.ts TIMET=/var/log/bastard-${TDAYS[$DATEOFWEEK]}.ts function do_backup { # wait some time sleep 1s # store the timestamp for tomorrow touch $TIMET # prepare find date >$LOG if [ $1 == "1" ]; then FINDPARMS=(-not -iregex '.*\.\(avi\|mpg\|mpeg\|wmv\|jpg\|jpeg\|bmp\|tif\|tiff\)'); else FINDPARMS=(-not -iregex '.*\.\(avi\|mpg\|mpeg\|wmv\|jpg\|jpeg\|bmp\|tif\|tiff\)' -cnewer $TIME); fi # go find $DIRS ${FINDPARMS[@]} | \ tee $FLIST | \ $AFIO -o -Z $DEVICE >>$LOG # print status of the tape sleep 2s $MT status >>$LOG date >>$LOG } function eject_tape { # rewind and eject the tape sleep 2s $MT status >>$LOG sleep 2s if [ $SWAPPING == "1" ]; then $MT offline fi } if [ $DATEOFWEEK == "2" ]; then # Monday -- erase tape, full backup $MT rewind do_backup 1 if [ $TAPEOPER != "" ]; then mail $CCOPER -s 'Probehne prirustkova zaloha - vymente pasku' $TAPEOPER <<! Dobry den, v noci probehla kompletni zaloha, nyni vlozte pasku oznacenou jako PRIRUSTKOVA ZALOHA. Paska bude smazana a po zbytek tydne se budou zalohovat jen zmenene a nove soubory. Pasku oznacenou jako KOMPLETNI ZALOHA budete potrebovat zase pristi pondeli. ! fi eject_tape elif [ $DATEOFWEEK == "3" ]; then # Tuesday -- tape erase (?), inc backup if [ $SWAPPING == "1" ]; then $MT rewind fi do_backup 0 elif [ $DATEOFWEEK == "1" ]; then # Sunday -- send e-mail about tape swapping if [ $TAPEOPER != "" ]; then mail $CCOPER -s 'Probehne kompletni zaloha - vymente pasku' $TAPEOPER <<! Dobry den, v pondeli v noci probehne kompletni zaloha systemu. Vlozte proto pasku oznacenou KOMPLETNI ZALOHA. V utery rano pak bude nutne vratit zpet pasku PRIRUSTKOVA ZALOHA. Doporucujeme rotovat nekolik pasek oznacenych jako KOMPLETNI ZALOHA a nekterou kopii ukladat na bezpecne misto mimo budovu. ! fi # rewind to last data written $MT eod do_backup 0 eject_tape else # all other days -- inc backup only # rewind to last data written $MT eod do_backup 0 fi
Diskuze