2gusia (2gusia) wrote,
2gusia
2gusia

Category:

ZFS backup - ZFS send/receive на локальный диск

В прошлый раз мы создали ZFS пул на съёмном диске, на первый взгляд затея сомнительной полезности. Сегодня мы применим немного магии zfs для создания инкрементальных бекапов на этом диске. Можно и круче, на другом NAS, но об этом в следующий раз.

1. Физически подключаем диск и даём команду
nas4free:~# zpool import -d /dev/gpt USB_2AS

Естественно, подставить имя своего пула - я соединил в USB_2AS вид носителя и конец серийного номера своего диска. У вас он будет другим.

2. Идем в профильную ветку и видим любезно опубликованный камрадом Oleg Pyzhov скрипт. Копируем его в буфер, открываем файловый редактор nas4free, копируем в него скрипт и сохраняем скрипт куда-то на физический носитель под именем zfsbackup.sh. Я использую для таких скриптов раздел на флешке, оставшийся после инсталляции nas4free. Он смонтирован как /mnt/Flash. Поэтому у меня путь к файлу будет /mnt/Flash/zfsbackup.sh

3. Открываем файловый редактор nas4free и изменяем права на скрипт - владельцу rwx, остальным только r. Запускать скрипт будем от root.

4. Теперь осталось выбрать файловую систему (= датасет), который мы будем копировать и указать куда копировать.

Посмотреть все файловые системы можено командой zfs list, например у меня
nas4free:~# zfs list
NAME          USED  AVAIL  REFER  MOUNTPOINT
Pool         7.26T  1.32T  16.1G  /mnt/Pool
Pool/Backup   361G  1.32T   361G  /mnt/Pool/Backup
Pool/Media   6.10T  1.32T  6.10T  /mnt/Pool/Media
Pool/Music    687G  1.32T   687G  /mnt/Pool/Music
Pool/Photo   46.3G  1.32T  46.3G  /mnt/Pool/Photo
Pool/VM      77.1G  1.32T  77.1G  /mnt/Pool/VM
Pool/qqq     19.0M  1.32T  19.0M  /mnt/Pool/qqq
USB_2AS       468K   109G   144K  /mnt/USB_2AS
WD2T         1.73T  51.6G   152K  /mnt/WD2T
WD2T/Files   1.73T  51.6G  1.73T  /mnt/WD2T/Files
WD2T/log      740K  51.6G   740K  /mnt/WD2T/log


Для примера я скопирую тестовый датасет Pool/qqq на USB_2AS. Можно прямо на USB_2AS, но мне удобнее на USB_2AS/qqq
nas4free:~# /mnt/Flash/zfsbackup.sh Pool/qqq USB_2AS/qqq
receiving full stream of Pool/qqq@backup_2013_05_02_00_10_58 into USB_2AS/qqq@backup_2013_05_02_00_10_58
received 35.4MB stream in 1 seconds (35.4MB/sec)


5. Если зайти фаловым менеджером или по ftp на USB_2AS/qqq, то можно увидеть там копию Pool/qqq - работает.

6. Но мы обещали инкрементальный бекап. Давайте для примера добавим файл в Pool/qqq и сотрём файл из USB_2AS/qqq, а затем повторим команду
nas4free:~# /mnt/Flash/zfsbackup.sh Pool/qqq USB_2AS/qqq
receiving incremental stream of Pool/qqq@backup_2013_05_02_00_15_39 into USB_2AS/qqq@backup_2013_05_02_00_15_39
received 5.27MB stream in 1 seconds (5.27MB/sec)


Смотрим - новый файл передан, как и ранее стертый из бекапа, старые файлы не передавались - бинго! Имеем быстрый инкрементальный бекап на уровне файловой ситсемы.

7. Пул на USB диске можно отмонтировать
nas4free:~# zpool export USB_2AS

Диск физически отключить и положить на полочку.

8. Важное примечание о снимках (=слепки, =снапшоты). Механизм zfs send-receive работает через снимки. То есть передаётся не сама файловая система (она может измениться за то время, пока идёт передача), а сначала с неё делается снимок, а затем снимок передаётся. Скрипт автоматически создаёт снимки и сохраняет только последние два на приёмнике. Но на стороне-передатчике сохраняются все снимки. Это может быть полезно, если понадобится вернуться к строму состоянию. Но снимки, сохранющие уже не нужные удалённые файлы, занимают место. Их можно уничтожить вручную, через CLI, или через вебгуй Диски|ZFS (Zettabyte File System)|Слепки|Слепок

Уже с благодарностью упомянутый Oleg Pyzhov предложил (помимо прочего интересного) также скрипт delsnap.sh для удаления лишних снимков, созданных его предыдущим скриптом.
UPD от 9 марта 2014 Здесь я чуть-чуть подпилил этот скрипт для защиты от дурака.

#!/bin/sh
backpool=$1
MAXSNAPBACKPOOL=$2

numsnap=`zfs list -H -o name -t snapshot|grep "${backpool}@backup"|wc|awk '{ print $1 }'`
let MAXSNAPBACKPOOL=numsnap-MAXSNAPBACKPOOL >/dev/null
if [ $MAXSNAPBACKPOOL -gt 0 ] ; then
for d in `zfs list -H -o name -t snapshot|grep "${backpool}@backup"|/usr/bin/head -n"$MAXSNAPBACKPOOL"`; do
zfs destroy ${d}
done
fi

Первый параметр - с какого датасета удалять лишние снапшоты. В моём примере Pool/qqq; второй параметр - сколько снимков оставлять, например 2. Вызванный без параметров скрипт удаляяет все снимки, созданные скриптом zfsbackup.sh
(Прим. Возможно, стоит вкрячить второй скрипт в первый, я подумаю)

ВАЖНО если удалить последний снимок на стороне-передатчике, то скрипт сделает полный бекап вместо инкрементального.

9. Необязательное примечание про механику zfs send-receive для тех, кого не удовлетворяют некие волшебные скрипты.

Естественно, всё это (и много чего другого) можно сделать через стандартные команды. Например,
zfs snapshot sender/data@1 - создать снимок
zfs send sender/data@1 | zfs receive receiver/data - передать и принять полную файловую систему
Изменить содержимое передатчика,
zfs snapshot sender/data@2 - создать второй снимок
zfs send -i sender/data@1 sender/data@2 | zfs receive receiver/data - передать и принять инкрементальный поток

PS По ссылке из 8 пункта описано гораздо более продвинутое решение - zfs send-receive на удалённый шифрованный бекап-NAS, который стоит в потенциально доступном посторонним месте. И если его украдут, информация не будет доступна вору. Если, что не факт, я себе такое сделаю - опишу. Хотя скорее ограничусь просто пересылкой с одного NAS на другой, но через mbuffer. UPD on 9 марта 2014. Тк mbuffer из коробки не доступен, а netcat есть, его и предпочёл
Tags: backup, nas, nas4free, zfs, руками
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

  • 23 comments