Все об Arch Linux

Arch Linux будет тем, что вы из него сделаете!

Резервное копирование 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 указывает 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-схема бэкапа Arch держится на трёх китах: зеркало с -aAX, инкремент через --link-dest и автоматизация systemd-таймером. Каждая копия выглядит полной, места занимает по минимуму, а восстановление сводится к одному rsync в обратную сторону. Добавь внешний диск или ssh-зеркало для офсайт-копии, проверяй бэкап сухим прогоном, и потеря диска перестанет быть катастрофой.



Не получилось? Поможем настроить

Задай вопрос в чате — отвечаем быстро, по делу и без воды.

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

Комментарии

Загрузка…

Откроется GitHub: создайте новый issue с вашим комментарием (кнопка «Submit new issue»). После отправки обновите эту страницу — комментарий появится ниже.

Telegram Max