Все знают про rsync, но не все используют его на 100%. Сегодня разберем три мощных приема: инкрементальные бэкапы, hard links для экономии места и атомарная схема снапшотов
1️⃣ Инкрементальный sync. База:
rsync -a --delete /data/ /backup/current/
Что происходит:
-a - сохраняет права, владельца, время--delete - удаляет лишнее в приемникеЭто зеркало. Но это не история. Каждый запуск перезаписывает прошлый бэкап.
2️⃣ Настоящие снапшоты через hard links. Допустим, структура такая:
/backup/
├── 2026-03-29/
├── 2026-03-30/
└── 2026-03-31/
Команда:
TODAY=$(date +%F)
YESTERDAY=$(date -d "yesterday" +%F)
rsync -a --delete \
--link-dest=/backup/$YESTERDAY \
/data/ /backup/$TODAY/
Что происходит:
изменённые файлы - копируются
неизмененные - создаются как hard link
места занимает почти как один бэкап
Что тут необычного?
Hard link - это не копия файла. Это второе имя для того же inode. Проверка:
ls -li file1 file2
Одинаковый inode - это один и тот же файл.
Удаляешь снапшот 29-го числа и файл не удалится, если он есть в 30-м.
Здесь же и начинается экономия места. Если данные почти не меняются: 30 снапшотов могут занимать +5–10% к объему, вместо ×30 бэкапов. Это почти как ZFS snapshots, но работает на обычном ext4.
3️⃣ Атомарная схема без битых бэкапов. Никогда не пиши прямо в конечную папку.
Правильно:
rsync -a --delete \
--link-dest=/backup/$YESTERDAY \
/data/ /backup/.tmp-$TODAY/ &&
mv /backup/.tmp-$TODAY /backup/$TODAY
Теперь:
если rsync упал - снапшот не появится
всегда либо полный, либо отсутствует
4️⃣ Ротация снапшотов. Храним 14 дней:
find /backup -maxdepth 1 -type d -mtime +14 -exec rm -rf {} \;
(Осторожно с путями.)
🛠 Мини-скрипт
#!/usr/bin/env bash
set -euo pipefail
SRC="/data"
DST="/backup"
TODAY=$(date +%F)
YESTERDAY=$(ls -1 $DST | sort | tail -n 1)
rsync -a --delete \
${YESTERDAY:+--link-dest=$DST/$YESTERDAY} \
"$SRC/" "$DST/.tmp-$TODAY/"
mv "$DST/.tmp-$TODAY" "$DST/$TODAY"
Первый запуск - обычная копия.
Все следующие - инкременты.
BashTex 📱 #bash #backup