Rsync – zaawansowane narzędzie do synchronizacji plików
Rsync to bezpłatne narzędzie działające w trybie tekstowym, umożliwiające synchronizację plików zarówno w obrębie jednego komputera, jak i pomiędzy różnymi maszynami. Umożliwia ono przesyłanie pojedynczych plików oraz całych katalogów.
Dzięki swojej wszechstronności, Rsync jest idealny do wielu zadań, takich jak migracja danych, tworzenie kopii zapasowych oraz replikacja. Z tego powodu, jest to nieocenione narzędzie dla administratorów systemów i webmasterów, którzy często wykonują powtarzalne operacje przesyłania danych.
W niniejszym artykule zagłębimy się w mechanizmy działania Rsync i przedstawimy praktyczne przykłady jego użycia.
Jak działa Rsync?
Rsync jest narzędziem konsolowym, które służy do zdalnej synchronizacji plików w środowiskach uniksopodobnych. Pozwala użytkownikom na sprawną wymianę i synchronizację plików między różnymi komputerami, niezależnie od tego, czy działają one lokalnie, czy w sieci.
W tle, Rsync wykorzystuje algorytm transferu różnicowego. Polega on na kopiowaniu wyłącznie zmian pomiędzy dwoma plikami znajdującymi się w różnych miejscach – źródłowym i docelowym. Lokalizacje te mogą być lokalne lub zdalne. Rsync realizuje zadania kopiowania i synchronizacji danych na dwa sposoby:
- Wykorzystanie protokołów SSH lub RSH do synchronizacji pomiędzy dwoma hostami.
- Użycie demona TCP Rsync do transferu danych.
Ponieważ Rsync został opracowany z myślą o systemach Unix, doskonale funkcjonuje także w środowisku Linux.
Proces synchronizacji w Rsync wygląda następująco:
- Rsync łączy się ze zdalnym komputerem za pośrednictwem SSH, wymagając podania hasła.
- Po nawiązaniu połączenia, Rsync komunikuje się z systemem źródłowym.
- Następnie, program analizuje pliki i katalogi w celu określenia, które z nich wymagają synchronizacji. Do sprawdzenia różnic między plikami wykorzystywany jest algorytm transferu różnicowego.
Jeśli Rsync nie znajdzie pliku na hoście zdalnym, a plik ten istnieje lokalnie, skopiuje go na zdalny system. Analogicznie, jeśli plik istnieje w obu lokalizacjach, Rsync skopiuje tylko jego zmienione fragmenty. Pliki, które są identyczne w obu miejscach, zostaną pominięte bez wprowadzania zmian.
Rsync przeprowadza aktualizacje przyrostowe, przechowując zmiany w pliku tymczasowym, zanim zostaną one przeniesione do miejsca docelowego.
Przed rozpoczęciem pracy z Rsync, upewnij się, że:
- Posiadasz uprawnienia administratora (root lub sudo).
- Masz dostęp do terminala lub linii poleceń.
- Dysponujesz dostępem SSH do bezpiecznego wykonywania poleceń Rsync.
- Masz dostęp do dwóch komputerów, które będą brały udział w procesie synchronizacji.
W tym poradniku korzystamy z systemu Linux Mint 21.1 Vera, ale kroki przedstawione w artykule z powodzeniem zastosujesz również w innych dystrybucjach Linuksa.
Rsync vs Scp – dlaczego warto wybrać Rsync?
Scp (Secure Copy) to popularny protokół wiersza poleceń, który umożliwia kopiowanie plików. Działa on w sposób liniowy, co oznacza, że kopiuje całe pliki z lokalizacji źródłowej do docelowej. Aby zapewnić bezpieczeństwo, Scp korzysta z protokołu SSH.
Składnia polecenia Scp jest następująca:
scp opcja ŹRÓDŁO CEL
Pojawia się zatem pytanie, dlaczego mielibyśmy wybierać Rsync zamiast Scp?
Rsync ma wiele zalet w porównaniu do Scp, a najważniejsze z nich to:
- Szybsze działanie: Rsync działa szybciej niż Scp, dzięki wykorzystaniu protokołu zdalnej aktualizacji. Pozwala to na przesyłanie jedynie różnic między plikami, a nie całych plików od nowa. Pełna kopia jest wykonywana tylko za pierwszym razem, a kolejne operacje synchronizacji kopiują tylko zmienione fragmenty, dzięki algorytmowi transferu różnicowego.
- Oszczędność przepustowości: Rsync nie musi przesyłać całych plików ponownie, co prowadzi do mniejszego zużycia przepustowości. Ponadto, wykorzystuje algorytmy kompresji/dekompresji, aby zminimalizować rozmiar przesyłanych plików.
- Więcej opcji w linii poleceń: Rsync oferuje znacznie więcej opcji konfiguracji w linii poleceń, niż Scp. Daje to możliwość precyzyjnego dostrojenia Rsync do indywidualnych potrzeb.
Podsumowując, Rsync jest doskonałym narzędziem do synchronizacji przyrostowej. Scp jest również przydatny w sytuacjach, gdy potrzebujemy bezpiecznie przesłać pliki. W praktyce, Scp sprawdzi się w codziennych, prostych zadaniach. Natomiast Rsync, będzie znacznie lepszym rozwiązaniem w przypadku powtarzalnych operacji.
Składnia polecenia Rsync
Podstawowa składnia polecenia Rsync jest następująca:
rsync OPCJA ŹRÓDŁO UŻYTKOWNIK@HOST:CEL
Gdzie:
- OPCJA – Opcje konfiguracyjne polecenia Rsync.
- ŹRÓDŁO – Katalog źródłowy, z którego kopiowane są dane.
- CEL – Katalog docelowy, do którego przesyłane są dane.
- UŻYTKOWNIK – Nazwa użytkownika na zdalnym serwerze.
- HOST – Nazwa hosta zdalnego serwera lub jego adres IP.
Opcje to parametry, które rozszerzają funkcjonalność polecenia. Na przykład, opcja `-r` umożliwia rekurencyjną synchronizację, obejmującą wszystkie podkatalogi. Jednakże, opcja `-r` nie zachowuje atrybutów plików, takich jak właściciel, grupa, czasy modyfikacji, uprawnienia czy dowiązania symboliczne. Aby zachować te atrybuty, należy użyć opcji `-a`, która uruchamia Rsync w trybie archiwum.
Inne popularne opcje Rsync to:
- `-z`: kompresuje dane podczas przesyłania.
- `-h`: prezentuje dane w formacie czytelnym dla człowieka.
- `-b`: tworzy kopię zapasową danych w trakcie synchronizacji.
- `-e`: określa protokół używany do zdalnego przesyłania (np. SSH).
- `–progress`: wyświetla postęp synchronizacji.
- `-v`: wymusza wyświetlanie szczegółowych informacji.
- `–n`: wykonuje próbny przebieg, bez wprowadzania zmian.
- `-q`: wycisza wszystkie komunikaty.
Instalacja Rsync
Większość systemów Unix i Linux ma już zainstalowany Rsync. Jeśli jednak nie masz go w swoim systemie, zainstalujesz go za pomocą poniższych poleceń:
Dla Debiana, Ubuntu i Mint:
sudo apt-get install rsync
Dla Arch Linux:
pacman -S rsync
Dla Gentoo:
emerge sys-apps/rsync
Dla CentOS, Fedora i REHL:
sudo yum install rsync
Dla openSUSE:
sudo zypper install rsync
Ponieważ korzystamy z Linux Mint, Rsync był już preinstalowany. Możesz sprawdzić, czy jest zainstalowany, wpisując polecenie `rsync` w terminalu. Wyświetli ono informacje o jego możliwościach, opcjach oraz inne istotne dane.
nitt ~
$ rsync
rsync version 3.2.3 protocol version 31
Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.
Web site: https://rsync.samba.org/
Capabilities:
64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
socketpairs, hardlinks, hardlink-specials, symlinks, IPv6, atimes,
batchfiles, inplace, append, ACLs, xattrs, optional protect-args, iconv,
symtimes, prealloc, stop-at, no crtimes
Optimizations:
SIMD, no asm, openssl-crypto
Checksum list:
xxh128 xxh3 xxh64 (xxhash) md5 md4 none
Compress list:
zstd lz4 zlibx zlib none
rsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you
are welcome to redistribute it under certain conditions. See the GNU
General Public Licence for details.
rsync is a file transfer program capable of efficient remote update
via a fast differencing algorithm.
Przejdźmy teraz do praktycznych przykładów wykorzystania Rsync.
Na potrzeby tego poradnika utworzymy dwa katalogi:
- `katalog-zrodlowy`
- `katalog-docelowy`
Wpisz poniższe polecenia:
mkdir source-directory
mkdir dest-directory
Dodatkowo, musimy wygenerować pliki, aby Rsync miał na czym działać. Stworzymy kilka plików testowych za pomocą polecenia:
touch source-directory/file{1..100}
To polecenie utworzy 100 pustych plików w katalogu źródłowym. Możesz to zweryfikować wpisując polecenie:
ls source-directory
Wynik:
nitt rsync-tutorial
$ ls
dest-directory source-directory
nitt rsync-tutorial
$ touch source-directory/file{1..100}
nitt rsync-tutorial
$ ls source-directory
file1 file18 file27 file36 file45 file54 file63 file72 file81 file90
file10 file19 file28 file37 file46 file55 file64 file73 file82 file91
file100 file2 file29 file38 file47 file56 file65 file74 file83 file92
file11 file20 file3 file39 file48 file57 file66 file75 file84 file93
file12 file21 file30 file4 file49 file58 file67 file76 file85 file94
file13 file22 file31 file40 file5 file59 file68 file77 file86 file95
file14 file23 file32 file41 file50 file6 file69 file78 file87 file96
file15 file24 file33 file42 file51 file60 file7 file79 file88 file97
file16 file25 file34 file43 file52 file61 file70 file8 file89 file98
file17 file26 file35 file44 file53 file62 file71 file80 file9 file99
Uwaga: katalog docelowy pozostawiliśmy pusty.
Kopiowanie katalogów lokalnie
Chociaż Rsync jest przede wszystkim wykorzystywany do kopiowania plików między serwerem lokalnym i zdalnym, równie dobrze sprawdza się w kopiowaniu plików w ramach jednego komputera.
W takim przypadku użyjemy następującej składni:
rsync opcja ŹRÓDŁO CEL
Aby skopiować pliki z katalogu źródłowego do docelowego, uruchom poniższe polecenie:
rsync -r source-directory/ dest-directory
To polecenie skopiuje wszystkie pliki i podkatalogi z katalogu źródłowego do docelowego.
nitt rsync-tutorial
$ ls
dest-directory source-directory
nitt rsync-tutorial
$ ls dest-directory
nitt rsync-tutorial
$ ls source-directory
file1 file18 file27 file36 file45 file54 file63 file72 file81 file90
file10 file19 file28 file37 file46 file55 file64 file73 file82 file91
file100 file2 file29 file38 file47 file56 file65 file74 file83 file92
file11 file20 file3 file39 file48 file57 file66 file75 file84 file93
file12 file21 file30 file4 file49 file58 file67 file76 file85 file94
file13 file22 file31 file40 file5 file59 file68 file77 file86 file95
file14 file23 file32 file41 file50 file6 file69 file78 file87 file96
file15 file24 file33 file42 file51 file60 file7 file79 file88 file97
file16 file25 file34 file43 file52 file61 file70 file8 file89 file98
file17 file26 file35 file44 file53 file62 file71 file80 file9 file99
nitt rsync-tutorial
$ rsync -r source-directory/ dest-directory
nitt rsync-tutorial
$ ls dest-directory
file1 file18 file27 file36 file45 file54 file63 file72 file81 file90
file10 file19 file28 file37 file46 file55 file64 file73 file82 file91
file100 file2 file29 file38 file47 file56 file65 file74 file83 file92
file11 file20 file3 file39 file48 file57 file66 file75 file84 file93
file12 file21 file30 file4 file49 file58 file67 file76 file85 file94
file13 file22 file31 file40 file5 file59 file68 file77 file86 file95
file14 file23 file32 file41 file50 file6 file69 file78 file87 file96
file15 file24 file33 file42 file51 file60 file7 file79 file88 file97
file16 file25 file34 file43 file52 file61 file70 file8 file89 file98
file17 file26 file35 file44 file53 file62 file71 file80 file9 file99
Kopiowanie pojedynczego pliku lokalnie
Teraz, gdy opanowaliśmy synchronizację katalogów, nauczymy się kopiować pojedyncze pliki.
W tym celu, zmodyfikujemy plik `file1` w katalogu źródłowym, a następnie zsynchronizujemy go z identycznym plikiem w katalogu docelowym.
Aby edytować plik, wpisz poniższe polecenie:
nano source-directory/file1
Teraz, skopiuj i wklej poniższy tekst do edytora nano:
We're updating file1 in the source-directory.
Once we update, we'll push the new update to the dest-directory.
rsync doesn't need to re-copy the file using the delta-transfer algorithm.
This algorithm checks the differences and then updates destination files
accordingly.
So, once you save file1 in the source-directory, open file1 in
the dest-directory. It'll be empty.
However, if we check it after running rsync, you'll see that file1 in dest-directory
is updated.
Dodawanie treści do pliku
Teraz, zamknij i zapisz plik.
Przejdźmy do kopiowania pliku przy pomocy Rsync:
sudo rsync -v --existing source-directory/file1 dest-directory
#Output
nitt rsync-tutorial
$ sudo rsync -v --existing source-directory/file1 dest-directory
file1
sent 557 bytes received 35 bytes 1,184.00 bytes/sec
total size is 474 speedup is 0.80
nitt rsync-tutorial
$
Jak widzisz, użyliśmy opcji `–existing`. Powoduje ona aktualizację istniejących plików. Bez tej opcji, plik nie zostanie zaktualizowany, pomimo pomyślnego wykonania polecenia.
Jeśli kopiowany plik nie istnieje w folderze docelowym, należy użyć następującego polecenia:
rsync -v source-directory/newfile dest-directory
#Output
nitt rsync-tutorial
$ rsync -v source-directory/newfile dest-directory
newfile
sent 82 bytes received 35 bytes 234.00 bytes/sec
total size is 0 speedup is 0.00
Kopiowanie wielu plików
Jeśli chcemy skopiować więcej niż jeden plik, musimy podać ścieżki do każdego z nich, a następnie wskazać katalog docelowy.
W tym celu stworzymy dwa nowe pliki: `newfile2` i `newfile3` w katalogu źródłowym. Uruchom polecenie:
touch source-directory/newfile{2..3}
Teraz, użyjemy poniższego polecenia, aby zsynchronizować wiele plików:
rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory
#Output
nitt rsync-tutorial
$ rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory
newfile2
newfile3
sent 135 bytes received 54 bytes 378.00 bytes/sec
total size is 0 speedup is 0.00
nitt rsync-tutorial
$
Kopiowanie plików lub katalogów z lokalnego do zdalnego
Składnia Rsync dla transferu z lokalnego do zdalnego wygląda tak:
rsync opcja ŹRÓDŁO użytkownik@adres_ip:CEL
Aby to zadziałało, musisz znać adres IP zdalnego komputera. Adres ten podajemy po ścieżce pliku źródłowego.
rsync -av /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory
Przed rozpoczęciem transferu, system poprosi o podanie hasła. Wpisz je, aby kontynuować. Ponadto, jeśli nazwa użytkownika na zdalnej maszynie jest inna, musisz ją podać przed adresem IP, dodając znak `@`.
rsync -av /Projects/rsync-tutorial/source-directory [email protected]: /Projects/rsync-tutorial/dest-directory
Jeśli chcemy skopiować wiele plików lub katalogów, musimy podać ich listę. Składnia:
rsync -av /Projects/rsync-tutorial/source-directory/newfile1 /Projects/rsync-tutorial/source-directory/newfile2 192.168.192.200: /Projects/rsync-tutorial/dest-directory
Określanie protokołów transferu
Rsync umożliwia określenie konkretnych protokołów wykorzystywanych do przesyłania plików. W tym celu należy użyć opcji `-e` i wskazać protokół.
Na przykład, jeśli chcesz użyć protokołu SSH, musisz dodać `-e ssh` do polecenia Rsync:
rsync -e ssh /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory
Kopiowanie plików lub katalogów ze zdalnego do lokalnego
Składnia Rsync dla transferu ze zdalnego do lokalnego:
rsync opcja użytkownik@adres_ip:ŹRÓDŁO CEL
To polecenie działa na zasadzie pobierania danych. Aby pobrać pliki lub katalog ze zdalnego serwera na komputer lokalny, uruchom poniższe polecenie:
rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
Polecenie pobierze pliki z katalogu docelowego zdalnej maszyny do katalogu źródłowego na komputerze lokalnym.
Podobnie, możesz pobrać określony plik, podając jego pełną ścieżkę:
rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory/newfile4 /Projects/rsync-tutorial/source-directory
Aby skopiować wiele plików lub katalogów ze zdalnego do lokalnego, musimy umieścić je w nawiasach klamrowych (oddzielone przecinkami) po adresie IP serwera:
rsync -av 192.168.192.200: {/Projects/rsync-tutorial/dest-directory/, /home/music/2023-music} /Projects/rsync-tutorial/source-directory
Analogicznie, możesz także podać listę plików.
Wyświetlanie postępu transferu na żywo
Monitorowanie postępu transferu jest szczególnie przydatne przy kopiowaniu dużych ilości danych. W tym celu, użyj opcji `–progress`. Po dodaniu tej opcji do polecenia Rsync, będziesz mógł obserwować prędkość transferu, pozostały czas oraz ilość przesłanych danych.
rsync -av --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
Usuwanie plików źródłowych po zakończeniu transferu
Opcja `–remove-source-files` umożliwia automatyczne usunięcie plików źródłowych po pomyślnym zakończeniu transferu. Jest to przydatne w sytuacjach, gdy chcemy zabezpieczyć pliki, nie pozostawiając ich kopii, lub po prostu zwolnić miejsce na dysku.
rsync -av --remove-source-files 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
Próbny przebieg Rsync
Rsync pozwala na przeprowadzenie próbnego przebiegu, dzięki czemu możemy sprawdzić poprawność naszych ustawień i uniknąć potencjalnych błędów. Próbny przebieg pozwala na ocenę, czy polecenie wykona się poprawnie, bez ryzyka przypadkowej aktualizacji lub usunięcia plików.
Aby wykonać próbny przebieg, użyj opcji `–dry-run`. Dodaj ją do polecenia, podając źródło i miejsce docelowe.
sudo rsync -v --dry-run source-directory/file1 dest-directory
nitt rsync-tutorial
$ sudo rsync -v --dry-run source-directory/file1 dest-directory
file1
sent 43 bytes received 19 bytes 124.00 bytes/sec
total size is 474 speedup is 7.65 (DRY RUN)
nitt rsync-tutorial
Wyjście jest podobne do tego, co uzyskaliśmy wcześniej. Zauważ jednak, że na końcu danych wyjściowych pojawia się informacja `(DRY RUN)`.
Ustawianie minimalnego i maksymalnego rozmiaru plików
Rsync pozwala na filtrowanie przesyłanych plików na podstawie ich rozmiaru.
Na przykład, aby przesłać tylko pliki o rozmiarze co najmniej 15 KB, użyj opcji `–min-size=15k`:
rsync -av --min-size=15k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
To polecenie skopiuje tylko pliki o rozmiarze nie mniejszym niż 15 KB. Jeśli plik jest mniejszy, zostanie pominięty.
Analogicznie, możemy użyć flagi `–max-size`, aby ustawić maksymalny rozmiar przesyłanych plików:
rsync -av --max-size=450k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
W tym przypadku, Rsync pominie pliki o rozmiarze powyżej 450 KB.
Ograniczanie przepustowości
Jeśli wykonujesz inne zadania, które wymagają dużej przepustowości łącza, możesz ograniczyć przepustowość, z jakiej korzysta Rsync. W tym celu, użyj opcji `–bwlimit=KB/s`.
rsync -av --bwlimit=100 --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
Powyższe polecenie ustawi przepustowość na 100 KB/s podczas transferu.
Podsumowanie
W tym artykule omówiliśmy podstawy i zaawansowane techniki korzystania z narzędzia Rsync. Nauczyliśmy się, jak wykonywać operacje synchronizacji plików, zarówno lokalnie, jak i zdalnie. Poznaliśmy także wiele opcji konfiguracyjnych, które pozwalają na dostosowanie Rsync do różnych scenariuszy.
Rsync oferuje znacznie więcej funkcji niż te, które omówiliśmy. Dlatego zachęcamy do zapoznania się ze stroną podręcznika Rsync, gdzie szczegółowo omówione są wszystkie jego aspekty.
Warto również sprawdzić ściągawki wiersza poleceń dla systemów Windows, Linux i macOS.
newsblog.pl
Maciej – redaktor, pasjonat technologii i samozwańczy pogromca błędów w systemie Windows. Zna Linuxa lepiej niż własną lodówkę, a kawa to jego główne źródło zasilania. Pisze, testuje, naprawia – i czasem nawet wyłącza i włącza ponownie. W wolnych chwilach udaje, że odpoczywa, ale i tak kończy z laptopem na kolanach.