Система DSM достаточно удобна и по умолчению в системе установлены модули, которые закрывают 95% потребностей рядового (и не очень) пользователя, что называется «из коробки».

Есть и встроенная система резервного копирования: Backup & Replication. Простая, понятная и надежная. В качестве сетевого места назначения в может использовать либо похожую Synology, либо rsync сервер.

К сожалению эта система не умеет делать инкрементальный бекап. Самый примитивный способ обойти это — настроить отдельный бекап на каждый день недели. Таким образом у нас будет 7 папок с резервными копиями, но очевидный минус — хранение полной копии в каждой папке — объем может получиться таким, что не каждый позволит себе такое хранилище.

Итак — настроим полноценный инкрементальный бекап.

Для начала нам нужен сервер с диском, достаточным для хранения архивов важных данных. Где именно он будет установлен — это зависит от возможностей каждого. Например это может быть виртуальный хостинг или старый системник или виртуальная машина на рабочем компьютере. Про надежность сервера архивации можно спорить, но даже само его наличие — огромный плюс к сохранности ваших персональных данных. Опять же, если в DSM включить уведомления на почту — вы ежедневно будете знать, не было ли ошибок во время резервного копирования и быстро вернете к жизни «упавший» сервер для хранения резервных копий.

Способ, которым сервер будет связываться с Synology (или наоборот) каждый выберет для себя сам — это может VPN, локальная сеть или обычный интернет. Я предпочитаю VPN, но описание настройки подключения выходит за рамки этой статьи (там могут быть нюансы и я опишу это позднее).

Теперь размер диска, на котором будут храниться архивы.

Содержимое домашних хранилок можно уверенно поделить на: Кино, Музыку, Фотки и обычные файлы-документы пользователя.
И если в случае утери данных Кино можно и не сложно скачать заново, Музыку — с большой вероятностью тоже, то Фото и личные файлы уже не восстановишь. Объем таких данных из моего личного опыта не превышает 50-100GB. Например, будем делать ежедневный и еженедельный бекап. Берем по максимуму: 100GB + 100GB – нам понадобится 200GB диск. Думаю? В наше время это редкость, а вот 500GB найти запросто!

Далее я буду рассказывать на примере виртуальной машины, но основная идея применима к любой системе на базе Linux (возможно и FreeBSD).

Итак — ставим Ubuntu server, и активируем на нем SSH и rsync:
Файловая система должна быть с обязательной поддержкой hardlink’ов. Поэтому оставим, предложенную по умолчанию, ext-4.

В принципе, rsync можно запустить и на Windows, но нам нужна поддержка хардлинков, а я не уверен, что rsync умеет корректно работать с виндовыми Junction.

Уточню про модель безопасности на сервере — она будет достаточно простая:

— отдельный пользователь для логина (для Synology)
— ограничение на папку для IP адреса на уровне rsync
— проверка польователей на уровне rsync – отсутствует, хотя может быть легко настроена
— если сервер находится в неблагонадежных сетях на нем рекомендуется включить firewall и ограничить доступ по IP.

Начинаем настройку — создадим папку для хранения архивов и дадим на нее права всем:

$sudo mkdir -p /bakstorage/syno
$sudo chmod 777 /bakstorage/syno

На сервере нам надо создать рядового пользователя, под которым Synology будет складывать архивные копии:

$sudo adduser backup

Правим конфиг rsync:

cat /etc/rsyncd.conf
# глобальные параметры:
motd file=/etc/motd
log file=/var/log/rsyncd

# название нашего блока
[syno]

# IP address нашего Synology     	
        hosts allow = 192.168.x.x
# коментарий, для удобства
        comment = Syno archive
# Путь к папке, которую мы делаем доступной и где будут храниться архивы
        path = /bakstorage/syno
# Ниже настройки по умолчанию
        use chroot = yes
        lock file = /var/lock/rsyncd
        read only = no
        list = yes
        uid = nobody
        gid = nogroup
        strict modes = yes
        ignore errors = no
        ignore nonreadable = yes
        transfer logging = no
        timeout = 600
        refuse options = checksum dry-run
        dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

И ставим его в автозагрузку:

$sudo update-rc.d rsync defaults

Перезагружаем, проверяем что все поднялось.

Теперь настраиваем архивацию в DSM. Создаем Network Backup Destination:



Создaем «Data Backup Task», затем создаем задание для ежедневного бекапа. Отмечаем папки, которые необходимо сохранять:



Отмечаем приложения (опционально):



И самое главное — делаем его ежедневным (последняя опция):



