Инкрементальный бэкап через rsync: пошаговое руководство с hardlink-снапшотами
Экономьте место и время: создавайте полные снапшоты без дублирования данных
Введение
Каждый системный администратор рано или поздно сталкивается с необходимостью регулярного резервного копирования. Полные бэкапы занимают много места и требуют времени, а инкрементальные позволяют хранить только изменения. Однако классические инкрементальные бэкапы (например, через tar) сложны в восстановлении: чтобы получить файл, нужно последовательно применять цепочку архивов. Утилита rsync с опцией --link-dest решает эту проблему элегантно: каждый бэкап выглядит как полная копия, но физически занимает место только для изменённых файлов благодаря жёстким ссылкам (hardlinks). В этом руководстве мы разберём, как настроить такую схему на Linux-сервере, автоматизировать её через cron и проверить восстановление.
Требования
Сервер или компьютер под управлением Linux (подойдёт любой дистрибутив: Ubuntu, Debian, CentOS, Fedora).
Установленный
rsync(обычно уже есть, но проверьте:rsync --version).Доступ к удалённому серверу по SSH (если бэкапите удалённые данные).
Достаточно свободного места на диске для первого полного бэкапа и последующих изменений.
Базовые навыки работы в командной строке.
Права на чтение исходных данных и запись в целевую директорию.
Шаг 1: Установка и проверка rsync
В большинстве дистрибутивов rsync уже установлен. Если нет, установите его:
Debian/Ubuntu:
sudo apt update && sudo apt install rsyncCentOS/RHEL/Fedora:
sudo dnf install rsync(илиyum install rsync)
Проверьте версию: rsync --version. Убедитесь, что версия не слишком старая (рекомендуется 3.x).
Шаг 2: Подготовка директорий
Создайте структуру для хранения бэкапов. Например, будем хранить в /backup:
sudo mkdir -p /backup/daily
sudo chown $USER:$USER /backup/dailyЗдесь daily — папка для ежедневных снапшотов. Внутри неё будут подпапки с датами, например 2025-04-01, 2025-04-02 и т.д.
Шаг 3: Базовый запуск rsync для первого полного бэкапа
Сначала создадим первый полный бэкап. Допустим, исходные данные находятся в /home/user/data. Выполните:
rsync -aAXH --delete --numeric-ids /home/user/data/ /backup/daily/2025-04-01/Разберём ключи:
-a— архивный режим (рекурсия, сохранение прав, времени, символических ссылок).-A— сохранение ACL.-X— сохранение расширенных атрибутов.-H— сохранение жёстких ссылок (важно для последующих инкрементов).--delete— удалять в приёмнике файлы, которых нет в источнике (чтобы бэкап точно отражал состояние).--numeric-ids— не преобразовывать uid/gid в имена (полезно при восстановлении на другой системе).
Обратите внимание на слеш в конце источника /home/user/data/ — это означает «копировать содержимое папки data», а не саму папку. Если нужна папка data внутри бэкапа, уберите слеш.
Шаг 4: Создание инкрементального бэкапа с --link-dest
Теперь создадим второй снапшот, который будет использовать жёсткие ссылки на неизменённые файлы из первого. Команда:
rsync -aAXH --delete --numeric-ids --link-dest=/backup/daily/2025-04-01 /home/user/data/ /backup/daily/2025-04-02/Ключевой параметр --link-dest указывает на предыдущий снапшот. Если файл не изменился, rsync создаст на него жёсткую ссылку в новом снапшоте, не копируя данные. В результате новый снапшот выглядит как полная копия, но занимает минимум места.
Важно: путь в --link-dest должен быть абсолютным.
Шаг 5: Автоматизация с помощью скрипта
Чтобы не вводить команды вручную, напишем скрипт backup.sh:
#!/bin/bash
SOURCE="/home/user/data/"
BACKUP_DIR="/backup/daily"
DATE=$(date +%Y-%m-%d)
CURRENT="$BACKUP_DIR/$DATE"
PREVIOUS=$(ls -1d $BACKUP_DIR/*/ 2>/dev/null | sort | tail -1)
mkdir -p "$CURRENT"
if [ -z "$PREVIOUS" ]; then
# Первый бэкап
rsync -aAXH --delete --numeric-ids "$SOURCE" "$CURRENT/"
else
# Инкрементальный бэкап
rsync -aAXH --delete --numeric-ids --link-dest="$PREVIOUS" "$SOURCE" "$CURRENT/"
fi
# Удаляем бэкапы старше 30 дней
find $BACKUP_DIR -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;Сохраните скрипт, дайте права на выполнение: chmod +x backup.sh. Проверьте его работу вручную.
Шаг 6: Настройка расписания в cron
Откройте crontab: crontab -e. Добавьте строку для ежедневного запуска в 2 часа ночи:
0 2 * * * /path/to/backup.sh >> /var/log/rsync-backup.log 2>&1Не забудьте указать полный путь к скрипту. Логи будут писаться в файл, что поможет отладке.
Шаг 7: Бэкап удалённого сервера по SSH
Если данные находятся на удалённом сервере, используйте rsync через SSH:
rsync -aAXH --delete --numeric-ids -e ssh user@remote:/path/to/data/ /backup/daily/2025-04-01/Для инкрементального бэкапа добавьте --link-dest как обычно. Убедитесь, что у вас настроен вход по SSH-ключам без пароля (иначе cron не сможет выполнить команду).
Шаг 8: Исключение ненужных файлов
Чтобы не копировать кэши, временные файлы или мусор, создайте файл исключений exclude.txt:
*.tmp
*.log
.cache/
node_modules/Используйте его в команде: --exclude-from=/path/to/exclude.txt. Это уменьшит размер бэкапа и ускорит процесс.
Шаг 9: Проверка целостности и восстановление
Периодически проверяйте, что бэкапы читаемы. Например, сравните контрольные суммы файлов:
rsync -avn --checksum /home/user/data/ /backup/daily/2025-04-02/Ключ -n (dry-run) покажет различия без копирования. Если вывод пуст, всё синхронизировано.
Для восстановления просто скопируйте нужный снапшот обратно:
rsync -aAXH /backup/daily/2025-04-02/ /home/user/restore/Или восстановите отдельный файл: cp /backup/daily/2025-04-02/path/to/file /home/user/restore/.
Шаг 10: Мониторинг и уведомления
Добавьте в скрипт отправку уведомлений об ошибках. Например, через mail:
if [ $? -ne 0 ]; then
echo "Бэкап не удался $(date)" | mail -s "Backup Error" admin@example.com
fiТакже можно использовать systemd таймеры вместо cron — они гибче и логируют в journald.
Типичные ошибки
1. Забыли слеш в конце источника. /home/user/data и /home/user/data/ дают разный результат. Будьте внимательны. 2. Неправильный путь в --link-dest. Если указать относительный путь или несуществующую папку, rsync просто скопирует все файлы заново, и экономии места не будет. 3. Отсутствие ключа -H. Без него жёсткие ссылки внутри источника могут быть разорваны, что увеличит размер бэкапа. 4. Игнорирование прав. При восстановлении на другую систему могут возникнуть проблемы с владельцами. Используйте --numeric-ids и при необходимости --usermap/--groupmap. 5. Ротация без учёта жёстких ссылок. Если удалять старые снапшоты простым rm -rf, это может удалить данные, на которые ссылаются другие снапшоты? Нет, hardlinks удаляются только когда счётчик ссылок станет нулевым. Но если вы удаляете папку, rsync не тронет данные, на которые есть другие ссылки. Однако при удалении всей папки снапшота файлы, на которые есть ссылки в других снапшотах, останутся. Это безопасно. 6. Запуск от имени пользователя без прав. Убедитесь, что у пользователя есть доступ к исходным файлам и целевой директории.
FAQ
Вопрос: Чем инкрементальный бэкап rsync отличается от полного? Ответ: Внешне каждый снапшот выглядит как полная копия, но физически дублируются только изменённые файлы. Это экономит место и время.
Вопрос: Можно ли использовать rsync для бэкапа Windows-машин? Ответ: Да, через WSL или Cygwin, но лучше использовать специализированные инструменты.
Вопрос: Как часто нужно делать бэкапы? Ответ: Зависит от интенсивности изменений. Для критичных данных — ежедневно, для остальных — раз в неделю.
Вопрос: Что делать, если бэкап занимает слишком много места? Ответ: Проверьте, работают ли жёсткие ссылки (команда du -sh покажет реальный размер). Убедитесь, что --link-dest указывает на правильный предыдущий снапшот.
Вопрос: Можно ли шифровать бэкапы? Ответ: Сам rsync не шифрует. Можно комбинировать с gpg или использовать зашифрованные контейнеры (LUKS, VeraCrypt).
Итог
Инкрементальный бэкап через rsync с --link-dest — это мощный и гибкий метод, который сочетает преимущества полных и инкрементальных копий. Вы получаете снапшоты, которые легко восстановить, и экономите дисковое пространство. Настройка занимает немного времени, а автоматизация через cron делает процесс полностью прозрачным. Не забывайте проверять бэкапы и тестировать восстановление — это залог спокойствия.
Читайте также
Комментарии
Комментарии доступны только зарегистрированным пользователям. Войти
- Пока нет комментариев. Будьте первым.



