fakessh.eu
fakessh.eu
Trzy identyczne czarne dyski twarde stoją obok siebie na stalowej półce w ciemnej serwerowni, a przed nimi leży zwinięty niebieski kabel sieciowy.

Kopia zapasowa rsync na serwerze Linux: SSH, cron i kopie przyrostowe

zaktualizowano 6 listopada 2026

W SKRÓCIEKopię zapasową serwera Linux wykonuje się poleceniem rsync -a, na przykład rsync -avz /var/www/ kopia@host:/srv/kopie/www/, uruchamianym przez SSH i cron. Opcja -n pokazuje próbę bez zmian, --delete tworzy lustro, a --link-dest daje kopie przyrostowe z osobnym katalogiem na każdy dzień.

Kopia zapasowa rsync na serwerze Linux sprowadza się do polecenia rsync -a uruchamianego przez SSH: kopiuje ono wskazane katalogi na drugą maszynę, a przy kolejnych uruchomieniach przesyła tylko różnice. Na początek wystarczy rsync -avz /var/www/ kopia@serwer-kopii.example.org:/srv/kopie/www/, potem wpis w cronie i okresowy test odtwarzania. Rsync musi być zainstalowany po obu stronach połączenia, a jedno polecenie nie skopiuje danych między dwoma zdalnymi hostami.

Samo narzędzie nie jest jeszcze strategią. Według dokumentu CISA o opcjach kopii zapasowych (po angielsku, z 2012 roku) każdy ważny plik warto mieć w trzech egzemplarzach, czyli oryginał i dwie kopie, na dwóch różnych typach nośników, a jedną kopię trzymać poza siedzibą. Ten sam dokument ostrzega, że kopie odświeżane automatycznie najnowszymi wersjami plików mogą po cichu przenosić uszkodzenia i złośliwe oprogramowanie z oryginału do kopii. Ma to znaczenie przy opcji --delete, opisanej niżej.

Podstawowe opcje rsync

Składnia to rsync [opcje] źródło cel, a po stronie zdalnej adres ma postać użytkownik@host:ścieżka. Do łączenia rsync domyślnie używa ssh.

OpcjaDziałanie według podręcznikaUwaga
-askrót dla -rlptgoD: rekurencja, dowiązania symboliczne, uprawnienia, czasy, grupa, właściciel, urządzenianie obejmuje -A (ACL), -X (atrybuty rozszerzone) ani -H (twarde dowiązania); właściciela ustawia tylko odbiorca działający jako root
-vwypisuje przesyłane pliki i krótkie podsumowaniebez niego rsync pracuje po cichu
-zkompresuje dane podczas przesyłaniaprzydaje się przy wolnym łączu
-npróba bez zmian (--dry-run)z -v lub -i pokazuje, co zrobi prawdziwy przebieg
--deleteusuwa w celu pliki, których nie ma w źródleopis niżej
--exclude=WZORZECpomija pasujące pliki i katalogiwzorce z pliku: --exclude-from=PLIK

Ukośnik na końcu źródła zmienia wynik. /var/www/ kopiuje zawartość katalogu, a /var/www kopiuje katalog razem z nazwą, więc w celu powstaje dodatkowy poziom www.

Kopia na drugą maszynę i wykluczenia

Opcja -e pozwala podać własne polecenie ssh, na przykład z innym portem. Próbny przebieg z wykluczeniami, uruchomiony na serwerze produkcyjnym:

rsync -avzn --exclude='cache/' --exclude='*.log' -e 'ssh -p 2234' /var/www/ kopia@serwer-kopii.example.org:/srv/kopie/www/

Wzorzec zakończony ukośnikiem dotyczy tylko katalogów, a zaczynający się od ukośnika, jak /tmp, odnosi się do początku kopiowanego katalogu, nie do korzenia systemu plików. Gdy lista wygląda dobrze, usuwa się -n i uruchamia polecenie jeszcze raz.

Bezpieczniej odwrócić kierunek: serwer kopii sam loguje się do produkcyjnego i pobiera dane, więc produkcja nie zna kluczy do magazynu kopii. Widzi on wtedy tylko pliki dostępne dla konta, na które się loguje. Klucz do pobierania można w authorized_keys ograniczyć do odczytu jednego katalogu:

