Rsync to jedno z najbardziej wydajnych i niezawodnych narzędzi do przesyłania i synchronizacji plików w systemach Linux i uniksopodobnych. To potężne narzędzie wiersza poleceń, od ponad dwóch dekad stanowiące filar zarządzania danymi dla administratorów, deweloperów i zespołów backupowych. Rsync wyróżnia się zdolnością do przesyłania tylko zmian między plikami źródłowymi a docelowymi, co drastycznie zmniejsza zużycie przepustowości i czas transferu względem tradycyjnego kopiowania. W tym przewodniku znajdziesz kluczowe koncepcje, praktyczne zastosowania, zaawansowane techniki konfiguracji oraz strategie optymalizacji wydajności.

Czym jest rsync i jego podstawowe koncepcje

Rsync („remote synchronization”) służy do synchronizacji i kopiowania plików oraz katalogów między dwiema lokalizacjami – lokalnie oraz zdalnie przez sieć. Rdzeń funkcjonalności rsync polega na porównywaniu plików źródłowych i docelowych oraz przesyłaniu wyłącznie różnic, a nie całych plików. To podejście istotnie oszczędza pasmo i czas, szczególnie przy dużych zbiorach danych lub wolnych łączach.

Rsync jest napisany w C, działa jednowątkowo i jest dostępny na licencji GPL-3.0-or-later. To standardowy komponent większości dystrybucji Linuksa, dostępny także na macOS, FreeBSD, NetBSD, OpenBSD oraz Windows (poprzez Cygwin, Windows Subsystem for Linux – WSL, lub narzędzia z GUI, np. Grsync). Historia projektu sięga 1996 roku (Andrew Tridgell, Paul Mackerras), a rozwojem kieruje dziś Wayne Davison.

Pierwotnie zainspirowany narzędziem rdist (1983), rsync zawdzięcza sukces rewolucyjnemu algorytmowi synchronizacji, opisanemu szczegółowo w pracy doktorskiej Tridgella (1999), który pozwala efektywnie identyfikować i przesyłać jedynie zmienione fragmenty danych.

Jak działa rsync – algorytm transferu delta

Sercem rsync jest algorytm delta encoding. Pozwala on identyfikować i przesyłać wyłącznie te części pliku, które uległy zmianie, dzięki czemu transfer jest lekki i szybki. Poniżej skrótowo opis działania:

Plik źródłowy jest dzielony na bloki (np. 512 B – 1 KB). Dla każdego bloku rsync oblicza dwie sumy kontrolne: słabą (rolling checksum) i silną (np. MD5/SHA-1). Słaba suma może być szybko aktualizowana wraz z przesuwaniem okna po pliku.

Lista sum bloków ze źródła trafia do celu. Maszyna docelowa dzieli własną kopię pliku na bloki tej samej wielkości, oblicza sumy i szuka dopasowań, używając szybkiej słabej sumy. Słaba suma zapewnia błyskawiczne wstępne dopasowanie bloków, a silna potwierdza ich identyczność.

Gdy dopasowanie zostanie potwierdzone, blok nie jest przesyłany. W przeciwnym razie rsync wysyła jedynie brakujące dane i instrukcje scalania. Algorytm działa w sposób rozproszony, nie wymagając jednoczesnego dostępu do obu pełnych kopii pliku po jednej stronie.

Główne zalety i ograniczenia rsync

Poniżej zebraliśmy najważniejsze atuty, które sprawiły, że rsync stał się standardem w ekosystemie Linux/Unix:

  • transfer różnicowy – przesyła tylko zmienione fragmenty plików, radykalnie ograniczając wolumen danych;
  • uniwersalność – działa lokalnie, w sieci LAN i przez Internet, w wielu systemach operacyjnych;
  • zachowanie atrybutów – uprawnienia, właściciele, czasy modyfikacji, dowiązania symboliczne/twarde;
  • bezpieczeństwo – wsparcie szyfrowania przez SSH i możliwość stosowania kluczy;
  • elastyczne filtrowanie – reguły include/exclude, wzorce, filtry o dużej precyzji.

