Rsync

K čemu je rsync dobrý

Utilitu rsync lze nejsnáze přirovnat k příkazu cp. Stejně jako cp, používá se i utilita rsync k jediné prosté činnosti: kopírování souborů. Oproti cp má však rsync mnoho užitečných vlastností navíc:

Lokální použití

Lokálně lze rsync použít podobně jako cp:

rsync soubor1 soubor2 soubor3 cílový-adresář

Ve svém výsledku je jak volání cp tak rsync ekvivalentní. V praxi však může být rsync mnohem efektivnější. Pokud už totiž v cílovém adresáři existuje některý z kopírovaných souborů, přenášejí se pouze rozdíly, zatímco cp kopíruje vždycky všechno.

Velmi často používám utilitu rsync pro zálohování. To u mě vypadá obvykle tak, že přes USB připojím externí disk a spustím skript, který disk přimontuje, ověří vstupní podmínky, zavolá rsync a poté disk odpojí. Vlastní zálohovací utilitou je zde právě rsync, jehož volání v jednom konkrétním vypadá například takto (přepínače vysvětlím dále):

rsync \
    --acls \
    --delete \
    --verbose \
    --archive \
    --delete-excluded \
    --exclude "qemu/debian.qemu" \
    --prune-empty-dirs \
    /home /zalohy

Použití rsync pro kopírování mezi počítači (bez serveru)

Utilitu rsync lze snadno využít i pro kopírování souborů mezi různými počítači. Jako přenosový kanál přes internet pak nejlépe poslouží ssh. Díky ssh jsou kopírovaná data zabezpečená proti odposlechu (na internetu nikdo nezjistí, co kopírujete) a elegantním způsobem je vyřešený i dálkový přístup na jiný stroj. Server ssh navíc bývá u mnoha Linuxových strojů standardním prostředkem pro dálkovou správu, není tedy třeba nic nastavovat. Na desktopy, u kterých často ssh server nainstalovaný není, lze ssh server velmi snadno doinstalovat.

Velmi dobře využitelné je i přihlašování pomocí klíčů, bez hesel. To je nutností u skriptů, zvláště pak, je-li takový skript pouštěný automaticky v noci (zálohování na jiný server) nebo je skript pouštěný ve zcela neinteraktivním prostředí (online zálohy databázového serveru PostgreSQL).

Nejjednodušší použití utility rsync při kopírování na vzdálený server může vypadat takto:

rsync --rsh="ssh -l root" soubor1 soubor2 192.168.1.15:/cílový-adresář

Uvedený příkaz překopíruje oba soubory na počítač 192.168.1.15. Místo IP adresy lze pochopitelně využít i jméno počítače. Pro přihlášení na vzdálený počítač 192.168.1.5 se použije účet root. Je-li v počítači 192.168.1.15 v souboru /root/.ssh/authorized_keys uvedený veřejný klíč kopírujícího uživatele, zkopírují se soubory přímo. Není-li veřejný klíč nainstalovaný, zeptá se utilita rsync na heslo uživatele root na počítači 192.168.1.15.

Utilitu rsync můžete využít například pro vzdálené zálohy adresářů v /home. Pak budete zřejmě chtít kopírovat celý strom adresářů, zachovat informace o vlastnictví souborů, smazat na záložním serveru soubory, které již na originálním stroji neexistují, a přitom pokud možno co nejméně zatížit internetovou linku:

rsync --rsh="ssh -l root" \
    --acl \
    --archive \
    --compress \
    --delete \
    --verbose \
    --prune-empty-dirs \
    /home archiv.mojesit.cz:/zaloha

Nastavení serveru rsync

Ve většině případů je nejvhodnější pro přenos na vzdálený počítač použít ssh. Jsou však případy, kdy je vhodné použít rsync server. Typickým použitím je například adresář /usr/portage v distribuci Gentoo. V tomto adresáři je velké množství informací o jednotlivých balících. Většina těchto informací se nemění, je však nutné mít pro řádné fungování systému ve svém počítači vždy aktuální kopii. Díky tomu, že utilita rsync přenáší pouze rozdíly, je její použití pro podobné účely velmi vhodné.

Abyste mohli používat server rsync, musíte vytvořit jednoduchý konfigurační soubor /etc/rsyncd.conf. V případě uvedeném v předchozím odstavci může vypadat konfigurační soubor například takto:

use chroot = yes

[portage]
    path = /usr/portage
    uid = 0
    gid = 0
    read only = yes
    comment = Gentoo portage

Na vzdáleném počítači pak v takovém případě musí běžet rsync jako démon. To se obvykle zajistí při startu systému skriptem /etc/init.d/rsyncd.

Možnosti nastavení jsou velmi široké, podrobnosti najdete v manuálu:

man rsyncd.conf

Přepínače

Zatím jsem v příkladech uváděl přepínače bez vysvětlení. Přepínačů je velké množství, v praxi jsem většinou vystačil jen s několika nejpoužívanějšími přepínači (popis dalších přepínačů najdete v manuálu):

