Полноценный бэкап Arch — это не образ диска, а rsync-зеркало системы с инкрементом: каждая копия выглядит полной, а места занимает столько, сколько изменилось с прошлого раза. Одна команда rsync -aAX снимает зеркало, флаг --link-dest превращает его в цепочку поколений, а cron или systemd-таймер запускают всё по расписанию. Ниже — схема целиком: от базового зеркала до восстановления после сбоя диска.
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 работает так: каждая копия выглядит полной — можно зайти в любую и достать любой файл, — а на диске лежит объём одной полной копии плюс изменения за два периода.
Важный нюанс: жёсткие ссылки не пересекают границы файловых систем, поэтому все поколения должны лежать на одном разделе.
Ручной запуск бэкапа — привычка, которая ломается в самый неподходящий момент. Автоматика надёжнее. Оба варианта запускают один и тот же скрипт:
#!/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 с hardlink-инкрементом делаются для быстрого отката после поломки — вернуть систему к состоянию «до -Syu». Полная схема из этой статьи — для восстановления после потери диска: зеркало, которое разворачивается на новое железо. Разбор отличий — в статье про снапшоты на ext4, LVM и rsync.
Три — разумный минимум: одно поколение может оказаться повреждённым, а два предыдущих дают запас. Места они занимают немного — только изменения. Если диск позволяет, держи четыре-пять.
/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-зеркало для офсайт-копии, проверяй бэкап сухим прогоном — и потеря диска перестанет быть катастрофой.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии