Zálohování z Windows na Linux Rsyncem via SSH

18.03.2015

Intro

Rodiče mají doma tři počítače s Windows XP. Dlouhou dobu jsem k jejich zálohování používal Rsync, který se nešifrovaně připojoval k Rsync serveru běžícího na servříku v LAN. Jelikož se však servřík odporoučel do silikonového nebe (a nový jsem již kupovat nechtěl), musel jsem zálohování vyřešit jinak.

V naší síti Starhill máme v centrálním uzlu dvě fyzické mašiny. Na jedné z nich je VMWare ESX a dvě VM s Debianem. Jedná se o aplikační servery (databáze, web, pošta apod.), tedy stroje s poměrně malou záteží a hlavně s minimem alokovaného prostoru na terovém datastore - dohromady asi 30GB. Čili i s nějakou provozní rezervou se dalo 800GB použít na ukládání záloh a to jak z počítačů rodičů, tak i z mého domácího a pracovního.

Rsync je skvělý software, ale bohužel má tu nectnost, že zálohy nejsou tzv. online - musí se spustit v dávce. Pokusil jsem se tedy najít něco, do by zálohovalo průběžně - tedy. službu, která by si hlídala změny na disku a příslušný soubor poté ihned poslala do záloh. Našel jsem BitTorent Sync. Jedná se peer-to-peer mechanismus, jak synchronizovat složky z různých zařízení - Windows, Linux, Andorid apod. Pro Windows je k dispozici pěkný GUI klient, v Linuxu čitelný a jasný konfigurák. S prvotním nastavením jsem sice trošku tápal, ale nakonec ne zadařilo vše začalo fungovat :-)

To však není happy end. Po třech měsících jsem se zcela náhodně přihlásil na jeden PC a zjistil, že BTSync piše hlášku "Peer not found" a záloha už měsíc neproběhla. V logu nic, prostě nepřipojeno. Týden laborování a výsledek byl ten, že jsem musel synchronizaci složky nastavit znovu, aby to pak dalších 14 dní fungovalo a pak opět to samé. Ono by se na chybu asi přišlo, ale jelikož si dovedu představit lepší využití volného času (např. s tímto nebo s tímto :-) ), šel BitTorent Sync ke kopru a rozjel jsem znovu spolehlivý Rsync - tentokrát však šifrovaně přes SSH.

Linux

Předpokladem je nainstalovaný Debian, funkční SSH a přístup jako root.

# instalace rsync, pokud neni
apt-get install rsync

# pridani uzivatele
adduser rsync

# vytvoreni adresare pro data
mkdir /data

# nastaveni vlastnika
chown rsync:rsync /data

# zalozeni souboru pro ulozeni SSH klicu 
mkdir /home/rsync/.ssh
> /home/rsync/.ssh/authorized_keys

Windows

Stáhnout toto a rozbalit do nějakého adresáře, např. D:\rsync.

Vytvoření klíčů pro SSH autentizaci

V archivu je soubor ssh-keygen.exe a ten je potřeba spustit. Slouží k vygenerování veřejného a soukromého klíče pro SSH autentizaci. Stačí jen mačkat Enter. Soubory s klíči se vytvoří v adresáři .ssh v profilu uživatele.

d:\rsync>ssh-keygen.exe
Generating public/private rsa key pair.
Enter file in which to save the key (/cygdrive/c/Users/walda/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /cygdrive/c/Users/walda/.ssh/id_rsa.
Your public key has been saved in /cygdrive/c/Users/walda/.ssh/id_rsa.pub.
The key fingerprint is:
11:11:11:22:22:33:44:55:55:66:77:88:99:01:aa:bb walda@walda
The key's randomart image is:
+--[ RSA 2048]----+
                 |
|         +       |
|      o o o      |
|       = +       |
|      . S      o |
|       = =    + E|
|      = o =    = |
|       o + o  .  |
|        . . ..   |
+-----------------+|

Soubory id_rsa a id_rsa.pub zkopírovat do D:\rsync.

Obsah souboru id_rsa.pub (je to jen jeden řádek) je poté nutné zkopírovat do souboru /home/rsync/.ssh/authorized_keys v Linuxu - stačí CTRL+C a CTRL+V přes otevřenou session, alternativně přes SCP či jakkoliv jinak.

Funkci autentizace lze ověřit připojením přes SSH ssh rsync@192.168.1.1.

Nastavení Rsyncu

Provedení zálohy se spustí dávkou run.cmd. Obsah dávky je následující:

echo off
TimePlanner.exe 259200
IF ERRORLEVEL 1 GOTO errorHandling

start /MIN rsync -av --compress --iconv CP1250,UTF-8 --chmod u+rwx -e "ssh -p 22 -i d:\rsync\id_rsa" "/cygdrive/d/mojedata" rsync@192.168.1.1:/data/
start /MIN rsync -av --compress --iconv CP1250,UTF-8 --chmod u+rwx -e "ssh -p 22 -i d:\rsync\id_rsa" "/cygdrive/d/dokumenty" rsync@192.168.1.1:/data/
start /MIN rsync -av --compress --iconv CP1250,UTF-8 --chmod u+rwx -e "ssh -p 22 -i d:\rsync\id_rsa" "/cygdrive/d/fotky" rsync@192.168.1.1:/data/

:errorHandling
echo Od posledniho spusteni jeste neuplynul pozadovany cas

Několik poznámek:

TimePlanner.exe je binárka, která umožňuje svým návratovým kódem určit, zda-li je opakovaně spuštěna až po intervalu uvedeného jako parametr (čas v sekundách).

Rodiče spouští počítače zcela náhodně - někdy třikrát denně, někdy jednou za 4 dny. Čili není možné navázat zálohu na konkrétní čas a je nutné úlohu spoutět po každém přihlášení - aby byla jistota. Navíc, narozdíl od Windows 7 a výše, Windows XP nemají v plánovači volbu, aby se naplánovaná úloha spustila ihned jak to bude možné, pakliže to v daném naplánovaném čase z důvodu vypnutého PC nešlo. Počítače rodičů nejsou žádná děla a spuštění rsyncu po každém přihlášení je dost otravné (vytížení disku při detekci změn). Jako řešení jsem si napsal drobnůstku v C# TimePlanner, což je binárka, kterou je možné spouštět po každém přihlášení, avšak dávky rsyncu se spustí až po periodě určené jako parametr tohoto programu. Poslední spuštění (unixtime) si ukládá do souboru timestamp.last a po spuštění ho TimePlanner porovná s aktuálním unixtime. Výsledek vrátí jako return code, resp. v proměnné ERRORLEVEL v baťáku.