Инкрементальный бэкап через rsync: пошаговое руководство с --link-dest
Полные слепки с дедупликацией через hardlink, автоматизация по cron и проверка восстановления
Введение
rsync — мощный инструмент синхронизации файлов, который часто используют для резервного копирования. Благодаря опции --link-dest можно создавать инкрементальные бэкапы, которые выглядят как полные копии, но занимают место только для изменённых файлов. Это достигается за счёт жёстких ссылок на неизменённые файлы из предыдущего бэкапа. В этом руководстве мы настроим такую схему с нуля, автоматизируем её и проверим восстановление.
Требования
Linux-система (подойдёт любой дистрибутив).
Установленный rsync (обычно уже есть, иначе
sudo apt install rsyncилиsudo dnf install rsync).Достаточно свободного места на целевом диске для первой полной копии и последующих изменений.
Права на чтение исходных данных и запись в целевую директорию.
Базовые навыки работы с терминалом.
Шаг 1: Установка и проверка rsync
Убедитесь, что rsync установлен:
rsync --versionЕсли команда не найдена, установите пакет. В Debian/Ubuntu:
sudo apt update && sudo apt install rsyncВ RHEL/CentOS/Fedora:
sudo dnf install rsyncШаг 2: Подготовка целевой директории
Создайте директорию для бэкапов. Например, /backup/rsync:
sudo mkdir -p /backup/rsync
sudo chown $USER:$USER /backup/rsyncВнутри будем создавать поддиректории с датой и временем.
Шаг 3: Первый полный бэкап
Выполните первую синхронизацию. Допустим, исходные данные находятся в /home/user/data. Создадим первый слепок:
rsync -aAXH --delete --numeric-ids \
/home/user/data/ \
/backup/rsync/2025-01-01_12-00-00/Пояснения:
-a— архивный режим (рекурсия, сохранение прав, времени, симлинков).-A— сохранение ACL.-X— сохранение расширенных атрибутов.-H— сохранение жёстких ссылок.--delete— удалять файлы в приёмнике, которых нет в источнике (для точного отражения).--numeric-ids— не преобразовывать UID/GID в имена.
Эта команда создаст полную копию. Теперь для инкрементального бэкапа используем --link-dest.
Шаг 4: Инкрементальный бэкап с --link-dest
Создайте новый слепок, указав предыдущий как ссылочный:
rsync -aAXH --delete --numeric-ids \
--link-dest=/backup/rsync/2025-01-01_12-00-00 \
/home/user/data/ \
/backup/rsync/2025-01-02_12-00-00/Файлы, которые не изменились, будут созданы как жёсткие ссылки на файлы из предыдущего бэкапа. Изменённые и новые файлы будут скопированы физически. В результате новый каталог выглядит как полная копия, но занимает место только для изменений.
Шаг 5: Автоматизация с помощью скрипта
Создайте скрипт backup.sh:
#!/bin/bash
SOURCE="/home/user/data/"
BACKUP_DIR="/backup/rsync"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
CURRENT_LINK="$BACKUP_DIR/current"
# Определяем последний успешный бэкап
LAST_BACKUP=$(ls -1d $BACKUP_DIR/20* 2>/dev/null | sort | tail -1)
# Если предыдущего нет, делаем полный
if [ -z "$LAST_BACKUP" ]; then
rsync -aAXH --delete --numeric-ids "$SOURCE" "$BACKUP_DIR/$DATE/"
else
rsync -aAXH --delete --numeric-ids \
--link-dest="$LAST_BACKUP" \
"$SOURCE" "$BACKUP_DIR/$DATE/"
fi
# Обновляем симлинк current на последний бэкап
ln -sfn "$BACKUP_DIR/$DATE" "$CURRENT_LINK"Сделайте скрипт исполняемым:
chmod +x backup.shШаг 6: Настройка cron для регулярного запуска
Откройте crontab:
crontab -eДобавьте строку для ежедневного запуска в 2:00:
0 2 * * * /path/to/backup.sh >> /var/log/rsync-backup.log 2>&1Сохраните и выйдите. Теперь бэкап будет создаваться автоматически.
Шаг 7: Ротация старых бэкапов
Чтобы не заполнить диск, удаляйте старые слепки. Добавьте в скрипт очистку, например, хранить последние 7 дней:
find $BACKUP_DIR -maxdepth 1 -type d -name '20*' -mtime +7 -exec rm -rf {} \;Будьте осторожны: удаление каталога с жёсткими ссылками не удалит данные, пока на них есть ссылки в других бэкапах.
Шаг 8: Проверка целостности и восстановление
Проверить, что бэкап содержит нужные файлы, можно так:
ls -la /backup/rsync/current/Для восстановления просто скопируйте файлы из нужного слепка обратно:
rsync -aAXH /backup/rsync/2025-01-02_12-00-00/ /home/user/data/Или смонтируйте через --link-dest для экономии места при тестовом восстановлении.
Типичные ошибки
Забыли слеш в конце источника.
/home/user/dataи/home/user/data/дают разный результат: без слеша создастся подкаталогdataвнутри приёмника.Не указали `--numeric-ids`. При восстановлении на другой системе могут возникнуть проблемы с владельцами.
Использование `--delete` без предварительной проверки. Убедитесь, что источник смонтирован и доступен, иначе можно удалить данные в приёмнике.
Отсутствие `-H`. Без этой опции жёсткие ссылки в источнике будут разорваны, что увеличит занимаемое место.
Запуск от имени пользователя без прав. Некоторые файлы могут быть недоступны для чтения.
FAQ
Вопрос: Можно ли использовать rsync для бэкапа по сети? Да, rsync может работать через SSH: rsync -aAXH -e ssh user@host:/path/ /backup/.
Вопрос: Как быть с открытыми файлами? Для согласованности используйте LVM-снапшоты или предварительно останавливайте сервисы. rsync сам по себе не гарантирует атомарность.
Вопрос: Сколько места занимает инкрементальный бэкап? Только изменённые файлы плюс накладные расходы на метаданные. Жёсткие ссылки не копируют данные.
Вопрос: Можно ли восстановить отдельный файл из середины цепочки? Да, каждый слепок — это полная файловая структура, просто с жёсткими ссылками.
Итог
Вы настроили инкрементальное резервное копирование с помощью rsync и --link-dest. Такая схема эффективна по месту и проста в восстановлении. Не забывайте проверять бэкапы и тестировать восстановление, чтобы быть уверенным в сохранности данных.
Читайте также
Комментарии
Комментарии доступны только зарегистрированным пользователям. Войти
- Пока нет комментариев. Будьте первым.