Warto również znać typowe ograniczenia:

  • pełne skanowanie drzew – przy bardzo dużych zbiorach skan po obu stronach może być czasochłonny;
  • brak trybu „real-time” – rsync działa na żądanie; do zdarzeń w czasie zbliżonym do rzeczywistego lepsze jest lsyncd;
  • złożoność CLI – mnogość opcji może być trudna na początku, a –delete bywa ryzykowne bez testu;
  • bardzo duże transfery WAN – przy wysokich opóźnieniach inne narzędzia/protokoły mogą być szybsze;
  • brak wbudowanych alertów – błędy wymagają własnego mechanizmu powiadomień.

Instalacja i wymagania wstępne

W większości dystrybucji Linux rsync jest preinstalowany lub dostępny w menedżerach pakietów. Na Debian/Ubuntu: apt-get install rsync. Na systemach RPM (CentOS, Fedora, Red Hat): yum install rsync lub dnf install rsync. W macOS rsync jest zwykle dostępny, a w razie potrzeby zainstalujesz go przez Homebrew: brew install rsync.

Na Windows najwygodniej uruchomić rsync w środowisku zgodnym z Unix. Najpopularniejsze warianty to:

  • Windows Subsystem for Linux (WSL) – pełne środowisko Linux i standardowa instalacja rsync;
  • Cygwin – warstwa kompatybilności uniksowej w Windows z pakietem rsync;
  • narzędzia z GUI – np. DeltaCopy, Grsync (często rzadziej utrzymywane).

Do zdalnej synchronizacji potrzebny jest również SSH po obu stronach. Jeśli planujesz transfery bez hasła, skonfiguruj uwierzytelnianie kluczem SSH, generując parę kluczy i dodając klucz publiczny do ~/.ssh/authorized_keys na hoście docelowym. Umożliwi to bezprzerwowe, automatyczne uruchamianie rsync.

Podstawowa składnia i najczęściej używane flagi

Podstawowa forma polecenia to: rsync [opcje] źródło cel. Źródło to katalog lub plik do zsynchronizowania, a cel to lokalizacja docelowa. Najważniejsze opcje z praktycznymi wskazówkami:

  • -a (archive) – skrót dla -rlptgoD (rekursja, linki symboliczne, uprawnienia, czasy, właściciele/grupy, pliki urządzeń);
  • -v (verbose) – zwiększa szczegółowość wyjścia;
  • -z (compress) – kompresuje transfer, dobre na wolnych łączach, na bardzo szybkich może spowalniać przez koszt CPU;
  • -h (human-readable) – czytelne rozmiary, ułatwia analizę logów;
  • –delete – usuwa w celu pliki nieobecne w źródle (lustrzane odbicie) – zawsze najpierw testuj z --dry-run;
  • –dry-run / -n – symulacja bez zmian, świetna do weryfikacji, szczególnie z –delete;
  • -e ssh – wymusza SSH i pozwala przekazać jego opcje, np. -e "ssh -p PORT";
  • –exclude / –include – filtrują synchronizowane zasoby (np. --exclude="*.log");
  • –progress – pokazuje postęp transferu;
  • –bwlimit=KBPS – ogranicza przepustowość, przydatne na współdzielonych łączach;
  • -u / –update – pomija pliki nowsze po stronie docelowej;
  • -H – zachowuje dowiązania twarde.

Synchronizacja plików lokalnie

Najprostsze zastosowanie rsync to synchronizacja na tym samym komputerze (np. dysk lokalny i nośnik USB):

rsync -av /home/user/documents/ /mnt/backup/documents/

W tym przykładzie wszystkie pliki z /home/user/documents/ są kopiowane do /mnt/backup/documents/ z zachowaniem atrybutów (-a) i szczegółowym logiem (-v). Zwróć uwagę na ukośnik na końcu ścieżki źródłowej – oznacza on kopiowanie zawartości katalogu, a nie samego katalogu.

Aby wymusić lustrzane odbicie (wraz z usuwaniem nieistniejących już plików), użyj:

rsync -av --delete /home/user/documents/ /mnt/backup/documents/

Najpierw przetestuj planowane zmiany:

rsync -av --dry-run --delete /home/user/documents/ /mnt/backup/documents/

Dla pojedynczych plików składnia jest analogiczna:

rsync -avh backup.tar.gz /mnt/backup/

Przy dużych zbiorach użyj -x, aby nie przechodzić przez granice systemów plików:

rsync -avx --delete /home/ /mnt/raid/home/

Zapobiegnie to wchodzeniu w punkty montowania (np. /proc, /sys), co mogłoby spowolnić operację lub generować błędy.

Synchronizacja plików zdalnie poprzez SSH

Aby pobrać pliki z serwera zdalnego (pull):

rsync -avz user@remote_host:/path/to/source/files /local/backup/

Aby przesłać pliki na serwer (push):

rsync -avz /local/files/ user@remote_host:/path/to/destination/

Jeśli serwer SSH słucha na niestandardowym porcie:

rsync -avz -e "ssh -p 2222" /local/files/ user@remote_host:/path/to/destination/

Po skonfigurowaniu kluczy możesz wskazać konkretny klucz prywatny:

rsync -avz -e "ssh -i ~/.ssh/my_key" /local/files/ user@remote_host:/path/to/destination/

Dla większego bezpieczeństwa można ograniczyć użycie klucza w authorized_keys do uruchamiania wyłącznie rsync, dodając prefiks command= do wpisu klucza.

Zaawansowane opcje i funkcjonalności

–link-dest pozwala tworzyć inkrementacyjne kopie zapasowe z dowiązaniami twardymi:

rsync -a --link-dest=/path/to/previous/backup /source/ /path/to/new/backup/

Nie zmienione pliki są reprezentowane jako twarde linki do poprzedniej kopii, co oszczędza miejsce przy zachowaniu pełnych „zrzutów”.

–backup-dir przenosi zmodyfikowane lub usunięte pliki do wskazanego katalogu zamiast ich trwałego usuwania:

rsync -a --delete --backup-dir=/path/to/backup /source/ /destination/

–exclude-from i –include-from wczytują wzorce z plików, co ułatwia zarządzanie rozbudowanymi regułami:

rsync -av --exclude-from=/path/to/exclude-list --include-from=/path/to/include-list /source/ /destination/

–checksum porównuje pliki na podstawie sum kontrolnych zamiast czasu i rozmiaru (wolniejsze, ale gwarantuje identyczność):

rsync -a --checksum /source/ /destination/

–inplace aktualizuje pliki „w miejscu” (oszczędza miejsce, ale ryzykowne przy przerwaniu). –partial zachowuje częściowo przesłane pliki, umożliwiając wznowienie.

Praktyczne zastosowania – tworzenie kopii zapasowych

Rsync doskonale sprawdza się w backupach, ponieważ transferuje inkrementalnie tylko zmiany. Przykładowy prosty skrypt dzienny z logowaniem:

#!/bin/bash
SOURCE="/home/user/documents/"
DEST="/backup/documents/"
LOGFILE="/var/log/rsync-backup.log"
DATE=$(date +"%Y-%m-%d %H:%M:%S")

rsync -av --delete "$SOURCE" "$DEST" >> "$LOGFILE" 2>&1
echo "Backup completed at $DATE" >> "$LOGFILE"

Inkrementalne kopie z datami i dowiązaniami twardymi (pełne „snapshots” przy minimalnym zużyciu miejsca):

#!/bin/bash
SOURCE="/home/user/documents/"
BACKUP_DIR="/backup/daily"
DATETAG=$(date +%Y-%m-%d)

# Jeśli to nie jest pierwszy backup, użyj --link-dest
if [ -e "$BACKUP_DIR/latest" ]; then
rsync -a --delete --link-dest="$BACKUP_DIR/latest" "$SOURCE" "$BACKUP_DIR/$DATETAG"
else
rsync -a --delete "$SOURCE" "$BACKUP_DIR/latest"
fi

# Zaktualizuj symlink latest
rm -f "$BACKUP_DIR/latest"
ln -s "$BACKUP_DIR/$DATETAG" "$BACKUP_DIR/latest"

Automatyzacja z cron

Regularne kopie najlepiej zautomatyzować za pomocą cron. Edytuj crontab:

crontab -e

Codziennie o 2:00:

0 2 * * * /usr/local/bin/rsync-backup.sh

Format: minuta (0–59), godzina (0–23), dzień miesiąca (1–31), miesiąc (1–12), dzień tygodnia (0–7, 0 i 7 to niedziela). Uruchamianie co godzinę:

0 * * * * /usr/local/bin/rsync-backup.sh

Zakres godzin (np. między 22:00 a 04:00):

0 22-4 * * * /usr/local/bin/rsync-backup.sh

