Резервное копирование данных локально и через ssh

Аватар пользователя _z10_

В общем сначала кратко потом может доведу до ума.

Резервное копирование всего и вся на своем компьютере

Создаем такой файл и кладем его в /etc/cron.*- выбираем периодичность


#!/bin/bash
## Резервирование данных

BACKUP_DIRS="/home/111 /home/222" ## Указываем через пробел каталоги которые надо бэкапить
BACKUP_FILENAME=`date '+%d.%b%Y'`
BACKUP_DEST_DIR="/home/Back_up" ## Указываем каталог куда положить файл бэкапа
BACKUP_OTHER_DEST_DIR="/mnt/" ## Указываем второй винт куда будем класть копию бэкапа, если это вам не нужно стираем тут и ниже
BACKUP_EXT_DEST_DIR="/mnt/hdd_ext/" ##Указываем еще один винт куда будем класть копию бэкапа (да я пароноик, но один раз потеряв все что было нажито непосильным трудом в течении нескольких лет, понимаешь, что мало бэкапов не бывает) и вообще люди делятся на тех кто делает бекапы и кто еще их не делает :-)
SLOG="$BACKUP_DEST_DIR/backup_DATA.log"

exec >> $SLOG 2>&1

echo -e "`date` *** Резервирование данных начато">>$SLOG
start=$(date +%s)

tar cvjf $BACKUP_DEST_DIR/Data_$BACKUP_FILENAME-back_up.tar.bz2 $BACKUP_DIRS --exclude /home/111/2222 > /dev/null
## параметром --exclude /home/111/2222 > /dev/null мы создадим в архиве пустую папку /home/111/2222 т.е. мы не будем включать в архив ее содержимое но создадим ее.

#j-создает архив .tar.bz2
#z-создает архив .tar.gz
#c-создать архив
#v-подробный вывод процесса архивации
#f-писать в файл а не на магнутную ленту
#t-подробный вывод на экран
find "$BACKUP_DEST_DIR" -ctime +15 -exec rm -r -f {} \;
echo -e "создание архива данных завершено">>$SLOG
echo -e "--------------------------------------------------------------------------------------">>$SLOG
#копирование на 3Тб винт
echo -e "копирование на 3 Тб винт началось">>$SLOG
/usr/bin/rsync -rchv -t --delete $BACKUP_DEST_DIR $BACKUP_OTHER_DEST_DIR/

echo -e "Копирование на 3 Тб винт завершено">>$SLOG
echo -e "--------------------------------------------------------------------------------------">>$SLOG
#копирование на внешний винт
echo -e "копирование на внешний винт началось">>$SLOG
/usr/bin/rsync -rchv -t --delete $BACKUP_DEST_DIR $BACKUP_EXT_DEST_DIR/
/usr/bin/rsync -rchv -t --delete $BACKUP_DEST_DIR $BACKUP_OTHER_DEST_DIR/
echo -e "Копирование на внешний винт завершено">>$SLOG
echo -e "--------------------------------------------------------------------------------------">>$SLOG

finish=$(date +%s)

echo -e "`date` *** Резервное копирование данных длилось $((finish - start)) секунд">>$SLOG
echo -e "`date` *** Размер файла бекапа `du -sh $BACKUP_DEST_DIR/Data_$BACKUP_FILENAME-back_up.tar.bz2 | awk '{print $1}'` ">>$SLOG
echo -e "`date` *** Размер папки с бекапом данных `du -sh $BACKUP_DEST_DIR | awk '{print $1}'` ">>$SLOG
echo -e "--------------------------------------------------------------------------------------">>$SLOG
echo -e "######################################################################################">>$SLOG
echo -e "######################################################################################">>$SLOG
echo -e "--------------------------------------------------------------------------------------">>$SLOG


теперь по сети через ssh и rsync

генерируем ключ для авторизации в ssh по ключу


ssh-keygen -t rsa

копируем ключ на сервер ну или на ту машину бэкап которой будем делать


ssh-copy-id -i id_rsa.pub root@IP_или_доменное_имя_машины_бэкап_которой_будем делать


Проверяем права доступа и владельца папки /root/.ssh права 700 владелец root

теперь создаем, в соответствии с описанием ниже, файл и кладем его в /etc/cron.*- выбираем периодичность


#!/bin/sh
# simple rsync backup script written by farmal.in 2011-01-21
#
# latest backup is always in $SDIR/domains/$domain/latest folder
# all backups which are older than 7 days would be deleted
# backup.ini file can't contain comments, empty lines and spaces in domain names
#
# example of a GOOD backup.ini:
# mydomain.com user@mydomain.com:/path/to/public_html
#

SDIR="/home/Back_up/VDS"
SLOG="$SDIR/backup_VDS.log"
PID_FILE="$SDIR/backup-VDS.pid"
destination="$SDIR/data"

# VDS connect parametr
VDS="root@IP_или_доменное_имя_машины_бэкап_которой_будем делать"
VDS_DEST_DIR1="/srv"
VDS_DEST_DIR2="/home"

if [ -e $PID_FILE ]; then
echo "this task is already running or previous run was completed with errors on `hostname`"
exit
fi

touch $PID_FILE

# redirecting all output to logfile
exec >> $SLOG 2>&1

# downloading a fresh copy in 'latest' directory
echo -e "`date` *** VDS backup started">>$SLOG

# start counting rsync worktime
start=$(date +%s)

rsync -alzuogthvr --compress-level=9 $VDS:$VDS_DEST_DIR1 $destination/latest/
rsync -alzuogthvr --compress-level=9 $VDS:$VDS_DEST_DIR2 $destination/latest/home/

finish=$(date +%s)
echo -e "`date` *** RSYNC worked for $((finish - start)) seconds">>$SLOG

# cloning the fresh copy by hardlinking
cp --archive --link "$destination/latest" "$destination/`date +%F`"
# deleting all previous copies which are older than 7 days by creation date, but not 'latest'
find "$destination" -maxdepth 1 -ctime +7 -type d -path "$destination/????-??-??" -exec rm -r -f {} \;
echo "`date` *** The size of VDS/latest is now `du -sh $destination/latest | awk '{print $1}'` ">>$SLOG
echo -e "`date` *** VDS backup ended">>$SLOG
echo -e "`date` *** Total allocated `du -sh $destination | awk '{print $1}'`">>$SLOG
echo -e "------------------------------------------------------------------">>$SLOG

rm $PID_FILE


P.S. Если тут кто-то встретит свои труды то не обижайтесь.