command="rrsync -ro /var/www" ssh-ed25519 AAAA... kopia

Skrypt rrsync wchodzi w skład rsync, a opcja -ro pozwala tylko na odczyt i wyłącza --delete. Ścieżki w poleceniu rsync są wtedy liczone względem wskazanego katalogu, chyba że doda się -absolute, więc zapis źródła trzeba dopasować.

Opcja --delete: lustro zamiast archiwum

Z --delete rsync usuwa w celu pliki, których nie ma już w źródle, ale tylko w katalogach, które faktycznie synchronizuje. Źródłem musi być cały katalog (dir/), a nie gwiazdka rozwijana przez powłokę (dir/*). Podręcznik zaznacza, że opcja bywa niebezpieczna, i radzi zacząć od próby z -n.

  1. Uruchomić polecenie z -avn --delete i przejrzeć linie z komunikatem „deleting”.
  2. Dodać --max-delete=NUM: po przekroczeniu limitu rsync pomija dalsze usuwanie, ostrzega i kończy pracę kodem 25.
  3. Sprawdzić, czy źródło nie jest puste. Pusty katalog, na przykład po niezamontowaniu dysku, oznacza dla rsync, że w kopii nie powinno być nic.

Automatyczne wyłączenie usuwania działa tylko wtedy, gdy nadawca wykryje błędy wejścia-wyjścia, więc nie zastępuje własnej kontroli. Lustro z --delete to właśnie kopia odświeżana automatycznie, o której mówi dokument CISA: skasowany omyłkowo plik zniknie z kopii przy następnym przebiegu.

Kopie przyrostowe z --link-dest i cron

Opcja --link-dest=DIR tworzy w nowym katalogu twarde dowiązania do niezmienionych plików z poprzedniej kopii. Każdy dzień ma wtedy własny katalog z kompletem plików, a dodatkowe miejsce zajmują tylko zmiany. Pliki muszą być identyczne we wszystkich zachowywanych atrybutach, inaczej nie zostaną dowiązane. Podręcznik zaznacza, że opcja działa najlepiej przy kopiowaniu do pustego katalogu, więc przy osobnym katalogu na każdy dzień --delete nie jest potrzebne. Poniższy skrypt działa na serwerze kopii i pobiera dane z produkcyjnego:

#!/bin/sh
ZRODLO="kopia@serwer.example.org:/var/www/"
CEL=/srv/kopie
NOWA="$CEL/$(date +%F)"
POPRZEDNIA=""
if [ -d "$CEL/ostatnia" ]; then
  POPRZEDNIA="--link-dest=$CEL/ostatnia"
fi
rsync -a -e "ssh -i /root/.ssh/klucz_kopii" $POPRZEDNIA "$ZRODLO" "$NOWA/"
KOD=$?
if [ "$KOD" -eq 0 ] || [ "$KOD" -eq 24 ]; then
  ln -sfn "$NOWA" "$CEL/ostatnia"
fi

Format %F daje datę ISO 8601, a ssh -i wskazuje plik klucza prywatnego. Przy pierwszym uruchomieniu katalog ostatnia nie istnieje, więc powstaje pełna kopia. Dowiązanie jest przestawiane dopiero po udanym przebiegu: -s tworzy dowiązanie symboliczne, -f zastępuje istniejące, a -n traktuje stare dowiązanie do katalogu jak zwykły plik, zamiast tworzyć nowe wewnątrz niego. Kod 24 oznacza według podręcznika częściowy transfer z powodu plików, które zniknęły ze źródła w trakcie kopiowania. Starszy katalog z datą można usunąć bez szkody dla nowszych, bo dane pliku znikają dopiero wraz z ostatnim dowiązaniem.

30 2 * * * /usr/local/bin/kopia-rsync.sh

Taki wpis, dodany poleceniem crontab -e, uruchamia skrypt codziennie o 2:30: pięć pól czasu to minuta, godzina, dzień miesiąca, miesiąc i dzień tygodnia. Znak % w poleceniu crona zostaje zamieniony na znak nowego wiersza, jeśli nie poprzedza go ukośnik wsteczny, dlatego date +%F jest w skrypcie. Wynik poleceń cron trafia domyślnie pocztą do właściciela crontabu (MAILTO), o ile działa poczta, a rsync bez -v pracuje po cichu, więc wiadomość przyjdzie zwykle dopiero przy błędzie.

Test odtwarzania i reguła 3-2-1

Kopia, z której nikt jeszcze niczego nie odtworzył, jest tylko założeniem. Odtworzenie to ten sam rsync w drugą stronę, najlepiej do katalogu tymczasowego, a drugie polecenie porównuje wynik z kopią według sum kontrolnych:

rsync -a /srv/kopie/ostatnia/ /tmp/test-odtwarzania/
rsync -anic /srv/kopie/ostatnia/ /tmp/test-odtwarzania/

Opcja -c porównuje sumy kontrolne zamiast rozmiaru i czasu modyfikacji, -n niczego nie zmienia, a -i wypisuje różnice, więc pusty wynik oznacza zgodność plików. Sumy kontrolne wymagają odczytania całej zawartości plików po obu stronach, więc na dużym zbiorze trwa to długo. Prawdziwym sprawdzianem jest uruchomienie aplikacji z odtworzonych plików.

Pliki działającej bazy danych wymagają osobnego traktowania. Według dokumentacji PostgreSQL 18 przy kopii plików serwer musi być zatrzymany, by kopia była użyteczna. Spójny eksport działającej bazy daje pg_dump, choć poza prostymi przypadkami nie jest to według dokumentacji właściwy wybór do regularnych kopii baz produkcyjnych. Zrzut warto zrobić przed rsyncem i objąć kopią jego plik.

Reguła 3-2-1 przekłada się na ten układ tak: oryginał na serwerze, kopia przyrostowa na drugiej maszynie, trzecia kopia poza lokalizacją, na przykład na dysku zewnętrznym lub w usłudze chmurowej, które wymienia dokument CISA. Druga kopia na tym samym dysku co oryginał ginie razem z nim, o czym ostrzega ten sam dokument.

Najczęstsze pytania

Jak zrobić kopię zapasową serwera Linux za pomocą rsync?

Poleceniem rsync -a źródło cel, na przykład rsync -avz /var/www/ kopia@host:/srv/kopie/www/. Najpierw warto dodać -n, by zobaczyć próbę bez zmian. Rsync musi działać po obu stronach, a transport domyślnie idzie przez ssh.

Co robi opcja --delete w rsync i czy jest bezpieczna?

Usuwa w katalogu docelowym pliki, których nie ma w źródle. Podręcznik ostrzega, że bywa niebezpieczna, i radzi zacząć od -n. Liczbę usunięć ogranicza --max-delete=NUM, po jego przekroczeniu rsync kończy pracę kodem 25.

Jak działa --link-dest w kopiach przyrostowych?

Niezmienione pliki są dowiązywane twardo z katalogu poprzedniej kopii, więc każdy przebieg ma osobny katalog z kompletem plików, a miejsce zajmują tylko zmiany. Pliki muszą mieć identyczne atrybuty, inaczej nie zostaną dowiązane.

Jak uruchamiać rsync automatycznie w cronie?

Skrypt z poleceniem rsync wpisuje się do crontabu, na przykład 30 2 * * * /usr/local/bin/kopia-rsync.sh uruchamia go codziennie o 2:30. Znak % w poleceniu crona trzeba poprzedzić ukośnikiem wstecznym, więc date +%F lepiej trzymać w skrypcie.

Co oznacza reguła 3-2-1 w kopiach zapasowych?

Trzy egzemplarze ważnego pliku (oryginał i dwie kopie), na dwóch różnych typach nośników, z jedną kopią poza siedzibą. Tak opisuje ją dokument przygotowany dla US-CERT i udostępniany na stronie CISA.

Więcej poradników

Klucze SSH: jak je wygenerować, wgrać na serwer i wyłączyć logowanie hasłem

Klucze SSH krok po kroku: ssh-keygen z Ed25519 lub RSA 4096, hasło i ssh-agent, ssh-copy-id, uprawnienia 700 i 600 oraz postępowanie po utracie klucza.