Introduktion till rsync

Av alla tusentals verktyg för backup är rsync det kanske mest kraftfulla. Som namnet antyder används rsync (”remote sync”) för att synkronisera filer mellan en lokal dator och en fjärrdator/server. Det går dock utmärkt att synkronisera även lokala filer och kataloger. Programmet kan synkronisera filer i båda riktningarna, alltså både från en fjärrdator och till en fjärrdator. Då rsync körs över SSH skickas också datan krypterat över nätet, en extra trygghet om det rör sig om känslig data.

För att rsync ska fungera krävs att programmet är installerat på båda datorerna som ska synkroniseras. rsync finns tillgängligt till de flesta operativsystem och plattformar:

  • Linux – installerat som standard i mer eller mindre alla distributioner (Debian, Red Hat, Ubuntu, Fedora, etc..)
  • Mac OS X – installerat som standard. Dock till synes en äldre/begränsad version. Mer info och senare version här.
  • BSD – FreeBSD/OpenBSD/NetBSD –  tillgängligt i portsträdet: net/rsync
  • Windows – Installeras antingen genom Cygwin eller programmen cwrsync och DeltaCopy

Vad skiljer då  rsync från vanlig kopiering mellan två kataloger? Jo, rsync skickar endast differensen mellan de två katalogerna! Det innebär att första gången rsync körs kommer programmet kopiera filerna precis som vanligt. Nästa gång rsync körs mellan samma kataloger kommer rsync att söka igenom båda katalogerna, analysera skillnaderna, komprimera datan och sedan skicka endast det som skiljer. På så vis minimeras trafiken över nätverket, vilket är helt avgörande när stora mängder data behöver synkroniseras.

I följande exempel använder vi rsync för att kommunicera med en server över en säker SSH-förbindelse. Programmet rsync kan också kommunicera med en särskild rsync-server (rsync daemon). Det är i regel dock inte nödvändigt annat än i undantagsfall, varför detta lämnas utanför den här introduktionen. För den som vill veta mer finns mer informtion här och här.

Trots att programmet är är fyllt av valmöjligheter är det inte särskilt svårt att göra en enkel backup. Många av de grafiska program som finns för att hantera backuper i Linux använder också rsync bakom kulisserna.

Använda rsync

Syntaxen för rsync-kommandot ser förenklat ut som följer:

rsync /originalkatalog /målkatalog

Om ena katalogen ligger på en server/fjärrdator anger vi också det

rsync /originalkatalog mittanvändarnamn@minserver:/målkatalog

/originalkatalog innehåller förstås de filer vi vill ta en backup på och /målkatalog den katalog som vi vill ska synkroniseras med originalkatalogen. Användarnamn ”mittanvändarnamn” och servern ”minserver” byts förstås ut mot de uppgifter du har för att logga in på din server med SSH. Du kommer sedan att tilfrågas om lösenordet för ditt användarnamn.

Användbara växlar

För att ställa in exakt hur rsync ska sköta synkroniseringen mellan katalogerna använder vi några av de många växlar (parametrar) som programmet accepterar som argument. Listan över tillgängliga växlar är för lång för att listas här men finns förstås i rsyncs manual.  Några av de mest användbara är:

-a

Anger att rsync ska arkivera katalogen. Det innebär kortfattat att rsync dels arbetar rekursivt, d.v.s. i alla underkataloger (kan också anges med -r) och att även metadata sparas i målkatalogen. Det innebär att inte endast filerna kopieras utan även information kring dem, så som när de senast ändrades, ägar- och grupp-information samt tillstånd (permissions) för filerna. Använd alltid denna växel om du vill bevara kataloger och filer precis så som de såg ut i originalkatalogen.

-z

Anger att rsync ska skicka datan i komprimerad form.

-vv

Anger att rsync ska skriva ut detaljer (verbose) för varje fil som kopieras. Användbart om du vill följa utveckligen steg för steg. Ta bort om du använder rsync från ett skript.

--progress

Anger att rsync ska visa exakt vilka framsteg som görs vid filkopiering. Användbart främst då mycket stora filer ska flyttas och du behöver en visuell bekräftelse på framsteg (visas i %) och hastighet (kB/MB/s). Ta bort om du använder rsync från ett skript.

