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

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

Полные слепки с дедупликацией через hardlink, автоматизация по cron и проверка восстановления

05 166 просмотров3 мин
0
Поделиться:TelegramVK

Введение

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.

Создайте новый слепок, указав предыдущий как ссылочный:

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. Такая схема эффективна по месту и проста в восстановлении. Не забывайте проверять бэкапы и тестировать восстановление, чтобы быть уверенным в сохранности данных.

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

Комментарии

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

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