sadrix logoSadriX
Минцифры готовит обязательную регистрацию IMEI смартфонов, купленных за границей
Гайды

Инкрементальный бэкап через rsync: полное руководство с --link-dest

Как настроить экономичные ежедневные бэкапы с полными слепками и мгновенным восстановлением

09 199 просмотров6 мин
0
Поделиться:TelegramVK

Введение

Резервное копирование — обязательная часть администрирования серверов и рабочих станций. Но классические полные бэкапы быстро съедают дисковое пространство, а инкрементальные решения вроде tar или dump часто требуют сложной цепочки восстановления. rsync предлагает элегантный компромисс: вы получаете полные слепки данных на каждую дату, но занимают они лишь место, равное изменённым файлам, благодаря жёстким ссылкам (hardlinks) и опции --link-dest.

В этом руководстве мы разберём, как настроить инкрементальный бэкап через rsync с нуля: от подготовки каталогов до автоматизации через cron, проверки целостности и восстановления. Материал рассчитан на пользователей Linux и macOS, знакомых с командной строкой.

Что такое инкрементальный бэкап через rsync

Идея проста: при первом запуске rsync копирует все файлы в каталог с датой, например /backup/2025-01-01. При следующем запуске rsync сравнивает исходные данные с предыдущим слепком и копирует только изменившиеся файлы в новый каталог /backup/2025-01-02. Все неизменённые файлы в новом каталоге создаются как жёсткие ссылки на файлы из предыдущего слепка. В результате каждый каталог выглядит как полная копия, но физически данные хранятся в одном экземпляре.

Ключевые преимущества:

  • Экономия места: дублируются только изменённые файлы.

  • Простота восстановления: каждый слепок — это полный набор данных, не нужно «склеивать» цепочку.

  • Скорость: копируются только изменения.

  • Гибкость: можно исключать ненужные каталоги, сжимать трафик, работать по SSH.

Требования и подготовка

Перед началом убедитесь, что у вас есть:

1. Linux-сервер или рабочая станция с установленным rsync (обычно уже есть; если нет — sudo apt install rsync или sudo yum install rsync). 2. Достаточно места на целевом диске для первого полного слепка и последующих изменений. 3. Права на чтение исходных данных и запись в целевой каталог. 4. Понимание структуры того, что вы собираетесь бэкапить (домашние каталоги, веб-сайты, базы данных и т.п.).

Рекомендуется использовать отдельный диск или сетевой ресурс (NFS, SMB), чтобы бэкапы не хранились на том же физическом носителе, что и исходные данные.

Шаг 1. Установка и проверка rsync

Проверьте версию:

rsync --version

Убедитесь, что версия не ниже 3.0 — опция --link-dest работает и в более старых, но современные сборки содержат полезные улучшения. Если rsync не установлен, выполните установку через пакетный менеджер вашего дистрибутива.

Шаг 2. Создание структуры каталогов для бэкапов

Создайте базовый каталог, например /mnt/backup, и внутри него — каталог для текущего слепка. Обычно используют схему с датой:

sudo mkdir -p /mnt/backup/2025-01-01

В дальнейшем скрипт будет создавать новые каталоги с датой автоматически. Важно, чтобы все слепки находились в одном родительском каталоге — это упрощает управление и очистку старых копий.

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

rsync -a --delete --link-dest=/mnt/backup/2025-01-01 /home/user/ /mnt/backup/2025-01-02/

Разберём ключи:

  • -a — архивный режим (рекурсивно, сохраняет права, владельцев, временные метки, символические ссылки).

  • --delete — удаляет в целевом каталоге файлы, которых нет в источнике (поддерживает точное соответствие).

  • --link-dest=DIR — указывает на предыдущий слепок; неизменившиеся файлы будут созданы как жёсткие ссылки на файлы из DIR.

  • /home/user/ — источник (обратите внимание на завершающий слэш: он означает «содержимое каталога», а не сам каталог).

  • /mnt/backup/2025-01-02/ — новый целевой каталог.

После выполнения в /mnt/backup/2025-01-02 появится полная копия /home/user, но большинство файлов будут жёсткими ссылками на предыдущий слепок.

Шаг 4. Автоматизация: скрипт для ежедневного бэкапа

Создайте скрипт, который будет определять дату, находить последний слепок и запускать rsync. Пример:

#!/bin/bash
BACKUP_DIR="/mnt/backup"
SOURCE="/home/user/"
TODAY=$(date +%Y-%m-%d)
DEST="$BACKUP_DIR/$TODAY"