--acls U přenášených souborů nastaví ACL. Pamatujte na to, že podpora ACL musí být implementovaná na obou počítačích a má-li mít takový přenos smysl, je nutné mít na obou počítačích zavedené stejné uživatele.
--archive Kopíruje rekurzivně celý adresář, zachovává časy vytvoření, vlastníka a skupinu. Speciální soubory (links, devices) kopíruje jako speciální soubory.
--delete Na cílovém počítači smaže přebytečné soubory. Pro mazání se mohou použít různé přístupy (liší se různými přepínači).
--delete-before Přebytečné soubory na cílovém serveru lze mazat ještě před tím, než se začne s kopírováním, a uvolnit tak místo pro nové soubory. Mazání souborů může trvat velmi dlouhou dobu, takže nemáte-li skutečně dobrý důvod použít tento přepínač, je lépe použít přepínač --delete-during
--delete-during Během kopírování smaže přebytečné soubory. Ve srovnání s přepínačem --delete-before je mnohem rychlejší a spolehlivější, můžete se však dostat do potíží při nedostatku místa na disku cílového počítače.
--prune-empty-dirs Vyčistí na vzdáleném serveru i prázdné adresáře.
--one-file-system Zkopíruje pouze jeden aktuální filesystém. V Linuxu je možné připojit další diskovou oblast kamkoliv. Je tak možné mít například adresář /home jako jednu samostatnou diskovou oblast a v adresáři /home/franta/mp3 mít připojený další disk. Přepínačem --one-file-system utilitě rsync takto sdělujeme, že při kopírování adresáře /home nemá postupovat do adresáře /home/franta/mp3.
--compress Data se před přenosem na vzdálený server zkomprimují. Šetří se tak internetová linka.
--force Smaže na cílovém stroji i adresáře, které nejsou prázdné.
--verbose Při kopírování se vypisuje informace o právě kopírovaném souboru.
--exclude Při kopírování se vynechají některé soubory. Tradičně to mohou být například filmy v domácích adresářích neukázněných uživatelů: --exclude "*.avi"
--rsh="ssh" Pro přenos se použije uvedený příkaz (v tomto případě ssh). Pro ssh zde lze zadat různé parametry, obvykle uživatele nebo port, liší-li se od standardního portu 22.

Praktické použití rsync

V praxi málokdy používám rsync přímo na povelové řádce. V drtivé většině případů volám rsync z různých skriptů. Zálohování, ať už na lokální disk připojený přes USB nebo na vzdálený počítač, jsem už uváděl na začátku. Velmi často používám rsync i pro přenos stránek na webový server. Stránky vytvářím u sebe na lokálním počítači, na server vybavený programem ssh a rsync pak přenáším pouze změny. Nikdy se tak nedostanu do situace, že jsem zapoměl přenést některé soubory, a stránky, i když lokálně fungují, nejsou na serveru kompletní. Navíc se mohu vyhnout nebezpečnému protokolu ftp.

Pomocí utility rsync lze urychlit některé časově náročně operace na minimum. Představte si, že potřebujete rozšířit diskovou kapacitu z původních 500GB na nynější 1TB, přitom chcete omezit dobu vypnutí serveru. Na serveru vám přitom pracuje množství uživatelů ve windows a neustále mění nějaká data. Utilita rsync vám může vytrhnout trn z paty:

mount -t ext3 /dev/sdx1 /novy-disk
cd /data

# tohle bude několik hodin trvat:
rsync --acls --archive . /novy-disk

# Nyní už to bude mnohem rychlejší,
# kopíruje se jen práce posledních několika hodin:
rsync --acls --archive . /novy-disk

# A ještě rychlejší, posledních několik minut:
rsync --acls --archive --delete-during . /novy-disk

# Nyní jsem poslal uživatele na oběd, mohu je odříznout
/etc/init.d/samba stop
rsync --acls --archive --delete-during . /novy-disk
cd 
umount /data
umount /novy-disk
mount -t ext3 /dev/sdx1 /data
/etc/init.d/samba start

Máte-li přichystané všechno hardwarové příslušenství, je možné uvedeným postupem zkrátit výměnu disku na minutu.

Zádrhele při praktickém použití

Rsync může spotřebovat poměrně velké množství paměti, zvláště při kopírování rozsáhlejších stromů. Narazil jsem na to při vytváření své Gentoo šablony na serveru virtualmaster. 64 MB RAM pro překopírování celého adresáře /usr nestačilo, takže bylo potřeba kopírovat adresář po jednotlivých podadresářích.

Při synchronizaci velmi rozsáhlých stromů můžete narazit při použití přepínače --delete-before. Promazání nadbytečných souborů zvláště na pomalé lince může trvat tak dlouho, že rsync havaruje (firewall ukončí dlouho trvající nepoužívané spojení). Vyhnout se tomu lze přepínačem --delete-during.