Poradnik rysunkowy i 11 przykładów efektywnego wykorzystania

Photo of author

By maciekx

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