18 kwi

Jak przeprowadzić synchronizację plików w Ubuntu 16.04 za pomocą rsync?

Kilka słów o nowym Ubuntu…

Zgodnie z zapowiedziami – 21.04 wychodzi Ubuntu 16.04 LTS Xenial Xerus – długo wyczekiwana, stabilna aktualizacja systemu, która wprowadzić ma sporo nowych funkcjonalności. A lista zmian prezentuje się wyjątkowo imponująco. Z najciekawszych informacji wymienić można:

  • możliwość przeniesienia Unity launchera z lewej do dolnej krawędzi ekranu – to zmiana, o którą użytkownicy prosili od ładnych kilku lat;
  • zastąpienie Ubuntu Software Center zupełnie nowym narzędziem GNOME Software;
  • aktualizacja firmware z poziomu GNOME Software;
  • usunięcie tzw. „spyware” (czyli z wyników wyszukiwania w końcu znikną produkty z Amazon.com – choć w ustawieniach nadal będzie można wrócić do tego rozwiązania);
  • aktualizacje kluczowych aplikacji, m.in.: Firefox 45.0.1, Libre Office 5.1, Chromium 49, Thunderbird 38.6, Nautilus 3.14, Shotwell 0.22, Totem 3.18, itd.;
  • pojawienie się nowych aplikacji, m.in.: GNOME Calendar i Cheese;
  • domyślnie zainstalowana wersja PHP 7.0 (co z pewnością ucieszy programistów PHP);
  • zniknięcie Brasero i Empathy;
  • nowa domyślna tapeta;
  • wiele poprawek i drobnych zmian.

Korzystając więc z okazji, jaką niewątpliwie jest pojawienie się na horyzoncie Ubuntu 16.04 – postanowiliśmy opisać pokrótce, jak prawidłowo dokonać synchronizacji plików w nowym Linuxie przy pomocy programu rsync, który domyślnie jest w nim zawarty. Oczywiście możesz zamówić serwer VPS z tym systemem na stronie https://hostovita.pl/vps/, w ten sposób zyskując najszybszy hosting.

Zatem do dzieła.

Czym jest rsync?

Rsync (czyli remote sync) pozwala na zdalną synchronizację danych w systemach Linux/Unix. Jest wykorzystywany przede wszystkim do tworzenia kopii zapasowej plików. Rsync wykorzystuje algorytm, który minimalizuje kopiowaną ilośd danych, przenosząc/aktualizując tylko te części plików, które zostały zmienione. Prędkość transferu jest relatywnie szybka, a wykorzystanie łącza – niskie.

Podstawowa składnia

Nieskomplikowana składnia rsync funkcjonuje w podobny sposób, jak ma to miejsce w przypadku ssh, cp czy scp.
Zacznijmy zatem od stworzenia testowo dwóch folderów oraz stu plików, stosując poniższe polecenia:

cd ~
mkdir folder1
mkdir folder2
touch folder1/plik{1..100}

Wynik 1

Otrzymujemy folder1 obejmujący 100 pustych plików:

ls folder1

plik1 plik18 plik27 plik36 plik45 plik54 plik63 plik72 plik81 plik90 
plik10 plik19 plik28 plik37 plik46 plik55 plik64 plik73 plik82 plik91 
plik100 plik2 plik29 plik38 plik47 plik56 plik65 plik74 plik83 plik92 
plik11 plik20 plik3 plik39 plik48 plik57 plik66 plik75 plik84 plik93 
plik12 plik21 plik30 plik4 plik49 plik58 plik67 plik76 plik85 plik94 
plik13 plik22 plik31 plik40 plik5 plik59 plik68 plik77 plik86 plik95 
plik14 plik23 plik32 plik41 plik50 plik6 plik69 plik78 plik87 plik96 
plik15 plik24 plik33 plik42 plik51 plik60 plik7 plik79 plik88 plik97 
plik16 plik25 plik34 plik43 plik52 plik61 plik70 plik8 plik89 plik98 
plik17 plik26 plik35 plik44 plik53 plik62 plik71 plik80 plik9 plik99

Wynik 2

Mamy też do dyspozycji pusty folder folder2. Aby zsynchronizować zawartość obu folderów na tym samym systemie, wpisujemy:

rsync -r folder1/ folder2

