PRZYGOTOWANIE
Czego potrzebujesz
- Zainstalowane rsync, mktemp, mkdir, printf i cmp
- Powłoka Bash z obsługą podstawiania wyników poleceń ($())
- Uprawnienia do tworzenia i usuwania plików we własnym katalogu domowym
KROK 01
Przygotuj odizolowane dane
Aby bezpiecznie przećwiczyć działanie rsync, utwórz odizolowane środowisko poza katalogiem domowym i innymi ważnymi danymi. Polecenie mktemp -d tworzy unikalny katalog tymczasowy, który po zakończeniu ćwiczenia możesz usunąć. Zmienna PRACOWNIA przechowuje ścieżkę do tego katalogu i musi pozostać zdefiniowana w tej samej sesji terminala – jeśli zamkniesz okno, zmienna przepadnie.
W nowym katalogu tworzymy dwa podkatalogi: zrodlo z plikami wejściowymi oraz kopia jako miejsce docelowe. Umieszczamy w źródle jeden plik tekstowy, aby łatwo porównać wynik. Wykonuj polecenia w tej samej sesji i sprawdzaj ścieżki przed użyciem. Podane operacje dotyczą danych ćwiczebnych w PRACOWNIA, a nie plików działającej aplikacji.
PRACOWNIA=$(mktemp -d)
mkdir -p "$PRACOWNIA/zrodlo" "$PRACOWNIA/kopia"
printf "Pierwsza wersja\n" > "$PRACOWNIA/zrodlo/notatka.txt"Polecenia tworzą katalog tymczasowy o unikalnej nazwie, dwa podkatalogi oraz plik notatka.txt z treścią Pierwsza wersja. Zmienna PRACOWNIA przechowuje ścieżkę do katalogu tymczasowego.
KROK 02
Obejrzyj plan kopiowania
Próba na sucho pokazuje, co rsync zamierza skopiować, bez zapisywania tych zmian w katalogu docelowym. Opcja -n włącza tę próbę, a -i wypisuje rodzaj planowanych zmian. Tryb -a zachowuje między innymi czasy, uprawnienia i dowiązania symboliczne. Nie obejmuje automatycznie ACL, rozszerzonych atrybutów ani zachowania układu dowiązań twardych. Zapis właściciela zależy też od uprawnień użytkownika uruchamiającego transfer.
Zwróć szczególną uwagę na ukośnik na końcu ścieżki źródłowej. Zapis $PRACOWNIA/zrodlo/ (z ukośnikiem) oznacza zawartość katalogu, a nie sam katalog. Gdyby zabrakło ukośnika, rsync utworzyłby wewnątrz kopia podkatalog zrodlo. To częste źródło pomyłek.
rsync -ani "$PRACOWNIA/zrodlo/" "$PRACOWNIA/kopia/"W pierwszej kolumnie rsync pokazuje rodzaj planowanej operacji. Nowy plik ma zwykle oznaczenie z wieloma znakami plus. Dla lokalnej kopii kierunek może być pokazany jako >f; inne tryby transferu używają również <f. Najważniejsza jest obecność oczekiwanego pliku i prawidłowe miejsce docelowe, a nie dopasowanie jednego przykładowego ciągu znaków.
KROK 03
Skopiuj i porównaj wynik
Po sprawdzeniu planu usuń opcję -n, aby wykonać rzeczywistą synchronizację. Opcja -a zachowuje atrybuty plików, a -i nadal wyświetla szczegółowe informacje o transferze. Po zakończeniu możesz porównać pliki źródłowy i docelowy za pomocą polecenia cmp, które zwraca kod wyjścia 0, gdy pliki są identyczne, lub sygnalizuje różnicę kodem niezerowym.
Polecenie cmp jest bardziej wiarygodne niż wizualne porównanie, ponieważ sprawdza bajt po bajcie. Jeśli chcesz tylko potwierdzić, że plik istnieje i ma taki sam rozmiar, możesz użyć ls -l. Jednak do pełnej weryfikacji kopii lepiej sprawdzić cmp.
rsync -ai "$PRACOWNIA/zrodlo/" "$PRACOWNIA/kopia/"
cmp "$PRACOWNIA/zrodlo/notatka.txt" "$PRACOWNIA/kopia/notatka.txt"Rsync wyświetli linię informującą o skopiowaniu pliku. Polecenie cmp nie wyświetli żadnego komunikatu, jeśli pliki są identyczne – jedynym sygnałem poprawności jest kod wyjścia 0, który możesz sprawdzić poleceniem echo $?.
KROK 04
Zaktualizuj jeden plik
Zmień treść notatki, a następnie ponownie obejrzyj plan. W tym przykładzie druga wersja jest dłuższa, więc różnica rozmiaru pozwala wykryć zmianę również przy bardzo szybkim wykonaniu kolejnych poleceń. Standardowe porównanie rsync wykorzystuje rozmiar i czas modyfikacji. Gdy treść zmieni się przy zachowaniu obu tych wartości, zwykły przebieg może uznać plik za niezmieniony.
Najpierw wykonaj próbę na sucho, a potem właściwe kopiowanie. W poleceniu nie używamy --delete, dlatego dodatkowe pliki obecne tylko w kopia pozostają na miejscu. To nie oznacza jednak przechowywania historii: zmieniony plik o tej samej nazwie zostaje nadpisany, a poprzednia zawartość nie jest zachowywana jako osobna wersja.
printf "Druga wersja, po zmianie\n" > "$PRACOWNIA/zrodlo/notatka.txt"
rsync -ani "$PRACOWNIA/zrodlo/" "$PRACOWNIA/kopia/"
rsync -ai "$PRACOWNIA/zrodlo/" "$PRACOWNIA/kopia/"Plan powinien wskazać zmianę notatka.txt. Oznaczenie może zawierać s dla rozmiaru i t dla czasu modyfikacji; dokładny ciąg zależy od wykrytych różnic. Po drugim poleceniu zawartość pliku docelowego odpowiada nowej wersji źródła. Jeśli rsync zwróci błąd, nie uznawaj operacji za zakończoną tylko dlatego, że wyświetlił nazwę pliku.
KROK 05
Jak stosować przykład do prawdziwych danych
Ten sam schemat możesz zastosować do kopiowania danych między katalogami na dysku lokalnym, na przykład do tworzenia kopii zapasowej projektu przed większą aktualizacją. Pamiętaj jednak, że kopia lokalna na tym samym dysku nie chroni przed awarią całego nośnika – do prawdziwych kopii zapasowych potrzebujesz osobnego dysku lub zdalnego serwera.
Przy zdalnym transferze przez SSH rsync musi być dostępny po obu stronach. Konto zdalne potrzebuje dostępu do odpowiednich katalogów, a zasady SSH nadal obowiązują. Przed użyciem na prawdziwych danych ustal wymagane atrybuty i sposób odzyskiwania starszych wersji. Nie traktuj zwykłej kopii plików działającej bazy jako spójnej kopii transakcyjnej: baza wymaga własnej procedury eksportu lub kopii.
KROK 06
Próba odtworzenia
Aby sprawdzić, czy kopia nadaje się do odtworzenia, utwórz trzeci katalog o nazwie odtworzone i skopiuj do niego pliki z kopia. Następnie porównaj plik z oryginałem. To symuluje scenariusz przywracania danych z kopii zapasowej – jeśli różnice są zerowe, proces działa poprawnie.
Po ćwiczeniu zanotuj ścieżkę utworzonego katalogu i zdecyduj, czy zachować go do dalszych prób. Nie potrzebujesz polecenia kasującego, aby potwierdzić poprawność transferu. W prawdziwej procedurze odtwarzania użyj osobnego miejsca docelowego i porównaj potrzebne pliki, zanim zastąpisz nimi działające dane. Jedna poprawnie odtworzona notatka potwierdza ten przykład, nie kompletność całej kopii produkcyjnej.
mkdir "$PRACOWNIA/odtworzone"
rsync -ai "$PRACOWNIA/kopia/" "$PRACOWNIA/odtworzone/"
cmp "$PRACOWNIA/zrodlo/notatka.txt" "$PRACOWNIA/odtworzone/notatka.txt"Po synchronizacji plik w odtworzone powinien być identyczny z oryginałem. Polecenie cmp zakończy się kodem 0 bez wyświetlania komunikatu, co potwierdza poprawność kopii.
Pytania i odpowiedzi
Dlaczego ukośnik na końcu ścieżki źródłowej jest tak ważny?
Ukośnik informuje rsync, że ma kopiować zawartość katalogu, a nie sam katalog. Bez ukośnika rsync utworzy podkatalog o nazwie zrodlo wewnątrz kopia. Z ukośnikiem pliki trafią bezpośrednio do kopia. To samo dotyczy ścieżki docelowej – ukośnik nie zmienia zachowania, ale dla spójności warto go stosować.
Czy taka synchronizacja zachowuje poprzednie wersje plików?
Nie. Podany zestaw aktualizuje pliki docelowe do bieżącej wersji źródła, więc nadpisana zawartość nie tworzy osobnego punktu przywracania. Regularne kopie potrzebują dodatkowo historii wersji i zasad przechowywania. Rsync pomija pliki uznane za niezmienione; lokalny transfer domyślnie kopiuje zmieniony plik w całości. Mechanizm przesyłania różnic przy zdalnej synchronizacji nie jest tym samym co archiwum wersji.
Co oznacza brak komunikatu z cmp?
Dla dwóch istniejących, dostępnych plików brak komunikatu i kod zakończenia 0 oznaczają identyczną zawartość. Kod niezerowy może oznaczać różnicę albo problem z odczytem; sprawdź również treść błędu. Weryfikuj wynik cmp bezpośrednio po jego wykonaniu, bo następne polecenie zmieni zapisany przez powłokę kod zakończenia.