TGViewer
BashTex | Linux BashTex | Linux @bash_tex · 2.51K subscribers
Post #527 752
Sync tricks: инкременты, hard links и бэкапы

Все знают про 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
  • 👍 11
More from @bash_tex
  1. Oct 7, 2026/dev/tcp - сетевое соединение средствами Bash В Bash есть малоизвестная возможность работа…
  2. Oct 6, 2026Ephemeral ports - почему заканчиваются исходящие TCP-порты Когда приложение устанавливает…
  3. Oct 5, 2026name_to_handle_at() - как получить файловый объект без обычного пути В Linux обычно обраща…
  4. Oct 2, 2026madvise() - как процесс подсказывает ядру, как он собирается использовать память Когда про…
  5. Oct 1, 2026flock vs fcntl - почему две блокировки одного файла могут вести себя совершенно по-разному…
  6. Sep 30, 2026DEBUG trap - как Bash выполняет код перед каждой командой В Bash есть специальный DEBUG tr…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →