Użycie polecenia rsync do synchronizacji plików i katalogów [11 Examples]

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