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
sudolub 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).