Synchronizacja danych z wykorzystaniem programu Unison

Laptopy od paru lat sukcesywnie wypierają z rynku klasyczne PeCety. Ci, którym wystarcza jeden przenośny komputer do wszystkiego - do pracy i do zabawy, do biura i do domu - są szczęśliwcami. W ten prosty sposób omija ich bowiem klasyczny problem, na który cierpią wszyscy pozostali - żmudna synchronizacja danych. Pal licho, jeśli problem dotyczy czegoś ogólnie dostępnego - ściągniemy to ponownie, a w najgorszym razie zaczekamy do poniedziałku. Na drugi raz będziemy pamiętać (i tracić czas na ręczne kopiowanie). Prawdziwy problem pojawia się, gdy zapomnimy skopiować najnowszej wersji ważnego dokumentu, albo gdy ściągając ważnego e-maila skasujemy pocztę z serwera. Oczywiście to w sytuacji, gdy laptop zostaje w pracy - jeśli wraca z nami wówczas problemem jest jedynie potencjalna strata czasu poświęconego na odnalezienie, wybranie i skopiowanie odpowiednich danych.

Jeśli każdego dnia czynność ta zabiera nam średnio kilka-kilkanaście minut to unikając jej rocznie można zaoszczędzić 2-3 doby (i przeznaczyć na ciekawsze zajęcia). Oczywiście problem nie jest niczym nowym - istnieje i jest rozpoznany od bardzo dawna. W ostatnim czasie dotyczy jednak coraz większej ilości osób i prawdopodobnie nie zniknie nawet wraz z całkowitym wyparciem klasycznych desktopów przez laptopy, bo jak można się spodziewać miejsce komputera stacjonarnego zajmie wtedy po prostu drugi komputer mobilny - nowoczesny, a starszy model zostanie w pracy i zacznie być traktowany jako stacjonarny, czemu wręcz będzie sprzyjać coraz gorzej sprawująca się bateria.

W Linuksach za synchronizację danych od lat odpowiada niezwykle popularny rsync. Sprawdza się on (i jego różne wariacje) w praktycznie każdym zastosowaniu, a często jest wykorzystywany (lub jego algorytm) jako baza dla większych projektów służących przykładowo do tworzenia kopii zapasowych. Rsync nie jest niestety do końca przyjazny w obsłudze i często osiągnięcie dokładnie tego o co chodziło, może dostarczyć kilku dłuższych chwil frustracji. Na szczęście przeciętny użytkownik nie jest skazany na tę nierówną walkę - do dyspozycji ma kilka innych narzędzi. Jednym z nich jest program Unison, który służy tylko i wyłącznie do tego, co zostało opisane na początku - do łatwej, wydajnej i szybkiej synchronizacji plików i katalogów. Prosty cel, istnienie GUI, możliwość pracy w trybie wsadowym, współpraca z OS X i Windowsami, rozpoznawanie konfliktów, odporność na awarie, otwartość kodu i licencja GPL - pełnia szczęścia.

Instalacja Unisona nie wymaga praw administratora - można go zainstalować i używać bez dostępu do konta roota. Oczywiście jeśli program ma być dostępny dla wszystkich użytkowników, wówczas najlepiej instalacje przeprowadzić z konta superużytkownika. Ważną sprawą jest, aby zainstalować Unisona na wszystkich komputerach, gdzie ma być wykonywana synchronizacja, nawet jeśli odbywa się ona zawsze tylko w jedną stronę.

W repozytoriach Ubuntu czy Debiana Unison powinien być bez problemu odnaleziony. Instalacja sprowadza się wówczas do wydania polecenia (z konta roota):

apt-get install unison

Jeśli chcemy doinstalować GUI:

apt-get install unison-gtk

Jeśli pakietu w repozytoriach brak to można go pobrać ze strony programu i zainstalować (z konta roota):

dpkg -i nazwapakietu.deb

Oprócz tego można pobrać prekompilowaną dla 32/64 bitowego systemu binarkę, po ściągnięciu nadać jej prawa do wykonywania (chmod +x nazwapliku) i po prostu… używać, bez instalacji. Ta metoda ma tę zaletę, że nie trzeba posiadać dostępu do konta roota:

$ chmod +x unison-2.27.47-linux32.text
$ ./unison-2.27.47-linux32.text
Usage: unison [options]
or unison root1 root2 [options]
or unison profilename [options]

Jeśli dla danej wersji systemu nie ma przygotowanej wygodnej paczki, a binarka nie chce działać, wówczas zostaje klasyczna kompilacja ze źródeł.

