Инкрементальный бэкап через rsync: полное руководство с --link-dest
Как настроить экономичные ежедневные бэкапы с полными слепками и мгновенным восстановлением
Введение
Резервное копирование — обязательная часть администрирования серверов и рабочих станций. Но классические полные бэкапы быстро съедают дисковое пространство, а инкрементальные решения вроде 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В дальнейшем скрипт будет создавать новые каталоги с датой автоматически. Важно, чтобы все слепки находились в одном родительском каталоге — это упрощает управление и очистку старых копий.
Шаг 3. Базовый запуск rsync с --link-dest
Синтаксис команды для создания нового инкрементального слепка:
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 делает процесс полностью прозрачным. Не забывайте проверять бэкапы, хранить их на отдельном носителе и регулярно тестировать восстановление. Тогда ваши данные будут в безопасности.
Читайте также
Комментарии
Комментарии доступны только зарегистрированным пользователям. Войти
- Пока нет комментариев. Будьте первым.