Przy czym -r to tryb rekurencyjny, który umożliwia kopiowanie wszystkich katalogów i podkatalogów wraz z ich zawartością.
Można też użyć przełącznika -a (archive), który synchronizuje rekurencyjnie, zachowując linki symboliczne, uprawnienia dla plików i katalogów, znaczniki czasu oraz informacje o właścicielach i grupach:

rsync -a folder1/ folder2

Zwykle wykorzystywana jest właśnie ta opcja.

Trzeba pamiętać, że konieczne jest użycia slasha:

rsync -a folder1/ folder2

Taki zapis wskazuje na „zawartość folderu folder1”. Alternatywnie możemy wykorzystać inne polecenie, które umieści folder1 w folder2:

~/folder2/folder1/[files]

Stosując opcję -n lub –dry-run, możemy sprawdzić, które pliki zostaną zsynchronizowane (bez wykonywania właściwej synchronizacji). Argument -v (verbose) również jest pomocny, gdyż pokazuje w oknie terminala więcej szczegółów na temat transferu.

rsync -anv folder1/ folder2

sending incremental file list 
./ 
plik1 
plik10 
plik100 
plik11 
plik12 
plik13 
. . .

Jeżeli usuniemy slash, rezultat jest inny:

rsync -anv folder1 folder2

sending incremental file list 
folder1/ 
folder1/plik1 
folder1/plik10 
folder1/plik100 
folder1/plik11 
. . .

Widzimy tutaj, że w tym wypadku sam folder miałby zostać przeniesiony.

Jak wykorzystać rsync do synchronizacji ze zdalnym systemem?

Proces jest prosty, jeżeli mamy dostęp SSH do zdalnej maszyny, na której również jest zainstalowany rsync. Jeśli dostęp SSH jest zweryfikowany na obu maszynach – możemy dokonać synchronizacji folderu folder1, używając poniższej składni:

rsync -a ~/folder1 login@zdalny_host:docelowy_folder

W tym wypadku chcemy przenieść także sam folder, więc nie wstawiamy slasha.
Jest to operacja „push”, czyli przesyłanie folderu z lokalnego systemu do systemu zdalnego. Odwrotna sytuacja nazywana jest „pull”, a składnia wygląda tak:

rsync -a login@zdalny_host:/home/login/folder1 miejsce_do_synchronizacji_na_maszynie_lokalnej

Źródło zawsze jest pierwszym argumentem, a miejsce docelowe – drugim.

BONUS! Pozostałe wybrane opcje:

1. Opcja -z – uruchamia kompresję plików:
rsync -az zrodlo miejsce_docelowe

2. Argument -P – łączy argumenty –progress (pokazuje pasek postępu) i –partial (pozwala na wznowienie przerwanego transferu):
rsync -azP zrodlo miejsce_docelowe

sending incremental file list 
./ 
plik1 0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=99/101) 
plik10 0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=98/101) 
plik100 0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=97/101) 
plik11 0 100% 0.00kB/s 0:00:00 (xfer#4, to-check=96/101) 
. . .

Jeżeli jeszcze raz podamy tę komendę, wynik będzie krótszy, ponieważ żadne zmiany nie były w międzyczasie wprowadzane. A jeśli zaktualizujemy czasy modyfikacji plików – wtedy rsync powtórnie skopiuje tylko te pliki, które zostały zmienione.

3. Opcja –delete –usuwa pliki z lokalizacji docelowej, jeżeli zostały one usunięte z lokalizacji źródłowej (rsync nie robi tego domyślnie):
rsync -a --delete zrodlo miejsce_docelowe
Przed zastosowaniem tej komendy, warto uchronić się przed utratą danych, przeprowadzając testy za pomocą opcji –dry-run.

4. Opcja –exclude – wyklucza z synchronizacji określone pliki lub foldery:
rsync -a --exclude=wykluczona_lokalizacji zrodlo miejsce_docelowe

Poszczególne pozycje z listy powinny byd oddzielone od siebie przecinkiem.

5. Opcja –include – włącza do synchronizacji określone przez nas pliki z listy plików pomijanych (patrz: punkt 4):
rsync -a --exclude=wykluczona_lokalizacja --include=wlaczona_lokalizacja zrodlo miejsce_docelowe

 

W razie jakichkolwiek pytań bądź problemów z synchronizacją plików – prosimy o kontakt z działem technicznym: support@hostovita.pl.