GUI programu uruchamiane jest poleceniem unison-gtk. Jeśli nie podamy parametru to przy uruchamianiu programu zostaniemy poproszeni o wybranie nazwy profilu lub utworzenie nowego. Podanie parametru pozwala ominąć ten krok, ale tylko jeśli profil już istnieje. Przy tworzeniu profilu program pyta o dwa katalogi, pomiędzy którymi ma wykonywać synchronizację. Drugi z nich może być katalogiem lokalnym lub zdalnym (SSH, RSH, Socket). Następnie program wykona pierwsze porównanie zawartości katalogów, utworzy na dysku bazę z informacjami i… można działać. Opcje GUI są całkiem liczne i mimo że nie wykorzystują w pełni możliwości programu to powinny zaspokoić potrzeby przeciętnego użytkownika. Znacznie lepiej GUI wypada jednak w połączeniu z klasyczną ręczną konfiguracją, czyli edycją plików konfiguracyjnych oraz wykorzystaniem tradycyjnej linii poleceń, dlatego tym się zajmiemy.

Wywoływanie poleceń tekstowych możliwe jest na dwa sposoby:

unison polecenia

lub

unison-gtk polecenia -ui text

Podstawowymi danymi niezbędnymi Unisonowi do pracy są katalogi źródłowy i docelowy, które mają być synchronizowane. Można podać je wprost:

unison-gtk /home/user ssh://192.168.0.1//home/user -ui text

Jeśli nie chcemy synchronizować całych katalogów domowych, a tylko wybrane podkatalogi, wówczas można je podać jako parametry:

unison-gtk /home/user ssh://192.168.0.1//home/user -path katalog1 -path .katalog2 -ui text

Pozostałe katalogi w katalogu /home/user lokalnym i zdalnym zostaną w ten prosty sposób zignorowane. Co ważne - w trybie graficznym podane w ten sposób wywołanie programu również działa poprawnie.

Mniej lub bardziej przydatnych opcji Unison posiada mnóstwo - polecamy zapoznanie się w bogatą dokumentacją. Dzięki tym opcjom możliwe jest napisanie wygodnych w użyciu skryptów, które prawie bez nadzoru będą wykonywały całą czarną robotę. Przykładowy skrypt zamieszczony został na końcu artykułu.

Unison potrafi także z powodzeniem wykorzystywać pliki konfiguracyjne. Domyślnie tworzy on katalog .unison w katalogu domowym użytkownika i tam umieszcza wszystkie pliki opisujące profile, a także swoje bazy danych. Profile są zwykłymi plikami tekstowymi z rozszerzeniem .prj. Najprostszy możliwy przykład wykorzystania profili wygląda tak:

cat common.prj
root = /home/user
root = ssh://user@192.168.0.1//home/user

cat moje.prj
path = poczta
path = zdjecia
path = wazne
include common

W tym przypadku wywołanie:

unison-gtk moje

spowoduje uruchomienie programu w trybie graficznym i załadowanie profilu o nazwie “moje”, a w efekcie synchronizację katalogów /home/user/poczta, /home/user/zdjecia i /home/user/wazne, ze zdalnymi katalogami ssh://user@192.168.0.1//home/user/poczta… itd. Jak z tego wynika w prosty sposób można sobie utworzyć szereg profili na każdą okazję i w bardzo łatwy sposób ich używać.

Jak wcześniej wspomniałem połączenie możliwości oferowanych przez profile, linię poleceń oraz tryb graficzny może zaowocować powstaniem jakiegoś mniej lub bardziej użytecznego skryptu. Na własne potrzeby napisałem coś takiego, co prezentuję poniżej wraz z kilkoma słowami wyjaśnienia.

# skrypt sync.sh
# autor: Łukasz Wędrocha (http://linux.netina.com.pl)
#!/bin/bash

ROOT_LOCAL="/home/lukasz"
ROOT_REMOTE="/home/lukasz"
HOST_REMOTE="ssh://10.0.0.134"

wyswietl_blad() {
 echo
 echo "Przykladowe wywolanie: "
 echo "  $0 send|get all [but nazwa [nazwa2...]] [-text|-batch]"
 echo "  $0 send|get nazwa [nazwa2...] [-text|-batch]"
 echo "  $0 list"
 echo
 exit
}

dodaj_katalog() {
 if [ "$funkcja_lista" == "ignoruj" ]; then
  export DIRS="$DIRS -path $1"
  echo "Synchronizacja     : $ROOT1/$1 -> $ROOT2/$1"
 fi
}

usun_katalog() {
 if [ "$funkcja_lista" == "ignoruj" ]; then
  export DIRS="`echo $DIRS | sed 's/-path '$1'//' 2>/dev/null`"
  echo "Pomijanie          : $ROOT1/$1 -> $ROOT2/$1"
 fi
}

ignoruj() {
 sleep 0
}

listuj() {
 echo "$1"
}