Выходим в главное окно приложения, выделяем созданное задание и нажимаем «Backup now» – первое копирование займет много времени. Последующие будут выполняться гораздо быстрее — передаваться будут только новые или измененные файлы.

После того, как копирование настроено и работает (можно понаблюдать за ним несколько дней) — приступаем к следующей части и добавим инкрементальное копирование. Для этого воспользуемся отличным свойством rsync:

Если оригинальный файл был изменен, а файл назначения является hardlink’ом, то при копировании hardlink “разрывается» и файл назначения заменяется измененной версией.


Опираясь на вышеупомянутое свойство rsync, все что нам надо — после окончания резервного копирования сделать копию папки с архивом командой: cp -al

Это создаст полную копию, но все файлы внутри будут являться hardlink’ами, таким образом дополнительное место на диске занято не будет. Ну разве что под дерево каталогов и подкаталогов. Будем называть это созданием снапшота. К слову: для папки размером в 100GB создание снапшота занимает не больше минуты.

Команду эту мы можем выполнять в любое время, после предполагаемого завершения резервного копирования или, например, за час перед ним.
Таким образом, если резервное копирование запускается в 3:00 и продолжается 6 часов (очень неблагоприятный сценарий — обычно все изменения копируются на порядок быстрее), то снапшот будем делать в 10 утра — чтобы днем мы могли убедиться, что все отработало как надо.

Следующий шаг — хранить N снапшотов и автоматом удалять самые старые. Кстати, при реализации такого удаления обычно удаляют папки, которые старше N дней. Но в случае, если архивация не делалась долгое время (по разным причинам) есть вероятность, что все папки с архивами будут удалены, как устаревшии, а новых — не будет! Поэтому мы учем это.

Ниже скрипты, которые будет делать для нас всю эту работу:

sudo cat /root/rotate_daily.sh

#!/bin/bash
# Выводим дату
echo -n "Started: "
date

# проверяем, что созданный архив, был создан позднее, чем последняя его копия
if [[ /bakstorage/syno/daily -nt /bakstorage/syno/daily_full ]]; then
    # Есть свежий архив - «сдвигаем» старые архивы
    /root/rotate_folders.sh /bakstorage/syno/daily_full 3
	 # создаем снапшот свежего архива 
    echo "Copying current backup..."
    cp -al /bakstorage/syno/daily /bakstorage/syno/daily_full
else
	 # по какой-то причине свежего архива нет — ничего не делаем 
    echo "No today backup found!"
fi

sudo cat /root/rotate_folders.sh
#!/bin/bash
# ver 1.0

path=$1
hold=$2

if [ -z $2 ]; then

cat <<EOT
Rotate folders script.
Usage: $0 <path_to_folder_prefix>  <folders_to_hold>

Warning! Folders deleted and renamed by mask: path_to_folder_prefix* so please be sure that no any folders in the path
Example: $0 /var/backup/daily 2
The result will be:
  /var/backup/daily   -> /var/backup/daily.1
  /var/backup/daily.1 -> /var/backup/daily.2
  /var/backup/daily.2 -> Deleted
EOT
exit 1
fi

num=$(ls -d $path* | wc -l)
let "num=num-hold"

if [ $num -gt 0 ]; then
    echo "ROTATE_FOLDERS: Found to delete: $num"
    del=$(ls -d $path* | sort | tail -n $num)
    echo "ROTATE_FOLDERS: Deleting folder(s):"
    echo "$del..."
    rm -r $del
else
    echo "ROTATE_FOLDERS: Nothing to delete."
fi

# rename

let "start=$hold-1"

for i in $(seq $start -1 0); do
    let "y=i+1"
    if [ $i -eq 0 ]; then
        echo "ROTATE_FOLDERS: Renaming folders $path to $path.1 ..."
        mv "$path" "$path.1"
    else
        echo "ROTATE_FOLDERS: Renaming folders $path.$i to $path.$y ..."
        mv "$path.$i" "$path.$y"
    fi
done

Не забыть сделать оба скрипта выполняемыми:

chmod 750 /root/rotate_folders.sh
chmod 750 /root/rotate_daily.sh

Добавляем в cron:

$sudo crontab -e

0 10 * * * /root/rotate_daily.sh >>/var/log/rotate_daily.log 2>&1 

Обратите внимание, весь вывод будет записываться в файл: /var/log/rotate_daily.log

Собственно, с ежедневным копированием все!

Если мы хотим добавить еще и еженедельное резервное копирование, то можно пойти двумя путями:

1. Настроить его по аналогии и параллельно с ежедневным. Таким образом у вас будет полностью автономный набор папкок weekly, weekly.1 weekly.2 и т.д. который никак не будет пересекаться с ежедневными папками. Но в этом случае это будет занимать на диске дополнительно столько же места, сколько и ежедневные архивы.

