Managed ad

Filsynkronisering mellan flera datorer med Unison

Av Pontus, 16 februari, 2015

När man arbetar vid en bärbar dator och sparar alla filer på en server så kan det vara bra att kunna synkronisera en katalog mellan datorn och servern för att ha tillgång till filerna även när man är på resande fot. Det finns lite olika metoder, alla har sina fördelar och nackdelar. Efter mycket velande fram och tillbaka så bestämde jag mig för att lösa det med Unison. Unison kan synkronisera kataloger både lokalt eller mellan client och server. Har du mer än en dator som ska hållas i synk så är det heller inga problem, den rekommenderade metoden är då att ställa in alla datorer att synka mot en, tänk dig ett stjärvnätverk med servern som du synkar mot i mitten.

Som tur är så finns Unison med i Ubuntus packethanterare så för att installera i Ubuntu så räcker det med att skriva, gör det här både på den lokala datorn och på servern som du ska synkronisera mot.

sudo apt-get install unison

Det enklaste sättet att testa unison är helt enkelt att synkronisera två kataloger direkt i terminalen. Observer att katalogerna måste va likadana innan vi synkroniserar, annars finns risken att Unison raderar allt i katalogen som innehåller filer.

Vilka filer ska du synkronisera från den bärbara med servern? En tanke skulle kunna vara att synkronisera hela /home/user katalogen men om du synkroniserar flera daroer så följer även cache kataloger och olika konfigurationsfiler med vilket inte är riktigt önskvärt. Så antingen synkroniserar man hela användarkatalogen och säger åt Unison att ignorera det som inte skall synkronsiera. Jag väljer istället att skapa en Dokument katalog som jag synkroniserar.

Först måsta vi ha två likadana kataloger, om vi bara skapar en tom katalog så kan alla filera raderas istället för att synkroniseras. Jag vet att jag redan har nämnt det men det är viktigt.

Vi börjar således med att kopiera Dokument katalogen från servern (det är alltså den alla nuvarande filer ska ligga i) till en lokal katalog som vi använder på datorn.

mkdir Lokala\ Dokument
rsync -aruv user@host:/home/user/Dokument/ Lokala\ Dokument

Nu har vi två likadana kataloger, en på servern och en lokalt.

Dags att börja synka! Testa först så att Unison kan ansluta till Unison på servern.

unison -testserver Lokala\ Dokument ssh://server/home/user/Dokument 
Contacting server...
user@server's password: 

Men vad nu? Lösenord? Eftersom att vi ansluter över ssh så behöver vi ange vårat lösenord varje gång såvida vi inte har lagt in lösenordslös inloggning med nycklar. Vilket kan vara rekommenderat om vi ska synka filer ofta och dessutom ett krav om snkroniseringen ska skötas automatiskt med Cron. Därför lägger jag nu in lösenordsfri inloggning och testar igen.

Contacting server...
Connected [//server//home/user/Dokument -> //dator//home/user/Lokala Dokument]

Mycket bättre! Dags att starta en synkronisering, i princip samma kommando men nu skippar vi -testserver.

unison Lokala\ Dokument ssh://server/home/user/Dokument 

Då ska det se ut så här.

Contacting server...
Connected [//server//home/user/Dokument -> //dator//home/user/Lokala Dokument]
Looking for changes
Warning: No archive files were found for these roots, whose canonical names are:
        /home/user/Dokument
        //dator//home/user/Lokala Dokument]

This can happen either
because this is the first time you have synchronized these roots, 
or because you have upgraded Unison to a new version with a different
archive format. 
(bortklippt text)
Press return to continue.[<spc>] 

Första gången vi kör så varnar den alltså för att de här katalogerna inte har synkats tidigare och att det kan ta ett tag för första körningen. Eftersom det stämmer att det är första gången så trycker vi bara på "Enter" så börjar synkroniseringen. Den skannar då igenom alla lokala filer och gämför med filerna på servern.

Waiting for changes from server
Reconciling changes
Nothing to do: replicas have been changed only in identical ways since last sync.

Ska vi testa hur det fungerar? Skapa en fil, antingen på servern eller lokala datorn och kör om synkningen.

cd Lokala\ Dokument
touch hej
unison Lokala\ Dokument ssh://server/home/user/Dokument 
Resultat bör se ut enligt följande
Contacting server...
Connected [//server//home/user/Dokument -> //dator//home/user/Lokala Dokument]
Looking for changes
Waiting for changes from server

Reconciling changes

local          fs02               
new file ---->            hej  [f] 

Den säger alltså till att det finns ändringar, det vill vi ju inte om vi ska synkronisera automatiskt med cron. Så vi avbryter med ctrl + c. Därefter testar vi igen men vi lägger till -batch, en kommer då inte att ställa några frågor överhuvudtaget.

unison -batch Lokala\ Dokument ssh://server/home/user/Dokument 

Nu ska det se ut så här.

Contacting server...
Connected [//server//home/user/Dokument -> //dator//home/user/Lokala Dokument]
Looking for changes
  Waiting for changes from server        
Reconciling changes
new file ---->            hej  
local        : new file           modified on 2015-02-16 at 11:25:07  size 0         rw-rw-r--
server         : absent
Propagating updates
UNISON 2.40.102 started propagating changes at 11:34:18.93 on 16 Feb 2015
[BGN] Copying hej from /home/user/Lokala Dokument to //server//home/user/Dokument
[END] Copying hej
UNISON 2.40.102 finished propagating changes at 11:34:19.07 on 16 Feb 2015
Saving synchronizer state
Synchronization complete at 11:34:19  (1 item transferred, 0 skipped, 0 failed)

Nu har vi ett kommando som vi kan lägga in i Cron för att automatiskt synka de här två katalogerna så ofta som vi vill. Fast för att underlätta och kunna köra en manuell synkronisering så skapar vi först en konfigurationsfil. Kommandot för att starta en synkronisering blir mycket enklare. 

Gå till .unison i din hemkatalog och skapa filen dokument.prf

cd ~/user/.unison
joe dokument.prf

I filen skriver vi följande, vilket alltså är sökvägarna som vi synkroniserade tidgiare samt att vi måste definiera en path. Path säger vilka kataloger som ska synkronieras eftersom att vi vill synkronisera allt så skriver vi en *. Om vi hoppar över att ange en path så kommer det inte att fungera, Unison kommer att skapa en ny katalog lokalt som den synkroniserar mot. Fråga mig inte varför. Det tog mig ett tag att hitta varför den gjorde så.

root = /home/user/Lokala \ Dokument
root = ssh://server//home/user/Dokument 
path = *

Nu kan vi synkronisera genom att bara skriva 

unison dokument 

I en terminal. 

Nu kan vi lägga till det här i crontaben. Öppna din crontab genom att skriva.

crontab -e

Nu öppnas din användares crontab fil och vi lägger till följande rad (> /dev/null 2>&1 gör så att all output från Unison skickas till /dev/null, alltså Linux stora svarta hål, istället för att skicka ett mail). 

23 * * * *  /usr/bin/unison -batch dokument  > /dev/null 2>&1

Nu kommer katalogerna att synkronisera en gång i timmen. Om du istället vill ha det till exempel var sjätte timme så kan du skriva enligt följande.

* */6 * * *  /usr/bin/unison -batch dokument  > /dev/null 2>&1

Djupare än så går jag inte in på cron nu, det finns jättemycket information på nätet och kanske skriver jag en guide i framtiden.

 

Managed ad