Dla zorientowania uwagi, przyjmijmy że korzystam właśnie z laptopa i
chcę zsynchronizować treść katalogu ~/Notatki z jego treścią na
zdalnej maszynie (tu - desktopie), którą w lokalnej sieci widać
pod nazwą platon.
Rsync
Odruchowe skojarzenie ze słowem synchronizacja:
$ sudo apt-get install rsync
a potem
$ rsync -avz platon:Notatki ~
albo
$ rsync -avz platon:Notatki/ ~/Notatki
i wszystkie pliki z katalogu Notatki na platonie zostaną ściągnięte
(wewnętrznie będzie wykorzystane ssh).
Oba powyższe polecenia robią dokładnie to samo,
a bardzo ważna jest obecność (lub nie) slasha
na końcu nazwy katalogu źródłowego. Bez slasha
ostatni element nazwy źródła (tu - Notatki) zostanie
doklejony do celu, ze slashem - nie. Slash oznacza:
synchronizuj wszystkie pliki i katalogi z mojego wnętrza, nie mnie.
Użyteczna mnemotechnika: widząc slash wyobrażam sobie,
że jest po nim
gwiazdka, tj. że źródłem nie jest platon:Notatki/ tylko (w rzeczywistości
niedopuszczalne) platon:Notatki/*)
Później - z powrotem (dla urozmaicenia użyję pełnych ścieżek, zapis
bez wiodącego slasha odnosi się do katalogu domowego):
$ rsync -avz /home/marcin/Notatki platon:/home/marcin
albo:
$ rsync -avz /home/marcin/Notatki/ platon:/home/marcin/Notatki
Bardzo przydatny program, z ślicznym, wydajnym algorytmem:
nie transmituje całych plików, a jedynie różnice,
potrafi
wydajnie porównywać nawet duże pliki binarne (efektywność
rsynca bardzo ładnie widać np. przy synchronizowaniu katalogu
plików mp3 po poprawianiu znaczników). Ale....
... ale to tak naprawdę nie jest synchronizacja.
To ja muszę podać, w którą stronę ma nastąpić kopiowanie. Jeśli
podedytuję lokalnie plik Notatki/zadania.txt, a potem zrobię
$ rsync -avz platon:Notatki ~
moja wersja zostanie niemiłosiernie nadmazana ściągniętą
starszą wersją. Oczywiście tym bardziej nie ma mowy o obsłudze
sytuacji, gdy część plików była edytowana tu, a część tam.
Dlatego rsync nadaje się głównie do dystrybucji zmian: obsługi
sytuacji, w której pliki są dodawane i edytowane zawsze w tym samym
głównym miejscu, a potem są propagowane dalej (np. przy rozrzucaniu
po kilku maszynach nowej wersji programu czy nowego zbioru stron
HTML). A nawet w tym scenariuszu pozostaje jeden problem - nie jest
propagowany fakt usunięcia pliku.
rsync jest też bardzo użytecznym programem do kopiowania
czy przenoszenia danych między systemami plików, migrowania
ich na nowy dysk itp (w tej roli wspominałem
go niegdyś w artykule o konfigurowaniu prostego RAID).
Unison
Prawdziwą synchronizację obsługuje Unison. Bardzo pomysłowy
program, który zawsze (dla każdego pliku z osobna) wie, na której z
maszyn nastąpiła edycja, wie czy plik obecny tylko z jednej strony
został nowo dodany, czy może usunięty, wreszcie - zauważa konflikty
(tj. sytuacje, gdy ten sam plik był niezależnie edytowany na obu
maszynach).
Instalacja (do przeprowadzenia na obu maszynach)
$ sudo apt-get install unison-gtk
albo (wersja command-line):
$ sudo apt-get install unison
Uruchamianie:
$ unison-gtk /Notatki ssh://platon/Notatki
albo (przykład dla pełnej ścieżki):
$ unison-gtk /Notatki ssh://platon//home/marcin/Notatki
W przeciwieństwie do rsynca, nie ma znaczenia z której maszyny
uruchamiam synchronizację i w jakiej kolejności podaję katalogi
Przy pierwszym uruchomieniu (dla danej pary katalogów) pojawia
się odpowiednie ostrzeżenie, trzeba je po prostu zatwierdzić.
Program działa dwufazowo. Najpierw pojawia się
okienko z listą wszystkich rozbieżności
między synchronizowanymi katalogami i sugerowanymi
akcjami:
Zielone strzałki oznaczają, że dany plik lub katalog zostanie skopiowany
w podanym kierunku. Znak zapytania - że był modyfikowany z obu stron
(mamy konflikt) i Unison nie wie, jak postąpić.
Przeglądam tą listę i w razie potrzeby koryguję akcje.
Najważniejszy
skrót klawiszowy to / (zignoruj tym razem ten plik),
dany plik zostanie oznaczony znakiem zapytania i będzie w trakciej
tej sesji pominięty.
Klawisze < i > nakazują odpowiednio kopiowanie w lewo i w prawo.
Jest też parę innych opcji, np. zapamiętanie, że dany plik ma być
ignorowany na stałe. Wszystko to oczywiście można też wybierać z menu.
Gdy całość wygląda poprawnie, klikam przycisk Go i zaczyna się
druga faza - właściwe kopiowanie.
Kopiowanie używa algorytmu rsync-a, jest równie wydajne.
Program oznacza ptaszkami, które pliki zostały już obsłużone,
na koniec w pasku statusu pojawia się tekst Synchronization Complete.
Uruchamianie terminalowe wygląda podobnie, tyle że program po prostu
pyta o każdą rozbieżność po kolei.
Obowiązują te same skróty klawiszowe, co w wersji graficznej, pełna
lista jest wyświetlana po wciśnięciu znaku zapytania.
Skąd Unison wie, jak traktować zmiany?
Przy pierwszym uruchomieniu - nie wie, po prostu chce kopiować pliki
istniejące tylko na jednej z maszyn, ignoruje pliki identyczne z obu
stron, a każdą sytuację gdy plik o tej samej nazwie istnieje na obu
maszynach ale ma różną zawartość raportuje jako konflikt.
Później - dysponuje wiedzą zapisywaną w katalogu
~/.unison, gdzie
notowane są informacje historyczne (nazwy plików i sumy kontrolne
ich treści). Dzięki temu program po prostu może porównać bieżący stan
katalogu z tym, co było w nim poprzednio, zatem wie, czy jakiś plik
został dodany, usunięty lub zmodyfikowany
Conduit
Conduit jest interesującym
programem rozwijanym w celu synchronizacji różnorodnych danych
(nie tylko plików). Rozumie niektóre aplikacje (np. umie synchronizować
notatki tomboya czy książki adresowe), współdziała z serwisami sieciowymi
(np. może wgrywać zdjęcia na Flickra czy Picasę albo je
stamtąd pobierać). Przykryte
jest to wszystko dość ciekawym (wizualizacja reguł kopiowania
w formie diagramów), choć nieco konfudującym GUI.
W tej chwili Conduita nie używam, więc z dłuższą
recenzją się wstrzymam, planuję kiedyś przyjrzeć mu się dokładniej.
System zarządzania wersjami
Dla kodu źródłowego, pisanych dokumentów czy notatek idealnym
rozwiązaniem jest użycie systemu zarządzania wersjami.
Najwygodniejsze są narzędzia DVCS, nie wymagające wydzielania i
konfigurowania dedykowanego serwera. Preferuję
Mercuriala,
ale GIT czy Bazaar nie powinny być gorsze.
Przy tej technice, po początkowym sklonowaniu, cała
synchronizacja ogranicza się do hg pull i ewentualnie hg merge.
Szerzej nie będę tego tu opisywał, bo rzecz niczym się
nie różni od używania Mercuriala w małym zespole.
Jedyny problem: DVCS-y kiepsko się nadają do obsługi dużych
plików (np. Mercurial zaleca ograniczenie rozmiaru do 10MB)
i bardzo dużych drzew. Chodzi głównie o algorytmy wyliczania zmian,
alokujące w RAM 4-5 razy rozmiar commitowanego pliku.
Dochodzi też dyskowy koszt drugiej kopii przechowywanej w podkatalogu
.hg. Dlatego drzewo zdjęć, plików MP3 czy filmików lepiej zsynchronizuje
Unison.
Ale do wszelkiej maści pisanego tekstu - idealne rozwiązanie.
Zewnętrzne serwisy (dyski sieciowe)
Rozwiązanie dla leniwych: wirtualne dyski automatycznie synchronizujące się
przy pomocy specjalizowanej sieciowej usługi.
Moja ulubiona to Dropbox.
Zachwalałem już go kiedyś pod koniec artykułu o Mnemosyne,
dlatego tutaj przypomnę tylko, że unikalną wartością Dropboxa jest
zachowywanie historii edycji pliku, a co za tym idzie, możliwość
cofnięcia się do poprzedniej (czy jeszcze starszej) wersji.
Do 2GB danych usługa jest bezpłatna.
Używałem też JungleDisk, którego miłą
cechą jest możliwość zapisu na moim storage Amazon S3, możliwość
działania bez GUI (montowałem JungleDiskowy dysk z VPS), a także
opcja szyfrowania zapisywanych danych (które pozostają dzięki temu
ukryte przed dostawcą).
Niestety, chyba wycofali się z
możliwości zakupu programu bez comiesięcznej opłaty abonamentowej
(w zeszłym roku można było zakupić program i - o ile nie używało się
przyspieszającej działanie usługi Plus - dalsze wydatki ograniczały
się do płacenia Amazonowi za transfer i dysk).
JungleDisk to nie do końca synchronizacja, z założenia na lokalnej
maszynie nie muszą być dostępne wszystkie pliki (w szczególności
wirtualny dysk rozmiaru setek megabajtów może być dostępny mimo
lokalnego ograniczenia miejsca do np. 10MB).
Poza synchronizacją
Synchronizacja nie wyczerpuje możliwości
dzielenia plików i danych.
Opcją nowomodną jest cloud, czyli przechowywanie danych
na serwerach sieciowych i używanie ich przez przeglądarkę.
Przykładem mogą być zakładki, listy rzeczy do zrobienia, poczta, notatki, proste dokumenty.
Nie można też zapominać o tradycyjnej metodzie, czyli
zwykłym montowaniu zdalnego katalogu przy pomocy
Samby lub NFS. Oczywiście tak można postępować
tylko w sieci lokalnej i tylko pod warunkiem stałego
działania komputera funkcjonującego jako serwer.
Przy okazji systemów zarządzania wersjami, polecam kilka artykułów na Eric.Weblog(). Zaczynając od lutego 2009. O tyle warto poczytać, że sam autor jest współtwórcą jednego CVSa.
właśnie rozpoczynam testy unison. Dzięki mam nadzieję, że to to czego szukam:)