wybierz_katalog() {
 R=0

 case "$1" in
  "but") export BUT="1"; R=1 ;;
 esac

 if [ "$BUT" == "1" ]; then
  funkcja_katalog=usun_katalog
 else
  funkcja_katalog=dodaj_katalog
 fi

 case "$1" in
  "mail"|"all") $funkcja_lista mail ; $funkcja_katalog mail ; $funkcja_katalog .claws-mail ; R=1 ;;
 esac
 case "$1" in
  "psi"|"all") $funkcja_lista psi ; $funkcja_katalog .psi ; R=1 ;;
 esac
 case "$1" in
  "firefox"|"all") $funkcja_lista firefox ; $funkcja_katalog .mozilla ; R=1 ;;
 esac
 case "$1" in
  "pan"|"all") $funkcja_lista pan ; $funkcja_katalog .pan ; $funkcja_katalog News ; R=1 ;;
 esac
 case "$1" in
  "krusader"|"all") $funkcja_lista krusader ; $funkcja_katalog .kde/share/apps/krusader ;
  $funkcja_katalog .kde/share/config/krusaderrc ; R=1 ;;
 esac

 case "$1" in
  "xchat"|"all") $funkcja_lista xchat ; $funkcja_katalog .xchat2 ; R=1 ;;
 esac

 case "$1" in
  "-text") export OPTIONS="-ui text" ; R=1 ;;
 esac
 case "$1" in
  "-batch") export OPTIONS="-ui text -batch" ; R=1 ;;
 esac
 if [ ! $R -eq 1 ]; then
  echo "Ignorowanie        : nierozpoznana nazwa $1"
 fi
}

if [ $# -lt 2 -a ! "$1" == "list" ]; then
 wyswietl_blad
fi

if [ "$1" == "send" ]; then
 ROOT1="$ROOT_LOCAL"
 ROOT2="$HOST_REMOTE/$ROOT_REMOTE"
elif [ "$1" == "get" ]; then
 ROOT2="$ROOT_LOCAL"
 ROOT1="$HOST_REMOTE/$ROOT_REMOTE"
elif [ "$1" == "list" ]; then
 export funkcja_lista=listuj
 wybierz_katalog all
 exit
else
 wyswietl_blad
fi

export funkcja_lista=ignoruj
while [ ! -z $2 ]; do
 wybierz_katalog $2
 shift
done

if [ -z "$DIRS" ]; then
 echo "Brak rozpoznanych katalogow. Przerywam dzialanie!"
 wyswietl_blad
fi

/usr/bin/unison-gtk $ROOT1 $ROOT2 $DIRS $OPTIONS

Po uruchomieniu skryptu pokazuje on możliwe opcje:

$ sync.sh

Przykladowe wywolanie:

./sync send|get all [but nazwa [nazwa2...]] [-text|-batch]
./sync send|get nazwa [nazwa2...] [-text|-batch]
./sync list

Zasada używania skryptu jest równie prosta jak jego lista poleceń.

sync.sh list wyświetla listę dostępnych “programów” do synchronizacji - “programy” te to tak naprawdę katalogi przyporządkowane danej nazwie, w skrypcie wygląda to tak:

case "$1" in
 "mail"|"all") $funkcja_lista mail ; $funkcja_katalog mail ; $funkcja_katalog .claws-mail ; R=1 ;;
esac

Dzięki temu wpisując proste:

sync.sh send mail

sprawiam, że synchronizują mi się wszystkie katalogi związane z pocztą (w tym przypadku dwa). Dodawanie kolejnych “programow” według tego wzoru do skryptu nie powinno być problemem.

Jeśli chcę dokonać synchronizacji wszystkich “programów” z laptopa na komputer stacjonarny wówczas wpisuję:

sync.sh get all

Synchronizując w drugą stronę oczywiście użyłbym get. Przy czym należy tutaj mieć na uwadze, że skąd/dokąd jest umowne, bo jeśli wystąpi konflikt, np. dwie różne modyfikacje plików na obu komputerach wtedy program zapyta co z tym zrobić. Istnieje też możliwość, że pojawi się jakiś nowy plik na komputerze “zdalnym” i wtedy, mimo iż synchronizacja przebiega teoretycznie w drugą stronę, to ten plik również zostanie zsynchronizowany czyli pojawi się na komputerze “lokalnym”. Oczywiście można temu zapobiec gdyby taka sytuacja była niepożądana.

Jeśli chcę dokonać synchronizacji wszystkich moich “programów” za wyjątkiem psi i xchata, a także nie chcę oglądać GUI, wówczas wpisuję:

sync.sh send all but xchat psi -text

A jeśli chcę dokonać synchronizacji tylko plikow Firefoksa i to bez zbędnych pytań dodatkowych, to uruchamiam:

sync.sh send firefox -batch

Ten krótki opis programu Unison oczywiście nie wyczerpuje pełni jego możliwości. Zdecydowanie zalecamy zapoznanie się z jego dokumentacją i samodzielne eksperymentowanie. Zrozumienie zasady działania programu w różnych sytuacjach nie jest trudne, a jest podstawą do jego wygodnego używania.



Brak komentarzy.

Skomentuj...

You must be logged in to post a comment.

The accumulation of points and extra discounts makes favorable re-order in Canadian drug pharmacy "'&$ drug list and permanent system of discounts for buyers.