Synchronizacja plików z Rsync

LINUX
Priorytet: Normalny Szkic

Zadanie 120: Synchronizacja i Kopia Zapasowa (rsync)

Wstęp

rsync (remote sync) to potężne narzędzie w systemach Linux służące do kopiowania i synchronizacji plików oraz katalogów. Może działać zarówno lokalnie, jak i zdalnie (np. za pośrednictwem SSH). Jego główną zaletą jest to, że przesyła tylko różnice (zmiany) między plikami źródłowymi a docelowymi, co znacznie oszczędza czas oraz transfer sieciowy.

Najważniejsze parametry rsync:

  • -v (--verbose): tryb gadatliwy, wyświetla szczegółowe informacje o kopiowanych plikach i zachodzącym procesie.
  • -a (--archive): tryb archiwalny. Działa jak flaga -r (rekursywnie), ale dodatkowo zachowuje dowiązania symboliczne, uprawnienia, czas modyfikacji, właściciela oraz grupę. To najczęściej używana flaga przy tworzeniu bezpiecznych i wiernych kopii zapasowych.
  • -r (--recursive): kopiowanie rekursywne (wraz z podkatalogami).
  • -z (--compress): kompresuje dane w locie podczas przesyłania (przydatne przy wolniejszym połączeniu sieciowym i mniejszych plikach tekstowych).
  • -u (--update): pomija pliki w miejscu docelowym, które są nowsze niż w źródle (aktualizacja).
  • --delete: usuwa na miejscu docelowym pliki, których nie ma już w źródle. Używane, aby utrzymać dokładne lustrzane odbicie katalogu źródłowego.
  • -n (--dry-run): wykonuje testową symulację. Pokazuje, co zostałoby zrobione, ale nie wykonuje faktycznych modyfikacji. Zawsze zalecane w połączeniu z --delete!
  • --exclude: pozwala ignorować konkretne pliki lub katalogi wg podanego wzorca podczas synchronizacji.
  • -P (odpowiednik --progress i --partial): wyświetla pasek postępu oraz zachowuje częściowo przesłane pliki w przypadku np. nagłego przerwania połączenia.
  • -e: określa program powłoki zdalnej, z którego ma skorzystać rsync (np. ssh).
  • --bwlimit: określa maksymalny limit transferu podczas kopiowania.

Wymagania

Potrzebujesz środowiska z systemem Linux. Do ostatnich zadań (Część 4) użyteczne będą dwie maszyny (lub maszyna i zdalny serwer z dostępem SSH).


Część 1: Instalacja i Przygotowanie

Zadanie 1: Instalacja narzędzia

Upewnij się, że rsync jest zainstalowane w Twoim systemie. W systemach opartych o środowisko Debian/Ubuntu zainstalujesz je za pomocą menedżera pakietów apt.

sudo apt update
sudo apt install rsync

Zadanie 2: Przygotowanie środowiska testowego

Zanim zaczniemy synchronizację, utwórz w swoim systemie katalog źródłowy, katalog docelowy oraz kilka plików testowych, które posłużą nam w tym laboratorium.

mkdir ~/rsync_source
mkdir ~/rsync_dest
touch ~/rsync_source/plik1.txt ~/rsync_source/plik2.txt
echo "Ważne dane" > ~/rsync_source/dane.log

Część 2: Synchronizacja lokalna i podstawowe atrybuty

Zadanie 3: Prosta synchronizacja lokalna (-v, -r)

Zsynchronizuj zawartość katalogu źródłowego do docelowego w trybie "gadatliwym" (-v) oraz rekursywnym (-r), aby skopiowały się również wszystkie pliki zawarte wewnątrz katalogu.

rsync -vr ~/rsync_source/ ~/rsync_dest/

Uwaga: Zwróć uwagę na ukośnik (/) na końcu nazwy katalogu źródłowego. Oznacza on "kopiuj zawartość tego katalogu", a nie sam katalog jako umiejscowiony folder! Gdybyśmy opuścili ukośnik, powstałaby ścieżka postaci ~/rsync_dest/rsync_source/.

Zadanie 4: Tryb archiwalny i kompresja (-a, -z)

Wyczyść wstępnie zapoznany katalog docelowy i zrób kopię do niego przy użyciu trybu archiwalnego (-a), który z definicji zachowuje wszystkie atrybuty plików. Użyjmy dodatkowo kompresji w locie (-z), chociaż docenimy to w przyszłości przy wysyłaniu pakietów przez sieć.

