rsync to narzędzie wiersza poleceń do synchronizacji i backupu plików między katalogami lub komputerami - lokalnie i przez SSH. Kopiuje tylko to, co się zmieniło (algorytm delta-transfer), dzięki czemu jest szybkie i oszczędza transfer. Podstawowa komenda: rsync -av zrodlo/ cel/.
W skrócie: rsync to koń roboczy każdego admina - od kopii zapasowej dokumentów, przez mirror dysku, po deploy strony na serwer. Poniżej rozkładam flagi na czynniki pierwsze, pokazuję gotowe komendy do skopiowania i tłumaczę, gdzie rsync potrafi cicho skasować dane, jeśli zapomnisz o jednym ukośniku.
rsync w skrócie - kiedy zamiast cp i scp
Trzy narzędzia do kopiowania plików, ale robią różne rzeczy. Konkret w tabeli:
| Narzędzie | Do czego | Kopiuje różnice | Zdalnie | Wznawia transfer |
|---|---|---|---|---|
cp |
kopia lokalna | nie, zawsze całość | nie | nie |
scp |
kopia zdalna przez SSH | nie, zawsze całość | tak | nie |
rsync |
synchronizacja lokalna i zdalna | tak, tylko zmiany | tak (SSH, demon) | tak |
Trade-off: cp i scp są prostsze i wystarczą do jednorazowego skopiowania. rsync wygrywa wszędzie tam, gdzie kopiujesz wielokrotnie ten sam zestaw plików - drugi i każdy kolejny przebieg dotyka tylko tego, co się zmieniło, więc trwa sekundy zamiast godzin. Do backupu, mirrora i deploya to fundamentalna różnica.
Czym jest rsync i jak działa algorytm delta-transfer
rsync to otwarte, darmowe narzędzie z rodziny Unix, stworzone przez Andrew Tridgella i Paula Mackerrasa (dane projektu). Jest preinstalowane w większości dystrybucji Linuksa i w macOS, więc na serwerze zwykle masz je od ręki - rsync --version to potwierdzi.
Sercem rsync jest algorytm delta-transfer. Zamiast wysyłać cały plik od nowa, rsync dzieli plik po stronie odbiorcy na bloki (hash bloku ma około 1 kB), liczy dla nich sumy kontrolne i porównuje je z blokami źródła za pomocą sumy przesuwnej (rolling checksum). Przez sieć leci wtedy tylko to, co faktycznie się różni - reszta jest składana z bloków, które odbiorca już ma. To dlatego drobna zmiana w wielkim pliku oznacza transfer kilku kilobajtów, nie całości.
Na starcie rsync używa quick check - najpierw porównuje rozmiar i czas modyfikacji plików. Jeśli oba się zgadzają, plik jest pomijany bez liczenia sum kontrolnych. To ten mechanizm sprawia, że drugie uruchomienie tej samej synchronizacji przelatuje przez tysiące niezmienionych plików w ułamku czasu. Delta-transfer wchodzi do gry dopiero dla plików, które quick check uzna za zmienione.
Konkret: pierwszy przebieg rsync kopiuje wszystko i trwa tyle, co zwykłe kopiowanie. Prawdziwa oszczędność zaczyna się od drugiego uruchomienia - i to jest cała magia tego narzędzia.
Składnia i najważniejsze flagi
Schemat komendy jest stały: rsync [opcje] ZRODLO CEL. Źródło i cel to katalogi lokalne albo zdalne (user@host:/sciezka). Cała siła rsync siedzi w flagach - oto te, których używasz codziennie:
| Flaga | Znaczenie |
|---|---|
-a |
tryb archive: rekursja plus zachowanie uprawnień, czasów, właściciela i symlinków |
-v / -vv |
verbose - wypisuje kopiowane pliki (podwójne -vv dodaje szczegóły) |
-z |
kompresja danych w transferze (przydatna przez wolne łącze) |
-h |
rozmiary w formacie czytelnym dla człowieka (KB, MB) |
-P |
skrót --partial --progress - pasek postępu plus wznawianie przerwanych plików |
--progress |
pasek postępu dla każdego pliku |
-n / --dry-run |
symulacja - pokazuje, co rsync zrobiłby, bez ruszania danych |
--delete |
usuwa z celu pliki, których nie ma już w źródle |
--exclude |
pomija wskazane pliki lub katalogi |
--exclude-from |
pomija wzorce wczytane z pliku |
W praktyce 90% zadań pokrywa jeden zestaw: -avz do transferu plus -P na pasek postępu przy większych paczkach. Resztę dokładasz sytuacyjnie.
Flaga --dry-run - najpierw sprawdź, potem kopiuj
Pro tip admina: zanim odpalisz cokolwiek z --delete albo cokolwiek na produkcji, uruchom to samo z --dry-run. rsync policzy i wypisze pełną listę operacji, ale niczego nie tknie.
# symulacja - zobacz, co się stanie, bez zmian na dysku
rsync -avn --delete ./strona/ user@serwer:/var/www/strona/
Sprawdź listę, a dopiero gdy się zgadza, usuń -n i puść na serio. Ten jeden nawyk uratował więcej danych niż jakikolwiek backup.
Flaga --delete - potężna i niebezpieczna
--delete robi z celu wierne lustro źródła: kasuje w celu wszystko, czego nie ma w źródle. To dokładnie to, czego chcesz przy mirrorze - i dokładnie to, co potrafi wyczyścić backup, jeśli podasz złe źródło.
Ostrzeżenie: --delete bez wcześniejszego --dry-run to najprostsza droga do skasowania danych, które chciałeś zachować. Jeśli pomylisz kierunek albo podasz pusty katalog źródłowy, rsync posłusznie opróżni cel. Zasada admina jest jedna: --delete zawsze najpierw na sucho.
Flaga --exclude - pomijanie plików i katalogów
Przy synchronizacji projektu nie chcesz wieźć node_modules, .git czy cache. Wykluczasz je flagą --exclude:
# pomiń katalogi ciezkie i nieistotne dla backupu kodu
rsync -avz --exclude 'node_modules' --exclude '.git' --exclude '*.log' \
./projekt/ user@serwer:/var/www/projekt/
Gdy wzorców jest dużo, wygodniej trzymać je w pliku i wczytać jednym --exclude-from=.rsyncignore. Każdy wzorzec w osobnej linii - działa jak .gitignore.
Znaczenie ukośnika końcowego - najczęstsza pułapka
Ukośnik na końcu źródła zmienia zachowanie rsync i to potyka niemal każdego na starcie:
rsync -a zrodlo/ cel/- kopiuje zawartość kataloguzrodlodocel. Pliki lądują bezpośrednio wcel.rsync -a zrodlo cel/- kopiuje sam katalogzrodlodo środkacel. Dostajeszcel/zrodlo/....
Konkret: ukośnik przy celu nie ma znaczenia, liczy się tylko ukośnik przy źródle. Jeśli po synchronizacji pliki wylądowały o jeden katalog za głęboko, to prawie na pewno brakujący albo nadmiarowy ukośnik. Zapamiętaj raz, oszczędzisz sobie godziny zdziwienia.
rsync lokalnie - synchronizacja katalogów
Zacznijmy od gruntu, czyli kopii między katalogami na tej samej maszynie. Backup katalogu dokumentów na dysk zewnętrzny:
# kopia dokumentow na dysk zewnetrzny, z paskiem postepu
rsync -avh --progress ~/Dokumenty/ /mnt/dysk-zewnetrzny/backup-dokumenty/
Po zakończeniu rsync wypisuje podsumowanie transferu - liczbę plików, ile danych realnie poleciało i jaka była przyspieszenie względem kopii pełnej:
sent 2,14M bytes received 1,20K bytes 1,43M bytes/sec
total size is 512M speedup is 239.10
To speedup to właśnie efekt delta-transfer: przy drugim przebiegu wysłano ułamek całości, bo reszta była już na miejscu i niezmieniona. Jeśli chcesz zrobić dokładne lustro dysku (cel ma być identyczny ze źródłem, łącznie z usuwaniem zbędnych plików), dokładasz --delete - ale zgodnie z regułą wyżej, najpierw na sucho.
rsync przez SSH - zdalny backup i deploy
Tu rsync pokazuje pełnię możliwości. Domyślnym kanałem transportu dla połączeń zdalnych jest SSH, więc kopia na serwer to po prostu podanie zdalnego celu w formacie user@host:/sciezka:
# deploy katalogu projektu na serwer przez SSH, z kompresja
rsync -avz ./projekt/ user@serwer:/var/www/projekt/
Flaga -z włącza kompresję w locie, co ma sens przez wolniejsze łącza. Ruch idzie szyfrowanym kanałem SSH - te same klucze i ta sama konfiguracja, na której opiera się logowanie do serwera. Jeśli dopiero zaczynasz z pracą zdalną, warto najpierw ogarnąć logowanie kluczem i podstawy SSH - z rsync spina się to jednym parametrem ProxyJump.
To zależy od ruchu: zdalny backup ma sens tylko wtedy, gdy masz dokąd go wysyłać. Domowy dysk nie zdejmie kopii poza dom, a to on ratuje dane przy pożarze czy kradzieży. Tani VPS jako zdalny target backupu rozwiązuje to za kilkanaście złotych miesięcznie i daje kontrolę, której nie ma pudełkowa chmura. Jeśli dobierasz maszynę pod backup i zadania DevOps, sprawdź porównanie VPS pod backup i automatyzację - dobierzesz zasoby pod realną objętość danych, bez przepłacania.
Automatyczny backup - rsync plus cron
Backup robiony ręcznie to backup, którego prędzej czy później nie zrobisz. Konkret: spinasz rsync z harmonogramem i zapominasz o sprawie. Najprostszy skrypt backupowy wygląda tak:
#!/bin/bash
# backup.sh - nocna kopia danych na zdalny serwer
rsync -az --delete \
--exclude 'cache' \
/var/www/dane/ user@serwer:/backup/dane/
Wpis w cronie uruchamia go codziennie o trzeciej w nocy:
0 3 * * * /home/user/backup.sh >> /var/log/backup.log 2>&1
Składnię wpisu i pułapki (PATH, pełne ścieżki, logowanie wyjścia) rozkładam osobno we wpisie o zadaniach cyklicznych w cronie do już istniejącego pliku. Efekt: masz kilkanaście dziennych migawek, a miejsce zajmują tylko zmiany plus jedna pełna kopia.
#!/bin/bash
# snapshot dzienny - niezmienione pliki linkuja sie do wczorajszej kopii
DZIS=$(date +%Y-%m-%d)
rsync -a --delete \
--link-dest=/backup/latest \
/var/www/dane/ /backup/$DZIS/
ln -nsf /backup/$DZIS /backup/latest
Każdy katalog /backup/RRRR-MM-DD wygląda jak kompletna kopia i możesz z niego przywrócić pojedynczy plik bez rozpakowywania czegokolwiek - a na dysku zajmuje ułamek tego, co sugeruje liczba migawek. To wzorzec, na którym stoją domowe rozwiązania backupu w stylu Time Machine.
Częste błędy i pułapki
Większość problemów z rsync to nie awarie, tylko powtarzalne potknięcia. Oto te, które łapią najczęściej:
- Zapomniany ukośnik końcowy - pliki lądują o katalog za głęboko (
cel/zrodlo/...zamiastcel/...). Zawsze świadomie decyduj o ukośniku przy źródle. --deletebez--dry-run- skasowane dane w celu, gdy pomylisz kierunek albo źródło jest puste. Najpierw na sucho, zawsze.Permission deniedna zdalnym - rsync działa z uprawnieniami użytkownika SSH. Do zapisu w katalogu systemowym potrzebujesz albo właściciela katalogu, albo--rsync-path="sudo rsync", żeby rsync po drugiej stronie startował z podniesionymi uprawnieniami.rsync: command not found- rsync nie jest natywnym narzędziem Windows. Na Windowsie uruchamiasz go przez WSL albo dystrybucję cwRsync (domyślnie instaluje się wC:\Program Files\cwRsync). Szczegóły w osobnym wpisie o rsync na Windows rsync -avn --delete zrodlo/ cel/
mirror z usuwaniem zbednych plikow (po sprawdzeniu --dry-run)
rsync -av --delete zrodlo/ cel/
pomijanie katalogow
rsync -avz --exclude 'node_modules' --exclude '.git' zrodlo/ cel/
Kto automatyzuje deploy i backup, naturalnie wchodzi głębiej w pracę z serwerem - solidne [podstawy SSH](/artykul/ssh) to następny logiczny krok, a stały serwer pod te zadania dobierzesz z zestawienia VPS pod DevOps.
## FAQ
### Czym różni się rsync od scp?
scp przy każdym uruchomieniu kopiuje całe pliki od nowa, a rsync przesyła tylko różnice dzięki algorytmowi delta-transfer. rsync potrafi też wznowić przerwany transfer (flaga `-P`), czego scp nie robi. Do jednorazowej kopii scp wystarczy, do powtarzalnej synchronizacji i backupu wygrywa rsync.
### Jak zrobić backup przez rsync over SSH?
Podajesz zdalny cel w formacie `user@serwer:/sciezka`, na przykład `rsync -avz ./dane/ user@serwer:/backup/dane/`. Transport idzie domyślnie przez SSH, więc korzysta z Twoich kluczy i konfiguracji. Dla portu innego niż 22 dodajesz `-e "ssh -p 2222"`. Do regularnego backupu spinasz tę komendę z cronem.
### Co robi flaga --delete w rsync i czy jest bezpieczna?
`--delete` usuwa z celu pliki, których nie ma już w źródle, tworząc wierne lustro. Jest bezpieczna tylko wtedy, gdy wiesz, co robisz - błędny kierunek albo puste źródło skasują dane w celu. Zasada admina: `--delete` zawsze uruchamiaj najpierw z `--dry-run`, sprawdź listę, dopiero potem na serio.
### Jak wykluczyć pliki lub katalogi z rsync?
Używasz flagi `--exclude 'wzorzec'`, na przykład `--exclude 'node_modules' --exclude '.git'`, żeby pominąć ciężkie i nieistotne katalogi. Gdy wzorców jest dużo, wpisz je do pliku po jednym w linii i wczytaj przez `--exclude-from=.rsyncignore`. Składnia wzorców działa podobnie do `.gitignore`.
### Czy rsync działa na Windows?
Tak, choć nie jest natywnym narzędziem Windows. Najwygodniej uruchomić go przez WSL (Windows Subsystem for Linux), gdzie masz pełnego rsync jak w Linuksie. Alternatywa to dystrybucja cwRsync, instalowana domyślnie w `C:\Program Files\cwRsync`. Szczegóły obu ścieżek opisuję w osobnym wpisie o rsync na Windows.
### Jak sprawdzić, co rsync zrobi, zanim to zrobi?
Dodaj flagę `--dry-run` (skrót `-n`) razem z `-v`: `rsync -avn zrodlo/ cel/`. rsync policzy i wypisze pełną listę operacji - które pliki skopiuje, a przy `--delete` które usunie - ale niczego nie tknie. To pierwszy odruch przy każdej komendzie, która może nadpisać albo skasować dane.