2. Модифицировать скрипт и раз в неделю создавать дополнительный снапшот папки daily в папку weekly, а затем так же переименовывать папку weekly в weekly.1, weekly.2 и т. д. В этом случае дополнительное место будут занимать только измененные файлы, которых обычно очень мало, но если какой-либо файл окажется испорчен, то он будет испорчен во всех папках сразу!

К слову сказать — вышеописанную технику можно применить не только к резервному копированию в Synology DSM, а к любой системе, поддерживающей rsync и hardlink’и.

Удачной настройки!

Комментарии (15)


  1. RPG18
    12.10.2015 00:41

    Насколько видел, там есть приложухи бекапящие в облако S3/Glacier. Естественно поддерживается https, что может быть удобно.


  1. ArcFi
    12.10.2015 00:57
    +2

    Не вижу смысла изобретать велосипед, когда есть rsnapshot.


    1. Antonto
      12.10.2015 01:55

      На первый взгляд да, но вместо того, чтобы ставить и конфигурить rsnapshot, здесь выполняется по сути всего одна команда cp -al.
      Сам же бекап (с помощью rsync) делается непосредственно на Synology с помощью штатного приложения — это удобно. Хотя можно и вместо cp -al rsnapshot прикрутить.


      1. ArcFi
        12.10.2015 16:46

        Смысл rsnapshot именно в надёжной проверенной логике ротации, предотвращении эффекта гонок и логировании.
        Код самописных скриптов обычно хуже протестирован и сложнее в поддержке.


        1. Antonto
          12.10.2015 19:44

          Да там самописного — 3 строки, если выкинуть комментарии и echo. Так что логика работы прозрачна для проверки и понимания. Опять же — разобраться во внутренностях системы может быть полезно. Но я согласен, что использование rsnapshot в определенных случаях предпочтительнее.


  1. n1nj4p0w3r
    12.10.2015 05:40

    А чем вас не устроили btrfs или zfs доступные из репозиториев ubuntu, умеющие снапшоты «из коробки» и не требующие особых заморочек с их созданием?


    1. Antonto
      12.10.2015 19:40

      Подозреваю, что к снапшотам zfs и пр. так же необходима обвязка из простеньких скриптов. В общем если дойдет до реализации — наверняка всплывут мелкие детали, которые надо будет учитывать. Но не исключаю, что это будет проще — в следующий раз попробую сделать на уровне снапшотов файловой системы.


      1. n1nj4p0w3r
        12.10.2015 20:20

        Обвязка из скриптов разумеется потребуется, но не для подделки COW, а для решения поставленной задачи, вроде создания почасовых/дневных/недельных/месячных/годовых снапшотов с определенным сроком хранения, как в пример https://github.com/fracai/zfs-rollup/blob/master/rollup.py


  1. lleo_aha
    12.10.2015 12:52

    А у меня вопрос — если есть собственно сервер, то зачем тогда synology?)

    Просто любая схема вида «ну сервер я буду периодически включать чтобы туда бэкапы сложить» достаточно странно выглядит. А если сервер всё время включен — то смысла в Synology как то не особо есть.


    1. reff
      12.10.2015 14:12

      Synology DSM может быть виртуальным.


      1. RPG18
        12.10.2015 14:49

        Не очень понятно зачем может понадобится embedded Linux с вебмордой DSM на виртуалке?


        1. reff
          12.10.2015 15:16

          Например, затем, что серверочек виртуализации уже есть, а NAS перед использованием нужно купить.


          1. RPG18
            12.10.2015 15:34

            Не понимаю. Зачем ставить недо GNU/Linux, когда можно поставить полноценный. Вроде как веб панелек управления сервером хватает.


    1. Antonto
      12.10.2015 19:31

      Synology стоит дома, качает фильмы, музыку, воспроизводит их на SmartTV, может быть использован в качестве системы видеонаблюдения и пр.
      А сервер для бекапа — просто дохленький комп для хранения архивов, размещенный, к слову, оффсайт.


      1. guglez
        13.10.2015 13:03

        Всегда было интересно — если человек в состоянии настроить сервер как ему угодно — зачем покупают синолоджи, кунап и прочее? Оно выходит сильно дороже если сравнивать с обычным железом, да даже с микросервером, у которого память с ЕСС. Вариант для ленивых — HP Microserver+FreeNAS и вы за вечер имеете все тоже самое, но с блекджеком и снапшотами, в 2 раза дешевле как минимум. При этом железо будет бодрее.