EN RU

Инкрементальные бэкапы с CentOS → Synology DSM

Надёжнее и проще всего сделать инкрементальные бэкапы с CentOS 6,7 → Synology DSM 6.2 через rsync по SSH с «снимками» (snapshot) на стороне NAS. Пошаговая инструкция с готовыми командами и скриптом.


Задача по настройке инкрементального бэкапа

  • Полный первый бэкап, затем инкрементальные (копируются только изменения).
  • На NAS — папка со снапшотами по датам: …/snapshots/2025-08-27_02-30, …/snapshots/2025-08-28_02-30, и т. д.
  • Ссылка latest всегда указывает на свежий снимок.
  • Хранение N последних снимков (автоматическая ротация).

1) Подготовка NAS (DSM)

  1. Создайте общую папку
    Панель управления → Общая папка → Создать
    Имя: backups (пусть будет /volume1/backups).
  2. Создайте пользователя для бэкапов
    Панель управления → Пользователь → Создать
    Пользователь: backup (или своё имя), права RW на общую папку backups. При желании задайте квоту.
  3. Включите SSH
    Панель управления → Терминал & SNMP → Включить службу SSH. Порт по умолчанию 22 оставить.
  4. (Рекомендуется) Включите домашние папки пользователей
    Панель управления → Пользователь → Дополнительно → Включить домашнюю папку пользователя. Это упростит вход по SSH‑ключу.

Примечание: на Synology путь к общей папке будет вида /volume1/backups. Для старых моделей (DS411j) обычно один том — volume1.


2) Подготовка CentOS

  1. Установите нужные пакеты:
   sudo yum install -y rsync openssh-clients
  1. Сгенерируйте SSH‑ключ (CentOS 6 старый, используем RSA):
   ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa
  1. Скопируйте ключ на NAS (замените IP NAS):
   ssh-copy-id backup@192.168.1.50

Если ssh-copy-id нет:

   cat ~/.ssh/id_rsa.pub | ssh backup@192.168.1.50 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
  1. Проверьте вход по ключу:
   ssh backup@192.168.1.50 "echo ok"
  1. Подготовьте каталог для снимков на NAS (один раз):
   ssh backup@192.168.1.50 "mkdir -p /volume1/backups/centos6/snapshots"

3) Список исключений (что не бэкапить)

Создайте на CentOS файл /root/backup/excludes.txt (папку тоже создайте):