rm -rf ~/rsync_dest/*
rsync -avz ~/rsync_source/ ~/rsync_dest/

Zadanie 5: Symulacja i usuwanie plików (-n, --delete)

Usuń jeden z plików w zbudowanym oryginalnie katalogu źródłowym, a następnie użyj flagi --delete, aby wykasować ten plik również w kopii zapasowej. Na początek użyj w parze symulacji (-n lub --dry-run), aby podejrzeć co zostanie zmienione przed faktyczną akcją pozbywania sie zasobów.

rm ~/rsync_source/plik1.txt
rsync -avz -n --delete ~/rsync_source/ ~/rsync_dest/

Gdy zweryfikujesz bezpieczną poprawność operacji i zobaczysz, że plik ma zostać usunięty, uruchom ją jeszcze raz porzucając atrybut testowy -n.

rsync -avz --delete ~/rsync_source/ ~/rsync_dest/

Zadanie 6: Wykluczanie elementów (--exclude)

Zostaw katalog docelowy w spokoju, na chwilę utwórz w środowisku źródła plik zabezpieczony, np. tajne.txt. Upewnij się, że w wyniku synchronizacji plik nie zostanie powielony i pozostanie tylko na źródle. Wykorzystaj właściwie nazwaną flagę --exclude.

touch ~/rsync_source/tajne.txt
rsync -avz --exclude 'tajne.txt' ~/rsync_source/ ~/rsync_dest/

Część 3: Atrybuty zaawansowane

Zadanie 7: Aktualizacja nowszych plików (-u)

Flaga -u (--update) pozwala pomijać pliki na wskazanej maszynie docelowej, dopóki są one fizycznie nowsze w perspektywie stempla czasu niż ich odpowiedniki w źródle. Pozwala nam to omyłkowo nie nadpisać czyjejś późniejszej pracy starym plikiem ze źródła kopii. Zmodyfikuj na moment wybrany plik na miejscu docelowym, tak aby wylegitymować go jako nowszy w systemie, a potem spróbuj przenieść synchronizację.

echo "Zmiana docelowa testująca" >> ~/rsync_dest/plik2.txt
rsync -avzu ~/rsync_source/ ~/rsync_dest/

Zadanie 8: Wyświetlanie paska postępu (-P)

Dodaj jakiś wygenerowany duży plik do katalogu źródłowego (możemy użyć znanego nam dd by go spreparować z /dev/urandom) i następnie zsynchronizuj go wraz z nową flagą -P, dostarczającą czytelny podgląd, by móc obiektywnie śledzić pasek postępu kopiowania na żywo w czasie.

dd if=/dev/urandom of=~/rsync_source/duzy_plik.bin bs=1M count=50
rsync -avzP ~/rsync_source/ ~/rsync_dest/

Część 4: Zdalna synchronizacja między hostami (SSH)

Zadania w tej części spójnie zakładają, że posiadasz dostęp do drugiej stacji roboczej lub serwera z uruchomionym demonem SSH. Przedstawione słowo user i wstawiony testowo adres IP zawsze zmień na zgodne w swoim roboczym środowisku, np. posługując się serwerem zestawionym z poprzedniego Zadania 100.

Zadanie 9: Kopiowanie na serwer wykorzystując SSH (-e ssh)

Zsynchronizuj ujednolicony lokalny folder ze zdalnym powierzanym obszarem na serwerze. Parametr nakierowujący -e ssh może opcjonalnie precyzyjniej forsować narzędzie by skorzystało wprost z protokołu połączeń Secure Shell - choć w nowszych dystrybucjach jest to wbudowany i domyślny zachowany strumień transportowy.

rsync -avz -e ssh ~/rsync_source/ user@IP_SERWERA:~/remote_backup/

Zadanie 10: Limity narzucanej przepustowości (--bwlimit)

Jeżeli współpracujesz na skrajnie wspólnym lub dławionym łączu sieciowym ze słabym dostępem obciążeniowym, nie chcesz ryzykownie aby praca potężnego wielowątkowego rsync mogła zająć całkowicie dostępną przepustowość odłączając inny sprzęt firmowy. Skopiuj celowo duży plik duzy_plik.bin pobierając go w przeciwną stronę od wariantu z zadania 9th (z remote serwera transferując na dysk lokalny klienta) wstrzymając program i jednocześnie ograniczając prędkość zestawienia ściągana twardym cięciem np. do 1000 KiB/s posługując się limitowaną stawką we wpisie --bwlimit.

rsync -avzP --bwlimit=1000 user@IP_SERWERA:~/remote_backup/duzy_plik.bin ~/rsync_dest/

Git Help

git add .
git commit -m "Linux Zadanie 120: Rsync Backups"