Alternatywnie użyj jednostek systemd timers dla bardziej zaawansowanych harmonogramów.

Bezpieczeństwo przy używaniu rsync

Zawsze używaj rsync wraz z SSH, aby szyfrować transfer danych, szczególnie przy plikach wrażliwych. Poniżej szybka konfiguracja kluczy dla automatyzacji:

Wygeneruj parę kluczy:

ssh-keygen -t rsa -b 4096 -f ~/.ssh/rsync_key

Skopiuj klucz publiczny na serwer:

ssh-copy-id -i ~/.ssh/rsync_key.pub user@remote_host

Użyj klucza w rsync:

rsync -av -e "ssh -i ~/.ssh/rsync_key" /local/ user@remote_host:/remote/

W razie potrzeby ogranicz wpis w authorized_keys do komendy rsync przez prefiks command=, aby klucz nie dawał powłoki interaktywnej.

Strategie optymalizacji wydajności

Dobierz kompresję do łącza. Na wolnej sieci używaj -z, na szybkiej – zrezygnuj, by uniknąć kosztów CPU:

# Wolna sieć – z kompresją
rsync -avz /source/ user@host:/dest/

# Szybka sieć – bez kompresji
rsync -av /source/ user@host:/dest/

Możesz też dostroić poziom kompresji:

rsync -av --compress-level=6 /source/ user@host:/dest/

Na bardzo szybkich łączach rozważ –whole-file (pomija obliczenia różnicowe, przesyła całe pliki, gdy uległy zmianie):

rsync -av --whole-file /source/ user@host:/dest/

Ogranicz liczbę pełnych skanów drzew katalogów – np. używaj lsyncd (inotify) do uruchamiania rsync tylko przy wykrytych zmianach.

Optymalizuj połączenia SSH (utrwalanie sesji sterującej):

rsync -av -e "ssh -o ControlMaster=auto -o ControlPersist=600" /source/ user@host:/dest/

Przy ogromnych zbiorach rozważ dzielenie na mniejsze partie i rozważne transfery równoległe, aby nie przeciążyć sieci i serwerów.

Porównanie z innymi narzędziami

cp kopiuje lokalnie całe pliki bez synchronizacji i transferu różnicowego. scp kopiuje bezpiecznie między hostami przez SSH, ale również zawsze przesyła całe pliki. Rsync przesyła tylko zmienione fragmenty, oferując dodatkowo filtrowanie, kompresję i szereg opcji. Oto szybkie porównanie:

Narzędzie Lokalna kopia Zdalny transfer Transfer różnicowy Zachowanie atrybutów Kompresja Typowe zastosowanie
cp Tak Nie Nie Tak (z -a) Nie Proste kopiowanie lokalne
scp Nie Tak (SSH) Nie Częściowo (np. -p) Tak (kompresja SSH) Szybki transfer host↔host
rsync Tak Tak (SSH) Tak Tak (tryb -a) Tak (-z) Synchronizacja i backup

W sieciach LAN rsync często wygrywa ze scp dzięki transferowi różnicowemu; w łączach WAN przewagę mogą dawać narzędzia takie jak rclone, korzystające z optymalizacji protokołów.

Rozwiązywanie typowych problemów

Poniżej lista najczęstszych problemów i szybkie wskazówki naprawy:

  • command not found – rsync nie jest zainstalowany po jednej ze stron, doinstaluj pakiet lokalnie i zdalnie;
  • permission denied – brak uprawnień do plików/katalogów, użyj sudo lub dostosuj prawa dostępu;
  • problemy z SSH – zweryfikuj łączność i klucze, upewnij się, że działa uwierzytelnianie;
  • timeouty i niestabilne łącze – dostosuj opcje SSH (np. czasy i keepalive) oraz rozważ ograniczenie pasma;
  • udziały CIFS/SMB na Windows – sprawdź uprawnienia użytkownika i opcje montowania udziału.

Problemy z połączeniem SSH zdiagnozujesz prostym testem:

ssh user@remote_host "echo OK"

Jeśli są timeouty, spróbuj dopasować opcje SSH:

rsync -av -e "ssh -o ConnectTimeout=10 -o ServerAliveInterval=30" /source/ user@host:/dest/

Zawsze weryfikuj działanie poleceń na małych próbkach danych i używaj --dry-run przed operacjami destrukcyjnymi (np. z --delete).