# Находим последний слепок (кроме сегодняшнего)
LATEST=$(ls -1d $BACKUP_DIR/*/ 2>/dev/null | grep -v "$TODAY" | sort | tail -1)

if [ -z "$LATEST" ]; then
    # Первый запуск — без --link-dest
    rsync -a --delete "$SOURCE" "$DEST/"
else
    rsync -a --delete --link-dest="$LATEST" "$SOURCE" "$DEST/"
fi

Сохраните скрипт, например, в /usr/local/bin/backup.sh и сделайте исполняемым:

sudo chmod +x /usr/local/bin/backup.sh

Шаг 5. Настройка cron для регулярного запуска

Откройте crontab пользователя, от имени которого будут выполняться бэкапы (обычно root):

sudo crontab -e

Добавьте строку для ежедневного запуска в 2:00 ночи:

0 2 * * * /usr/local/bin/backup.sh >> /var/log/rsync-backup.log 2>&1

Логи будут писаться в /var/log/rsync-backup.log — удобно для отладки.

Шаг 6. Исключение ненужных файлов

Чтобы не копировать кэши, временные файлы и мусор, используйте опцию --exclude или файл исключений. Например, создайте /etc/rsync-exclude.txt:

.cache/
*.tmp
*.log
node_modules/

И добавьте в команду rsync:

--exclude-from=/etc/rsync-exclude.txt

Это уменьшит объём и ускорит бэкап.

Шаг 7. Ротация старых слепков

Со временем слепков становится много. Настройте удаление копий старше, например, 30 дней. Добавьте в скрипт после успешного бэкапа:

find $BACKUP_DIR -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;

Будьте осторожны: rm -rf удаляет безвозвратно. Убедитесь, что путь верный.

Шаг 8. Проверка целостности и восстановление

Проверить, что бэкап корректен, можно командой rsync --dry-run с --checksum, но лучше периодически восстанавливать файлы из слепка в тестовый каталог:

rsync -a /mnt/backup/2025-01-02/home/user/ /tmp/restore-test/

Сравните содержимое. Также полезно проверять, что жёсткие ссылки действительно работают: ls -li покажет одинаковые inode для файлов в разных слепках.

Шаг 9. Бэкап по SSH на удалённый сервер

rsync умеет работать через SSH. Пример команды для копирования локального каталога на удалённый сервер:

rsync -a --delete --link-dest=/backup/2025-01-01 /home/user/ user@remote:/backup/2025-01-02/

Важно: --link-dest должен указывать на путь на удалённой стороне. Если вы хотите создавать жёсткие ссылки на удалённом сервере, rsync должен запускаться там же, где хранятся слепки. В простом случае можно сначала синхронизировать данные на удалённый сервер, а затем запускать скрипт с --link-dest уже на нём.

Шаг 10. Использование rsync для бэкапа баз данных

rsync не умеет делать согласованные снимки баз данных «на лету». Для MySQL/PostgreSQL сначала создайте дамп, затем копируйте его rsync'ом. Например:

mysqldump --all-databases > /tmp/db.sql
rsync -a /tmp/db.sql /mnt/backup/2025-01-02/db/

Либо используйте снапшоты LVM, если они доступны.

Шаг 11. Мониторинг и уведомления

Добавьте в скрипт отправку уведомления об ошибке. Простейший способ — проверка кода возврата rsync:

if [ $? -ne 0 ]; then
    echo "Backup failed" | mail -s "rsync backup error" admin@example.com
fi

Для продакшена лучше использовать системы мониторинга (Zabbix, Prometheus) или хотя бы запись в syslog.

Шаг 12. Тонкая настройка производительности

  • --compress — сжатие при передаче по сети (актуально для SSH).

  • --bwlimit=1000 — ограничение скорости (КБ/с), чтобы не забивать канал.

  • --partial — сохранять частично переданные файлы при обрыве.

  • --numeric-ids — не преобразовывать UID/GID, полезно при бэкапе между разными системами.

Типичные ошибки

1. Забыли завершающий слэш в источнике — rsync скопирует сам каталог, а не его содержимое, что приведёт к неожиданной структуре. 2. Неправильный путь в --link-dest — если указать несуществующий каталог, rsync просто скопирует все файлы заново, и экономии не будет. 3. Использование --delete без --link-dest — может удалить данные в целевом каталоге, если источник недоступен. 4. Отсутствие прав — rsync не сможет прочитать некоторые файлы или записать в целевой каталог. 5. Игнорирование ошибок — скрипт без проверки кода возврата может «молча» провалиться. 6. Бэкап на тот же диск — при выходе диска из строя потеряете и данные, и копии.

FAQ

Вопрос: Можно ли использовать rsync для бэкапа Windows-машин? Да, через WSL или Cygwin, но проще использовать встроенные средства Windows или сторонние утилиты.

Вопрос: Как быть с открытыми файлами? rsync может скопировать файл в момент изменения, что приведёт к неконсистентности. Для критичных данных используйте снапшоты ФС или предварительную остановку сервисов.

Вопрос: Сколько места занимает инкрементальный бэкап? Первый слепок — полный объём данных. Каждый последующий — только изменённые файлы. Жёсткие ссылки не увеличивают занимаемое место.

Вопрос: Можно ли восстановить отдельный файл из старого слепка? Да, просто скопируйте его из соответствующего каталога с датой.

Вопрос: Нужно ли сжимать бэкапы? Если данные уже сжаты (изображения, архивы), сжатие rsync не даст выигрыша. Для текстовых данных можно использовать --compress при передаче по сети.

Итог

Инкрементальный бэкап через rsync с опцией --link-dest — это мощный и гибкий метод, который сочетает экономию места с простотой восстановления. Настройка занимает немного времени, а автоматизация через cron делает процесс полностью прозрачным. Не забывайте проверять бэкапы, хранить их на отдельном носителе и регулярно тестировать восстановление. Тогда ваши данные будут в безопасности.

Читайте также

Комментарии

Комментарии доступны только зарегистрированным пользователям. Войти

  • Пока нет комментариев. Будьте первым.