--delete

Anger att rsync ska ta bort filer i målkatalogen som inte finns i originalkatalogen. Detta för att de båda katalogerna ska spegla varandra exakt.

--log-file=loggfil.txt

Anger att rsync ska spara detaljerna för överföringen i loggfilen ”loggfil.txt”. Användbart om rsync körs från skript och du senare vill kontrollera resultatet.

rsync för lokal backup

Med ovanstående växlar färskt i minnet är vi redo att göra en första backup med rsync, i det här exemplet mellan två kataloger på den lokala datorn:

rsync -azvv --progress /var/www /home/andy/wwwbackup

Ovanstående kopierar innehållet i katalogen /var/www till katalogen /home/andy/wwwbackup

Första gången rsync körs kommer alla filer att kopieras. Nästa gång kommer endast nya filer och de ändringar som gjorts på befintliga filer att kopieras.

rsync för backup över SSH

I det här exemplet gör vi en backup från en fjärrdator/server med rsync över en säker SSH-förbindelse. Kommandot är i princip identiskt med det vi använde för att kopiera lokalt med den skillnaden att vi lägger till en extra växel:

-e ssh

Med växeln -e anger vi vilket skal vi vill använda. I vårt fall förstås SSH. Utöver det behöver vi berätta vilken server vi vill kopiera till/från samt vilket användarnamn vi ska använda för inloggning.

rsync -azvv --progress -e ssh /var/www andy@lonewolfmedia.se:/var/www

Ovanstående kopierar innehållet i den lokala katalogen /var/www till katalogen /var/www på servern lonewolfmedia.se som vi loggar in på med den fiktiva användaren ”andy”. Det går förstås lika bra att synka i motsatt riktning, alltså från servern till en lokal katalog:

rsync -azvv --progress -e ssh andy@lonewolfmedia.se:/var/www /var/www

Sammanfattning

Ovanstående är tänkt som en snabb introduktion till rsync. Viktigast med alla former av backup är förstås dock inte hur man gör det utan att man gör det! I ett kommande inlägg kommer vi kolla på hur vi använder oss av crontab för att automatiskt köra rsync vid valda tidpunkter. Hade du användning för guiden eller frågor på ovanstående, använd kommentarsfältet nedanför!

Då och då har jag fått filer skickade till mig med  bilder inbäddade i dokumentfiler som PDF, ODF, Word eller liknande.

Upptäckte det här enkla verktyget då jag behövde få ut några bilder ur en gigantisk .pdf-fil och tänkte dela med mig av det. Det är förstås möjligt att sitta och klippa och klistra bild för bild, men behöver man få ut fler bilder än någon enstaka blir det snabbt jobbigt.

Mer eller mindre alla linuxdistributioner kommer med paketet poppler-utils förinstallerat, så det är bara att öppna upp favoritterminalen och skriva;

pdfimages -j minfil.pdf ~/

Ovanstående extraherar alla bilder ur ”minfil.pdf” till din hemkatalog ( ~/ ). Växeln -j gör att bilderna sparas i .jpg-format istället för .ppm (Portable Pixmap) som annars är standardformatet.

Skriv bara pdfimages för att få alla parametrar listade.

Behöver du få ut annan data ur en pdf? Paketet poppler-utils innehåller även pdftohtml, pdftotext och pdffonts.

(Den observante nörden lägger säkert märke till namnet Poppler, som är taget från Futurama, mer bestämt avsnittet ”The Problem With Popplers” (Episod 18, Säsong 2). Poppler, ett bedårande litet utomjordiskt mysdjur visar sig vara en delikatess och konsumeras snart över hela jorden, med inte helt lyckade konsekvenser som följd.)

WordPress visar som standard samma rubrik för statiska sidor som titeln på sidan. Heter t.ex. din förstasida ”Hem” kommer också rubriken överst på sidan att skriva ”Hem”. Detta är förstås inte alltid önskvärt. För att ändra det efter eget tycke och smak måste vi först hitta funktionen som skriver rubriken åt oss. Den heter logiskt nog the_title() och vi hittar den under

