Настройка резервного копирования средствами zfs для freebsd

Опубликовано beregov.a.e - вт, 09/19/2017 - 17:59

Вот скрипт, который я использую для резервного инкрементного копирования, средствами zfs.

cat /root/bin/backup_zfs.sh
#!/usr/local/bin/bash # интерпретатор который исполняет скрипт
date=`date +%Y-%m-%d_%H-%M` # date gggg-mm-dd   # Дата в удобном формате
pool='wsit' # Имя zfs пула на тот случай, чтобы делать снимок системы рекурсивно
#zfs snapshot -r $pool@$date # Для того чтобы сделать рекурсивно snapshot.
zfs snapshot wsit/usr/home@${date} # В моём случаи мне не нужен рекурсивный снапшот. Я указал нужные разделы
zfs snapshot wsit/usr@${date} #
mass1=`for  (( i=0; i<=14 ; i++ )) ; do date -v-${i}d +%Y-%m-%d ; done` # тут создаётся массив дат.
mass2=`echo ${mass1} | sed 's![ \t]!\\\|!g'`  # Здесь его экранирую.                                                                                              
del_snapshot=`zfs list -t snapshot | grep -v ${mass2} | grep -v NAME | awk '{print$1}'` # Тут подготавливаю список снапшотов на удаление.                                                                                                  
for j in ${del_snapshot[@]}; do zfs destroy $j; done # Само удаление.

Как я этим пользуюсь

Из под пользователя root или sudo

 

 # zfs list -t snapshot
NAME                             USED  AVAIL  REFER  MOUNTPOINT
wsit/usr/home@2017-09-26_02-00  27,9M      -   401G  -
wsit/usr/home@2017-09-26_03-00  27,8M      -   401G  -
wsit/usr/home@2017-09-26_04-00  27,9M      -   401G  -
wsit/usr/home@2017-09-26_05-00  27,9M      -   401G  -
wsit/usr/home@2017-09-26_06-00  27,8M      -   401G  -
wsit/usr/home@2017-09-26_07-00  27,8M      -   401G  -
wsit/usr/home@2017-09-26_08-00  27,9M      -   401G  -
wsit/usr/home@2017-09-26_09-00  36,5M      -   401G  -
wsit/usr/home@2017-09-26_10-00   215M      -   401G  -
wsit/usr/home@2017-09-26_11-00  38,7M      -   401G  -
Выбираю нужный меня снимок и подключаю его в удобную директорию. В основном в /mnt

#ls /mnt/

#mount -t zfs wsit/usr/home@2017-09-25_09-00 /mnt/

ls /mnt/

unixskills.ru

После того, как скопировал необходимый файл,

отключаем снимок

#umount /mnt

Плюсы и минусы данного решения:

Минусы:

1 Данные и снимки хранятся на одном диске.

2 Если нужно будет передать снимок, то это очень затратно.

Плюсы:

1 Снимок делается мгновенно.

2 Копится только разница.

3 Не требует специальных программ для работы, всё есть в штатной поставке ОС.

4 Быстро можно откатить изменения командой zfs rollback

Более подробно можно ознакомится по этой ссылке

P.S 2018 год 6 августа.

Столкнулся с небольшой проблемой. При обслуживании сервера.(Замена термопасты, продувка от пыли, проверка заряда батарейки и.т.д) сбилось время, на 2016 год. И скрипт удалил все снимки. Собственно на тот момент это было не критично. Но всё же не очень приятно. Из-за чего пришлось немного изменить скрипт. Чтобы обезопасить себя. Сделать проверку текущего года.

#!/usr/local/bin/bash
data_run=`date +%Y` # Текущий год
backup () {
date=`date +%Y-%m-%d_%H-%M` # date gggg-mm-dd
pool='files'
zfs snapshot -r $pool@$date
mass1=`for  (( i=0; i<=31 ; i++ )) ; do date -v-${i}d +%Y-%m-%d ; done`
mass2=`echo ${mass1} | sed 's![ \t]!\\\|!g'`
del_snapshot=`zfs list -t snapshot | grep -v ${mass2} | grep -v NAME | awk '{print$1}'`
for j in ${del_snapshot[@]}; do zfs destroy $j; done
}
if [ $data_run -ge 2018 ]; # Проверяем какой сегодня год. Если больше 2018 или равно то выполняем создание снимка и удаление старого
then
        backup
fi

Теги