Poznaj rsync: Narzędzie do Synchronizacji Plików
Rsync to darmowe narzędzie działające w linii poleceń, które umożliwia synchronizację plików zarówno lokalnie, jak i zdalnie. Umożliwia ono przesyłanie zarówno pojedynczych plików, jak i całych struktur katalogów.
Jego elastyczność sprawia, że jest nieoceniony przy migracji danych, tworzeniu kopii zapasowych oraz replikacji danych. Jest to szczególnie przydatne dla webmasterów oraz administratorów systemów, którzy często wykonują powtarzalne zadania związane z przesyłaniem informacji.
W tym artykule omówimy, jak działa rsync i przedstawimy kilka praktycznych przykładów jego zastosowania.
Jak działa rsync?
Rsync to narzędzie wiersza poleceń dedykowane synchronizacji zdalnej, które funkcjonuje w środowiskach uniksopodobnych. Użytkownik może dzięki niemu w prosty sposób przesyłać i synchronizować pliki między różnymi maszynami lub dwoma hostami.
Wewnętrznie, rsync wykorzystuje algorytm przesyłania różnic (delta transfer). Polega to na kopiowaniu jedynie zmian pomiędzy dwoma plikami znajdującymi się na dwóch hostach – źródłowym i docelowym. Zarówno źródło, jak i cel mogą znajdować się lokalnie lub zdalnie. Rsync oferuje dwa sposoby wykonywania zadań kopiowania/synchronizacji danych:
- Wykorzystanie protokołów ssh lub rsh do synchronizacji między hostami.
- Użycie demona TCP rsync.
Ze względu na swoje przeznaczenie do pracy w systemach Unix, rsync bezproblemowo funkcjonuje również w systemie Linux.
Proces synchronizacji rsync przebiega krok po kroku w następujący sposób:
- Rsync łączy się ze zdalnym hostem za pomocą SSH, wymagając podania hasła.
- Po nawiązaniu połączenia, rsync komunikuje się ze źródłem danych.
- Następnie programy określają, które pliki i katalogi wymagają synchronizacji. Wykorzystywany jest algorytm transferu delta w celu zidentyfikowania różnic pomiędzy plikami.
Jeżeli rsync nie odnajdzie pliku na serwerze zdalnym, a istnieje on na hoście, to go skopiuje i prześle do systemu hosta. Analogicznie, w przypadku istniejących plików (zarówno na hoście, jak i zdalnym), zostaną skopiowane jedynie różnice (czyli zmodyfikowane fragmenty). Pliki, które nie uległy zmianie w obu systemach, zostaną zignorowane.
Rsync wykonuje aktualizacje przyrostowe, przechowując zmiany w pliku tymczasowym, przed przesłaniem ich do miejsca docelowego.
Zanim zaczniesz:
- Musisz posiadać uprawnienia administratora (root lub sudo).
- Musisz mieć dostęp do terminala lub linii poleceń.
- Wymagany jest dostęp SSH, aby bezpiecznie uruchamiać polecenia rsync.
- Potrzebne są dwie maszyny do przeprowadzenia procesu rsync.
W naszym przykładzie użyjemy dystrybucji Linux Mint 21.1 Vera. Możesz bez problemu korzystać z dowolnej innej dystrybucji Linuksa, ponieważ instrukcje są uniwersalne.
Dlaczego rsync jest lepszy niż Scp?
Scp (bezpieczne kopiowanie) to popularny protokół w linii poleceń, umożliwiający kopiowanie plików. Wykorzystuje on liniowe podejście do kopiowania, co oznacza, że po prostu przesyła pliki ze źródła do miejsca docelowego, używając przy tym SSH dla bezpieczeństwa.
Składnia polecenia scp wygląda następująco:
scp opcja ŹRÓDŁO CEL
Pojawia się zatem pytanie, dlaczego warto wybrać rsync zamiast scp?
Otóż, używanie rsync niesie ze sobą wiele korzyści. Do najważniejszych należą:
- Szybsze działanie: rsync jest szybszy od scp, ponieważ wykorzystuje mechanizm zdalnej aktualizacji. Przesyłane są jedynie różnice, a nie całe pliki. W przypadku regularnej synchronizacji, pełna kopia wykonywana jest tylko raz. Następne synchronizacje obejmują już tylko zaktualizowane fragmenty, dzięki algorytmowi transferu delta.
- Mniejsze zużycie przepustowości: ponieważ rsync nie kopiuje ponownie całych plików, zużywa znacznie mniej pasma. Dodatkowo, wykorzystuje algorytmy kompresji/dekompresji, minimalizując rozmiar plików podczas transferu.
- Więcej opcji w linii poleceń: rsync oferuje więcej opcji wiersza poleceń niż scp. Pozwala to na precyzyjne dostrojenie pracy rsync.
Podsumowując, rsync to doskonałe narzędzie do synchronizacji przyrostowej. Scp również sprawdza się przy bezpiecznym przesyłaniu i synchronizacji plików. W codziennych zadaniach scp może być wystarczający, jeśli szukasz prostego rozwiązania. Jednak przy powtarzalnych operacjach, rsync jest zdecydowanie lepszym wyborem.
Składnia polecenia rsync
Polecenie rsync ma następującą strukturę:
rsync OPCJA ŹRÓDŁO CEL
Gdzie:
- OPCJA – Opcje rsync.
- ŹRÓDŁO – Katalog źródłowy.
- CEL – Katalog docelowy.
- UŻYTKOWNIK – Nazwa użytkownika zdalnego.
- HOST – Zdalna nazwa hosta lub adres IP.
Opcje to dodatkowe parametry, które rozszerzają funkcjonalność polecenia. Na przykład, dane mogą być synchronizowane rekurencyjnie za pomocą opcji -r. Jednak -r nie synchronizuje własności grup i użytkowników, znaczników czasowych, uprawnień oraz dowiązań symbolicznych. Dlatego można użyć opcji -a, która uruchamia tryb archiwum, zapewniając zachowanie wszystkich praw własności, uprawnień i dowiązań symbolicznych pliku.
Inne popularne opcje rsync:
- -z: kompresja danych w celu oszczędności miejsca.
- -h: przedstawienie danych wyjściowych w formacie czytelnym dla człowieka.
- -b: utworzenie kopii zapasowej podczas synchronizacji.
- -e: użycie protokołu SSH do zdalnego przesyłania danych.
- –progress: wyświetlenie postępu synchronizacji.
- -v: wyświetlenie pełnych danych wyjściowych.
- -n: wykonanie próbnego przebiegu w celu weryfikacji ustawień.
- -q: pominięcie danych wyjściowych oraz opcji polecenia rsync.
Instalacja rsync
Większość systemów Unix i Linux ma rsync zainstalowany domyślnie. Jeśli w Twoim systemie go brakuje, możesz go zainstalować za pomocą poniższych poleceń.
Dla Debiana, Ubuntu i Minta:
sudo apt-get install rsync
Dla Arch Linuxa:
pacman -S rsync
Dla Gentoo:
emerge sys-apps/rsync
Dla CentOS, Fedory i REHL:
sudo yum install rsync
Dla openSUSE:
sudo zypper install rsync
W przypadku Linux Mint, rsync jest preinstalowany. Możesz sprawdzić, czy rsync jest zainstalowany, wpisując polecenie `rsync` w terminalu. Wyświetli ono informacje o jego możliwościach, opcjach i inne istotne dane, jeśli jest obecne.
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 użycia rsync.
W naszym przykładzie utworzymy dwa katalogi:
- katalog-źródłowy
- katalog-docelowy
Wpisz poniższe polecenia, aby je utworzyć:
mkdir source-directory mkdir dest-directory
Dodatkowo, aby rsync miał co synchronizować, wygenerujemy kilka plików testowych za pomocą poniższego polecenia:
touch source-directory/file{1..100}
Spowoduje to utworzenie 100 pustych plików w katalogu źródłowym. Możesz to sprawdzić, wpisując:
ls source-directory
Output: 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
Zwróć uwagę, że katalog docelowy jest pusty.
Kopiowanie katalogów lokalnie – rekurencyjnie
Chociaż rsync jest najczęściej używany do kopiowania plików między serwerem lokalnym a zdalnym, jest on równie przydatny do lokalnego kopiowania plików.
W takim przypadku użyjemy następującej składni rsync:
rsync opcja ŹRÓDŁO CEL
Skopiujmy pliki z naszego katalogu źródłowego do docelowego za pomocą następującego polecenia:
rsync -r source-directory/ dest-directory
Polecenie rekurencyjnie skopiuje pliki z katalogu źródłowego do katalogu 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
Wszystkie pliki z katalogu źródłowego zostały skopiowane do docelowego.
Kopiowanie pojedynczego pliku
Po opanowaniu synchronizacji katalogów, nauczymy się kopiować pojedynczy plik.
W tym celu zmodyfikujemy plik file1 w katalogu źródłowym, a następnie zsynchronizujemy go z tym samym plikiem w katalogu docelowym.
Użyj poniższego polecenia, aby edytować plik:
nano source-directory/file1
Wklej następujący 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
Zamknij i zapisz plik.
Skopiujmy teraz plik za pomocą 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 $
Użyta została opcja `–existing`, która aktualizuje istniejące pliki. Użycie polecenia bez tej opcji nie zaktualizuje pliku, mimo pomyślnego działania.
Jeśli kopiowany plik nie istnieje w katalogu docelowym, musisz 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
Aby skopiować wiele plików, należy podać ścieżki źródłowe i katalog docelowy.
W tym celu, utwórzmy dwa nowe pliki: newfile2 i newfile3 w katalogu source-directory:
touch source-directory/newfile{2..3}
Użyj teraz poniższego polecenia do synchronizacji wielu 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/katalogów z lokalnego do zdalnego
Składnia rsync dla transferu lokalnego na zdalny jest następująca:
rsync opcja ŹRÓDŁO [email protected]:CEL
Aby transfer zadziałał, musisz znać adres IP zdalnej maszyny. Dodaj go po nazwie 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 hasło. Wpisz je, aby kontynuować. Jeśli użytkownik na zdalnej maszynie jest inny, musisz o tym wspomnieć przed adresem IP, dodając @.
rsync -av /Projects/rsync-tutorial/source-directory [email protected]: /Projects/rsync-tutorial/dest-directory
Jeśli chcesz skopiować wiele plików/katalogów, musisz podać ich listę lub ścieżki. Składnia wygląda następująco:
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 dla zdalnych transferów
Rsync umożliwia określenie konkretnego protokołu przesyłania plików za pomocą opcji `-e`, po której następuje nazwa protokołu.
Na przykład, aby 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/katalogów ze zdalnego do lokalnego
Składnia rsync dla transferu zdalnego do lokalnego jest następująca:
rsync opcja [email protected]:ŹRÓDŁO CEL
Działa to jako polecenie „pobierz”. Aby pobrać pliki/katalogi z serwera zdalnego na lokalny komputer, należy wykonać:
rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
Powyższe polecenie pobierze pliki z katalogu docelowego na zdalnej maszynie do katalogu źródłowego na lokalnej maszynie.
Możesz również pobrać konkretny 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, należy określić ścieżki w nawiasach klamrowych (oddzielonych 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
Podobnie można określić listę plików.
Wyświetlanie postępu transferu na żywo
Dobrze jest monitorować postęp transferu podczas tworzenia większych kopii zapasowych. Użyj flagi `–progress` w poleceniu rsync, aby zobaczyć szybkość transferu, pozostały czas i 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 transferze
Możesz użyć flagi `–remove-source-files`, aby usunąć pliki źródłowe po zakończeniu transferu. Przydaje się to zwłaszcza w sytuacjach, gdy chcesz zabezpieczyć pliki i uniknąć pozostawiania śladów, lub po prostu zwolnić miejsce:
rsync -av --remove-source-files 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
Próbny przebieg rsync
Rsync umożliwia wykonanie testu przed faktycznym uruchomieniem synchronizacji, aby sprawdzić, czy wszystko jest poprawnie skonfigurowane. Jest to szczególnie ważne, aby uniknąć przypadkowego nadpisania lub usunięcia plików.
Użyj opcji `–dry-run`, aby przeprowadzić próbny przebieg. Dodaj ją do polecenia, a następnie podaj źródło i cel:
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
Wynik jest podobny do normalnego uruchomienia, ale na końcu pojawi się informacja `(DRY RUN)`.
Ustawienie minimalnego i maksymalnego rozmiaru pliku
Rsync pozwala określić minimalny i maksymalny rozmiar plików do transferu.
Jeśli chcesz przesłać pliki o minimalnym rozmiarze 15 KB, użyj `–min-size=15k`:
rsync -av --min-size=15k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
Polecenie skopiuje tylko pliki o minimalnym rozmiarze 15 KB. Pliki mniejsze zostaną pominięte.
Podobnie, użyj flagi `–max-size`, aby ustawić maksymalny rozmiar pliku:
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 większe niż 450 KB.
Ograniczenie przepustowości transferu
Jeśli wykonujesz inne zadania wymagające dużej przepustowości, możesz ograniczyć przepustowość dla transferu rsync za pomocą opcji `–bwlimit=KB/s`:
rsync -av --bwlimit=100 --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory
W tym przypadku przepustowość jest ograniczona do 100 KB/s.
Podsumowanie
To już koniec naszego przewodnika po poleceniach rsync. Nauczyliśmy się, jak korzystać z rsync i omówiliśmy wiele praktycznych przykładów.
Rsync oferuje znacznie więcej możliwości niż te, które omówiliśmy. Zachęcamy do przejrzenia manuala rsync, gdzie znajdziesz dokładne omówienie każdego aspektu działania tego narzędzia.
Sprawdź również nasze ściągawki z poleceniami dla systemów Windows, Linux i macOS.
newsblog.pl