wp-includes/post-template.php

Funktionen bör se ut ungefär såhär:

function the_title($before = '', $after = '', $echo = true) {
  $title = get_the_title();

  if ( strlen($title) == 0 )
    return;

  $title = $before . $title . $after;

  if ( $echo )
    echo $title;
  else
    return $title;
}
									

Här kan vi förstås sätta upp egna villkor för vad som ska skickas ut med echo eller returneras. Använder vi exemplet jag nämnde tidigare skulle vi t.ex. kunna ersätta rubriken ”Hem” med ”Välkommen!” med en rad kod:

if ($title == 'Hem') $title = 'Välkommen!';
if ( $echo )
  echo $title;
else
  return $title;
									

WordPress kommer förkonfigurerat med möjligheten att uppdateras med hjälp av FTP (File Transfer Protocol) eller FTPS (FTP med SSL).

 

WordPress utan SSH

Båda kommer med sina svagheter.

  • FTP är uråldrigt och byggdes helt utan säkerhet i åtanke. Både användarnamn, lösenord och datatrafik skickas helt i plain text. Användningsområdet sträcker sig på sin höjd till s.k. publika ftp-servrar, där all data är tänkt att vara tillgänglig för vem som helst. FTP kräver också särskild konfiguration av brandväggen på servern, och även om det går att lösa med viss handpåläggning känns det onödigt om det enda syftet är att uppdatera WordPress.
  • FTPS är FTP men med en krypterad kommunikationskanal (för användarnamn/lösenord) och möjlighet till krypterad datakanal. Detta har dock inte stöd i alla FTP-klienter. FTPS kräver precis som FTP samma konfiguration av brandväggen och dessutom konfiguration av SSL-certifikat. Ännu mer onödigt krångel bara för att uppdatera WordPress.

Lösningen på problemet heter SFTP (SSH File Transfer Protocol) och använder SSH för all kommunkation. Då SSH är standard på mer eller mindre alla Linux/Unix-maskiner är chansen stor att det redan finns installerat på servern där du har din WordPress sida, och dessutom att brandväggen redan är konfigurerad för att tillåta den trafiken. Dessutom har SSH ett utmärkt track record när det gäller säkerhet, så det går alldeles utmärkt att sova om natten även om man skulle ha bloggat om statshemligheter. Nackdelen med SSH är att många webbhotell inte låter sina kunder använda det, men det är ju en nackdel med ditt webbhotell snarare än med SSH-protokollet.

Hur konfigurerar vi då WordPress att använda SFTP istället? Svaret är att det gör vi inte, det gör WordPress nämligen helt själv förutsatt att rätt kodbibliotek finns installerat på servern. Då WordPress använder PHP behöver det kunna ”prata” SSH (eller rättare sagt med biblioteket libssh2) på något sätt. Lyckligtvis finns detta inkluderat i pakethanteraren till i stort sett alla linuxdistributioner.

Biblioteket heter till Debian/Ubuntu libssh2-php och installeras enkelt från terminalen;

sudo apt-get install libssh2-php

Motsvarande paket på Red Hat/Fedora heter php-pecl-ssh2 och installeras med;

sudo yum install php-pecl-ssh2

Efter det startar vi om webservern.

sudo service apache2 restart

eller motsvarande på Red Hat/Fedora

sudo service httpd restart

och Voila! Vi kan nu välja att använda SSH för att uppdatera WordPress.

WordPress med SSH

 

8 / 6 2011

First Post!

Sådär ja. Då var WordPress installerat och konfigurerat, och sidan börjar likna något. Startar med det enkla och rena temat Codium Extend och skalade faktiskt av det ytterligare något innan jag blev nöjd. Må vara minimalist till smaken, men framförallt känns det enklare att själv anpassa sidan med tiden om man utgår från en enkel grund. Och att bygga ut sidan står verkligen högt på prioritetslistan just nu. Håll till godo med en enklare presentation under tiden.

Tanken med bloggen här är dels att dokumentera spännande jobb och uppdrag, men också dela med mig av tankar, idéer och tips kring webben, utveckling och öppen källkod i stort.