sudo mkdir -p /root/backup
sudo tee /root/backup/excludes.txt >/dev/null <<'EOF'
/proc/*
/sys/*
//dev/*
/run/*
/tmp/*
/mnt/*
/media/*
/lost+found
/var/cache/*
/var/tmp/*
/var/run/*
/swapfile
/home/*/.cache/*
EOF

При необходимости добавьте большие/временные каталоги вашего окружения (например, кэши приложений, логи-архивы и т. д.).
Базы данных нельзя надёжно копировать «горячими» файлами — делайте дампы и включайте их в бэкап (пример ниже).


4) Базовая проверка rsync (без снапшотов)

Однократный тест «как есть» (без удаления на стороне назначения, без снапшотов):

rsync -aHAX --numeric-ids --dry-run \
  --exclude-from=/root/backup/excludes.txt \
  /etc /home /root /var/www /opt \
  backup@192.168.1.50:/volume1/backups/centos6/test-run

Уберите --dry-run, если список вас устраивает.

Ключи:
-a — права/время/симлинки/рекурсивно; -H — хардлинки; -A — ACL; -X — xattrs; --numeric-ids — сохранять UID/GID числами.
Если CentOS ругается на -A/-X (редко), временно уберите их.


5) Инкрементальные снапшоты с --link-dest

Создайте скрипт /root/backup/backup_to_nas.sh:

#!/bin/bash
set -e

NAS_IP="192.168.1.50"
DEST_USER="backup"
DEST_BASE="/volume1/backups/centos6"
SNAP_DIR="${DEST_BASE}/snapshots"
STAMP="$(date +%F_%H-%M)"       # например, 2025-08-27_02-30
DEST_SNAP="${SNAP_DIR}/${STAMP}"
EXCLUDES="/root/backup/excludes.txt"

# Какие каталоги бэкапим (адаптируйте под себя):
SRC_LIST=(
  /etc
  /home
  /root
  /var/www
  /opt
  # добавьте сюда каталог с дампами БД, если делаете их
)

SSH="ssh -o BatchMode=yes"

# Узнать предыдущий снимок (может отсутствовать на первом запуске)
LAST_SNAP="$($SSH ${DEST_USER}@${NAS_IP} "ls -1d ${SNAP_DIR}/20* 2>/dev/null | sort | tail -n 1" || true)"

# Создать временную папку для текущего снапшота
$SSH ${DEST_USER}@${NAS_IP} "mkdir -p '${DEST_SNAP}.incomplete'"

# Собираем опции rsync
RSYNC_OPTS=(-aHAX --numeric-ids --delete --delete-excluded --partial --human-readable --exclude-from="$EXCLUDES")
if [ -n "$LAST_SNAP" ]; then
  RSYNC_OPTS+=("--link-dest=$LAST_SNAP")
fi

# Прогоним rsync
rsync "${RSYNC_OPTS[@]}" "${SRC_LIST[@]}" "${DEST_USER}@${NAS_IP}":"${DEST_SNAP}.incomplete/"

# Атомарно переименуем и обновим ссылку latest
$SSH ${DEST_USER}@${NAS_IP} "mv '${DEST_SNAP}.incomplete' '${DEST_SNAP}' && ln -sfn '${DEST_SNAP}' '${DEST_BASE}/latest'"

# Ротация: хранить 14 последних снимков
KEEP=14
$SSH ${DEST_USER}@${NAS_IP} "cd '${SNAP_DIR}' && ls -1d 20* 2>/dev/null | sort | head -n -${KEEP} | xargs -r rm -rf"

echo "Backup OK: ${DEST_SNAP}"

Разрешения и запуск:

chmod +x /root/backup/backup_to_nas.sh
/root/backup/backup_to_nas.sh

Если всё прошло без ошибок — отлично, у вас появился первый снимок.


6) Планирование по cron (CentOS без systemd)

Откройте crontab от root:

crontab -e

Добавьте, например, ежедневный бэкап в 02:30:

30 2 * * * /root/backup/backup_to_nas.sh >/var/log/backup_to_nas.log 2>&1

7) Дамп БД перед бэкапом (если есть MySQL/MariaDB)

Добавьте в скрипт перед вызовом rsync блок дампа (и включите папку дампов в SRC_LIST):

DUMP_DIR="/var/backups/mysql"
mkdir -p "$DUMP_DIR"
find "$DUMP_DIR" -type f -mtime +7 -delete

mysqldump --all-databases --single-transaction --routines --triggers \
  | gzip -c > "${DUMP_DIR}/all-$(date +%F_%H-%M).sql.gz"

8) Как восстановить

  1. Посмотреть доступные снимки на NAS:
   ssh backup@192.168.1.50 "ls -1 /volume1/backups/centos6/snapshots"
  1. Восстановить, например, /etc из конкретного снапшота:
   rsync -aHAX --numeric-ids \
     backup@192.168.1.50:/volume1/backups/centos6/snapshots/2025-08-27_02-30/etc/ \
     /etc/
  1. Или быстро из последнего:
   rsync -aHAX --numeric-ids \
     backup@192.168.1.50:/volume1/backups/centos6/latest/etc/ \
     /etc/

Для целиком «голого» восстановления системы обычно удобнее загрузиться с LiveCD, смонтировать диск и раскатать нужные каталоги (домашние, конфиги, веб‑проекты и т. п.).


9) Альтернатива: rsync на NAS без SSH (rsync‑daemon)

Если SSH не подходит, можно включить на DSM службу rsync и бэкапить на модуль rsync://…:

  • Панель управления → Службы файлов → вкладка rsync → Включить rsync‑службу (и при необходимости «аккаунты rsync»).
  • На CentOS команда будет вида:
  rsync -aHAX --delete --exclude-from=/root/backup/excludes.txt \
    /etc /home /root /var/www /opt \
    rsync://backup@192.168.1.50/ИмяМодуля/centos6/

Минусы: без SSH‑шифрования; тоньше настройка на DSM. Плюсы: чуть меньше накладных расходов.


10) Замечания по безопасности и совместимости

  • CentOS 6 устарела (EOL). Обновляйте машину как минимум до CentOS 7/Alma/Rocky при первой возможности.
  • На старых OpenSSH могут быть нюансы алгоритмов. Используйте RSA‑ключ 4096 (как выше). Если ругается на хост‑ключ, удалите прежнюю запись в ~/.ssh/known_hosts и переподтвердите.
  • Пользователю backup на NAS оставьте минимальные права — только RW на папку backups.
  • Можно дополнительно «прибить» ключ в authorized_keys опциями ограничения (например, по IP и без интерактивной оболочки), если требуется жёсткая политика.

Пример (на NAS, в ~/.ssh/authorized_keys, одна строка перед ключом):

from="192.168.1.10",no-pty,no-agent-forwarding,no-X11-forwarding,no-port-forwarding ssh-rsa AAAA… ваш_публичный_ключ

Готово

После выполнения шагов у вас будет автоматический инкрементальный бэкап CentOS 6 на Synology DS411j (DSM 6.2) с хранением нескольких «снимков» и быстрым восстановлением. Если хотите, могу адаптировать скрипт под ваши каталоги/объёмы и настроить более тонкую ротацию (по дням/неделям/месяцам).

Разработка и продвижение сайтов webseed.ru
Прокрутить вверх