Powrót do strony głównej

Rsync hardlink do rollback na ext4 Linux

Artykuł opisuje realizację snapshotów i rollback na ext4 za pomocą rsync i hardlink. Podział system/docker, atomowość, polecenia restore. Ograniczenia i automatyzacja dla middle/senior devops.

Rollback Linux ext4: rsync i hardlink w działaniu
Advertisement 728x90

Przywracanie systemu na ext4 za pomocą rsync i hardlink: praktyczna implementacja

Standardowe instalacje Linux na ext4 nie obsługują wbudowanych snapshotów, co utrudnia szybki powrót do poprzedniego stanu. Narzędzia do backupu, takie jak borg czy restic, są przeznaczone do długoterminowego przechowywania danych, a nie do lokalnego przywracania. Odtwarzanie z pełnej kopii zapasowej zajmuje godziny i wymaga przetwarzania dużych ilości danych, co jest nieefektywne w przypadku naprawiania lokalnych błędów w konfiguracjach lub po aktualizacjach.

Rozwiązanie wymaga minimalizacji zależności: bez zmiany systemu plików, LVM lub specjalistycznych FS, takich jak Btrfs/ZFS. Podejście opiera się na rsync z obsługą hardlink do deduplikacji.

Zasada działania: rsync + hardlink

rsync synchronizuje katalogi, kopiując tylko zmiany. Opcja --link-dest pozwala odwoływać się do poprzedniego snapshotu: niezmienione pliki są ponownie wykorzystywane przez hardlink, zajmując minimalną przestrzeń. Hardlink to dodatkowe nazwy dla jednego inode, zapewniające zerowe koszty dla niezmienionych danych.

Google AdInline article slot

Podstawowe polecenie do tworzenia snapshotu:

rsync -aHAX --numeric-ids --delete --link-dest="$PREV" "$SRC" "$DEST_TMP/"
  • -a: tryb archiwalny (rekurencja, uprawnienia, znaczniki czasu).
  • -H: zachowanie hardlink.
  • -A: ACL.
  • -X: rozszerzone atrybuty.
  • --numeric-ids: UID/GID według numerów.
  • --delete: usuwanie zbędnych plików w katalogu docelowym.

To prowadzi bieżący stan do snapshotu, kopiując tylko różnicę.

Struktura przechowywania snapshotów

Snapshoty są umieszczane w .infra_snapshots/ jako zwykłe katalogi ze znacznikami czasu:

Google AdInline article slot
.infra_snapshots/
├── system/
│   ├── 2026-03-01_00-30-00/
│   ├── 2026-03-02_00-30-00/
│   └── LATEST -> 2026-03-02_00-30-00/
├── docker/
│   ├── 2026-03-01_23-30-00/
│   └── LATEST -> 2026-03-01_23-30-00/

Symlink LATEST wskazuje na aktualny snapshot do automatyzacji. Podział na system i docker pozwala izolować pliki systemowe od kontenerowych: wolumeny Docker są wykluczane, aby uniknąć problemów ze zmiennymi danymi.

Proces tworzenia:

  • Utwórz tymczasowy katalog .tmp-YYYY-MM-DD_HH-MM-SS.
  • Wykonaj rsync do niego.
  • Atomowo zmień nazwę: mv -T "$TMP_DEST" "$FINAL_DEST".
  • Zaktualizuj LATEST: ln -sfn "$FINAL_DEST" "$LATEST_LINK".

To gwarantuje atomowość: snapshot jest albo kompletny, albo nie istnieje.

Google AdInline article slot

Przywracanie stanu

Przywracanie to odwrotna synchronizacja z dry-run do podglądu:

rsync -aHAX --numeric-ids --delete --dry-run "$SNAP/" "/"

Po sprawdzeniu usuń --dry-run do zastosowania. rsync doprowadzi katalog główny systemu do stanu snapshotu, usuwając nowe pliki i przywracając stare przez hardlink.

Dla Docker: analogicznie, ale tylko na katalog kontenerów, wykluczając wolumeny.

Ograniczenia podejścia

  • Brak atomowości systemowej: rsync czyta pliki sekwencyjnie, system może się zmieniać podczas tworzenia. Snapshot jest spójny dla plików, ale nie jest migawkowy.
  • Zmienne dane: logi, bazy danych, pliki tymczasowe mogą trafić w stan pośredni. Wykluczaj je z rsync ( --exclude ).
  • Przestrzeń dyskowa: nowe wersje plików zajmują miejsce; okresowo czyść stare snapshoty.
  • Nie dla produkcji z wysokim obciążeniem: nadaje się dla serwerów/desktopów z niską aktywnością podczas tworzenia snapshotu.

| Scenariusz | Czas tworzenia (przykładowo) | Koszty dysku |

|----------|---------------------------|---------------|

| Codzienny system | 2-5 min | 100-500 MB |

| Docker po aktualizacjach | 1-3 min | 50-200 MB |

Automatyzacja

Zintegruj w cron do codziennych snapshotów:

  • 00:30: system.
  • 23:30: docker.

Skrypt powinien logować wyjście rsync, sprawdzać kody wyjścia i powiadamiać o błędach.

Co jest ważne:

  • rsync z --link-dest emuluje snapshoty na ext4 bez zmiany FS.
  • Hardlink zapewnia deduplikację: niezmienione pliki nie są duplikowane.
  • Atomowość przez katalogi tymczasowe zapobiega częściowym snapshotom.
  • Podział system/docker zwiększa precyzję przywracania.
  • Dry-run jest obowiązkowy przed przywróceniem dla bezpieczeństwa.

Podejście jest przejrzyste, wykorzystuje tylko standardowe narzędzia Linux i skaluje się na dowolne systemy ext4.

— Editorial Team

Advertisement 728x90

Czytaj dalej