Вот скрипт, который я использую для резервного инкрементного копирования, средствами 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
Комментарии