Резервное копирование Arch: rsync-схема с инкрементом
Полноценный бэкап Arch это не образ диска, а rsync-зеркало системы с инкрементом: каждая копия выглядит полной, а места занимает столько, сколько изменилось с прошлого раза. Одна команда rsync -aAX снимает зеркало, флаг --link-dest превращает его в цепочку поколений, а cron или systemd-таймер запускают всё по расписанию. Ниже схема целиком: от базового зеркала до восстановления после сбоя диска.
Что такое rsync-схема бэкапа и чем она лучше образа диска?
rsync-схема это регулярная синхронизация файлов на отдельный носитель с сохранением прав, владельцев и атрибутов. В отличие от образа диска, rsync копирует только изменённые файлы, поэтому повторные прогоны занимают минуты, а не часы. А с --link-dest каждый следующий запуск создаёт новую полную копию, которая физически хранит только отличия от предыдущей. Получаются три свойства сразу: свежее зеркало, экономия места и быстрые бэкапы.
Базовое зеркало: какие флаги нужны и почему?
Начнём с домашнего каталога: самого ценного и самого изменчивого:
rsync -aAX --info=progress2 /home /mnt/backup/
Что делают флаги:
-a(archive): рекурсивный режим с сохранением прав, владельцев, времени, симлинков и устройств;-A: ACL, списки контроля доступа;-X: расширенные атрибуты (xattr);--info=progress2: один общий прогресс вместо потока имён файлов.
Для бэкапа системы добавь ещё два:
rsync -aAX --numeric-ids --delete --info=progress2 /home /mnt/backup/
--numeric-ids сохраняет числовые ID владельцев вместо имён: при восстановлении на другой машине пользователь с тем же именем может иметь другой UID, и файлы «переедут» к чужому владельцу. --delete делает копию точным зеркалом: файлы, удалённые в оригинале, исчезают и в бэкапе. Без --delete копия обрастает мусором и перестаёт отражать реальное состояние системы.
Полное зеркало корня: что исключать?
Полный бэкап системы: тот же rsync, но от корня, с исключениями виртуальных и временных каталогов:
sudo rsync -aAX --numeric-ids --delete --info=progress2 \
--exclude={"/dev/*","/proc/*","/sys/*","/run/*","/tmp/*","/lost+found"} \
--exclude="/var/cache/*" --exclude="/var/lib/pacman/sync/*" \
/ /mnt/backup/
Зачем эти исключения:
/dev,/proc,/sys,/run: виртуальные файловые системы, их содержимое создаёт ядро при каждой загрузке;/tmp: временные файлы, они не нужны;/lost+found: служебный каталог ext4;/var/cache: кэши, в первую очередь pacman: пересоздаются сами;/var/lib/pacman/sync: базы зеркал, пересоздаются черезpacman -Syy.
Эта же команда работает как перенос на новый диск: разметь диск, смонтируй разделы и запусти rsync из live-среды. После копирования останется пересобрать загрузчик и поправить fstab: порядок такой же, как при обычном переносе.
Как сделать инкремент через –link-dest?
Простое зеркало занимает столько же, сколько система, и каждая копия это полный объём. Инкремент решает проблему: --link-dest указывает rsync на предыдущее поколение, и неизменённые файлы не копируются, а связываются с ним жёсткими ссылками. Жёсткая ссылка не занимает места это второе имя того же блока на диске.
Классическая схема: три поколения:
# свежий бэкап, ссылающийся на предыдущий
rsync -aAX --delete --link-dest=../backup.1/ /home /mnt/backup/backup.0/
# ротация: сдвигаем поколения
rm -rf /mnt/backup/backup.2
mv /mnt/backup/backup.1 /mnt/backup/backup.2
mv /mnt/backup/backup.0 /mnt/backup/backup.1
После ротации следующий прогон снова пишет в backup.0. Цепочка backup.0 → backup.1 → backup.2 работает так: каждая копия выглядит полной (можно зайти в любую и достать любой файл), а на диске лежит объём одной полной копии плюс изменения за два периода.
Важный нюанс: жёсткие ссылки не пересекают границы файловых систем, поэтому все поколения должны лежать на одном разделе.
Как автоматизировать: cron или systemd-таймер?
Ручной запуск бэкапа: привычка, которая ломается в самый неподходящий момент. Автоматика надёжнее. Оба варианта запускают один и тот же скрипт:
#!/bin/bash
# /usr/local/bin/backup-arch.sh
set -e
rsync -aAX --delete --link-dest=../backup.1/ /home /mnt/backup/backup.0/
rm -rf /mnt/backup/backup.2
mv /mnt/backup/backup.1 /mnt/backup/backup.2
mv /mnt/backup/backup.0 /mnt/backup/backup.1
Простой вариант: cron. Строка в crontab (crontab -e) запускает бэкап каждый понедельник в 3 часа ночи:
0 3 * * 1 /usr/local/bin/backup-arch.sh
Лучший вариант: systemd-таймер. Два файла:
# /etc/systemd/system/backup.service
[Unit]
Description=Rsync backup of Arch
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup-arch.sh
# /etc/systemd/system/backup.timer
[Unit]
Description=Daily rsync backup
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
Включение:
sudo systemctl enable --now backup.timer
systemctl list-timers backup.timer
Почему таймер лучше cron: Persistent=true догоняет пропущенные запуски после выключенного компьютера, OnCalendar гибче синтаксиса cron, логи попадают в journald, а запустить бэкап вручную можно через systemctl start backup.service.
Как хранить копию офсайт и проверять бэкап?
Локальный бэкап не спасает от пожара, кражи или сбоя самого диска. Держи хотя бы одну копию вне машины.
Внешний диск: подключи, смонтируй и запусти ту же команду. Поколения на внешнем диске тоже должны лежать на одном разделе: из-за жёстких ссылок.
SSH-зеркало: копия на другом компьютере или NAS:
rsync -aAX --delete -e ssh /home user@nas:/mnt/backup/
-e ssh задаёт транспорт. Для медленных каналов добавь --bwlimit (ограничение скорости) и --partial (докачка прерванной передачи). Инкремент через --link-dest по ssh работает, если поколения на удалённой стороне лежат на одной файловой системе.
Проверка бэкапа: обязательная часть схемы. Бэкап, который ни разу не проверяли, скорее всего, сломан. Быстрая проверка без изменений:
rsync -avn --existing /home /mnt/backup/
-n: сухой прогон, ничего не копирует; -v: список файлов; --existing: пропускает файлы, которых нет в источнике. Пустой вывод, зеркало в порядке. Раз в месяц проверяй и восстановление: скопируй из бэкапа каталог с файлами и открой пару из них.
Как восстановиться из зеркала?
Восстановление: тот же rsync в обратную сторону. После сбоя диска загрузись с live-USB, разметь новый диск, смонтируй разделы и разверни зеркало:
sudo rsync -aAX --numeric-ids /mnt/backup/ /mnt/
Затем пересобери загрузчик и поправь fstab, и система поднимется в том виде, в каком была на момент последнего бэкапа.
Частичное восстановление: точечно. Вернуть /etc:
sudo rsync -aAX /mnt/backup/etc/ /etc/
Списки пакетов, если держал их в бэкапе, возвращают системе прежний состав: pacman -S --needed - < packages.txt. Как формировать и восстанавливать эти списки в статье про экспорт списка пакетов.
Частые вопросы
Чем эта схема отличается от бэкапа перед обновлением?
Там: лёгкая страховка на час: /etc, списки пакетов и dotfiles перед pacman -Syu. Здесь: полная схема: зеркало всей системы с инкрементом и автоматизацией. Они дополняют друг друга: быстрая копия перед обновлением и регулярное полное зеркало. Подробности в статье про резервное копирование перед обновлением.
Снапшоты на ext4 через rsync это то же самое?
Похоже, но цели разные. Снапшоты на ext4 через rsync с hardlink-инкрементом делаются для быстрого отката после поломки: вернуть систему к состоянию «до -Syu». Полная схема из этой статьи для восстановления после потери диска: зеркало, которое разворачивается на новое железо. Разбор отличий в статье про снапшоты на ext4, LVM и rsync.
Сколько поколений хранить?
Три: разумный минимум: одно поколение может оказаться повреждённым, а два предыдущих дают запас. Места они занимают немного: только изменения. Если диск позволяет, держи четыре-пять.
Что с /boot и загрузчиком?
/boot входит в зеркало корня автоматически. А вот загрузчик в бэкапе не хранится, он живёт в EFI-разделе и пересоздаётся при восстановлении: grub-install + grub-mkconfig для GRUB или bootctl install для systemd-boot. Файлы ядра и initramfs в /boot копируются, так что после пересборки загрузчика система поднимется.
Как понять, что бэкап рабочий?
Сухой прогон rsync -avn --existing показывает расхождения. Раз в месяц, реальное восстановление: скопируй из бэкапа каталог с файлами и открой пару из них. И проверяй логи таймера: journalctl -u backup.service.
Полезные ресурсы
- rsync (ArchWiki): полный разбор флагов и готовые примеры бэкап-схем.
- systemd/Timers (ArchWiki): сравнение с cron и синтаксис OnCalendar.
Заключение
Полная rsync-схема бэкапа Arch держится на трёх китах: зеркало с -aAX, инкремент через --link-dest и автоматизация systemd-таймером. Каждая копия выглядит полной, места занимает по минимуму, а восстановление сводится к одному rsync в обратную сторону. Добавь внешний диск или ssh-зеркало для офсайт-копии, проверяй бэкап сухим прогоном, и потеря диска перестанет быть катастрофой.
Не получилось? Поможем настроить
Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Комментарии