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.
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
Stáhnout toto a rozbalit do nějakého adresáře, např. D:\rsync
.
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
.
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:
start /MIN
- tento příkaz způsobí, že rsync je spuštěn v dalším okně příkazové řádky a toto okno je minimalizováno. V praxi tedy dojde ke spuštění třech oken s třemi instancemi rsyncu. Po dokončení se pak pozavírají.ssh -p 22 -i d:\rsync\id_rsa
- znamená, že komunikace rsyncu bude navázána přes SSH na portu 22 a k autentizaci bude použit privátní klíč určen cestou k souboru id_rsa. Určení portu 22 samozřejmě být použito nemusí (je pro SSH výchozí), ale pokud se sshd na serveru pustí na jiném portu, je dobré vědět, kde to rychle změnit./cygdrive/d/mojedata
- je cesta k lokálnímu adresáři, který se má zálohovat. Pozor na uvedení/neuvedení lomítka na konci. Pokud tam lomítko není, rsync na druhé straně vytvoří adresář (v tomto případě mojedata), pokud je, tak začne hrnout co cíle přímo soubory a podadresáře z mojedata.rsync@192.168.1.1:/data/
obsahuje námi vytvořeného uživatele v Linuxu rsync, IP nebo DNS adresu serveru a adresář, kam se budou data synchronizovat.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.