Rsync: verschil tussen versies

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
Regel 17: Regel 17:
  
 
<pre>
 
<pre>
rsync -rv * dvb87:/var/www/example.com/
+
rsync -rv * srv87:/var/www/example.com/
 
</pre>
 
</pre>
  

Versie van 15 jan 2021 10:48

rsync gaat door waar cp en scp ophouden. Op de man page wordt het omschreven als a fast, versatile, remote (and local) file-copying tool. Het is oa. geschikt voor efficiënte datatransfer over een SSH-verbinding. Maar ook binnen één en dezelfde computer kan het soms wonderen doen. Daarnaast lijkt het een volwaardig backupt-tool te zijn. Overigens: rsync is niet immuum voor het argument too long-probleem dat hier geschetst wordt, maar het heeft er wel oplossingen voor.

Wat ik meestal zoek

rsync -r srv12:/var/www/example.com/* . --info=progress2   # Site downloaden
rsync -r * srv12:/var/www/example.com/ --info=progress2    # Site uploaden

Kopiëren, niet verplaatsen

rsync is bedoeld om te kopiëren. Je kunt er ook mee verplaatsen (met de switch --remove-source-files), maar dat gaat vermoedelijk niet sneller dan met mv. Behalve dat mv niet over netwerkprotocolen kan werken.

Upload over SSH

rsync werkt prima over SSH, net als scp. Vermoedelijk is rsync betrouwbaarder en efficiënter [1] dus ik gebruik dat liever. Voorbeeld:

rsync -rv * srv87:/var/www/example.com/

Rename

rsync kan gewoon hernoemen zoals cp dat ook kan. Bv.:

rsync ./test-01.txt ./test-02.txt

Synchronisatie ipv. kopiëren

Stel je wilt 15.000 bestanden kopiëren van map A naar map B, maar een deel is al gedaan. Met cp is dit alles of niets. Met rsync wordt de map gesynchroniseerd: Er wordt alleen gekopiëerd wat nodig is. Uiteraard kost synchroniseren ook tijd (ihb.: verifiëren dat de bestanden gelijk zijn), maar vermoedelijk is het efficiënter dan cp.

Synchronisation & arbitrage

Ik geloof dat rsync standaard de verzonden file kiest als autoriteit, als er verschillen zijn in grootte en datum-van-laatste-verandering. Met de flag --checksum kun je niet nauwkeuriger doen [2]

Mappen, bestanden & argumenten - Hoe zit het precies?

Ik vind het vaak lastig om de argumenten goed te krijgen, als het gaat om het kopiëren van mappen met inhoud. Komt-ie:

  • in-map bevat één (leeg) bestand
  • uit-map bevat niets.

Kopiëer een map (met inhoud) naar een andere map

#!/bin/bash
#
inmap="/tmp/in-map"
uitmap="/tmp/uit-map"

bron=$inmap
doel=$uitmap

echo "Bron: "$bron
echo "Doel: "$doel

rsync -vvr $bron $doel

Nu krijg je in de map uit-map een map in-map met daarin het bestand - Meestal niet wat ik zoek.

Kopiëer de inhoud van een map naar een andere map

Dit is wat ik hierboven eigenlijk zocht:

#!/bin/bash
#
inmap="/tmp/in-map"
uitmap="/tmp/uit-map"

bron=$inmap"/*"
doel=$uitmap

echo "Bron: "$bron
echo "Doel: "$doel

rsync -vva $bron $doel
  • Ik vond het hier handig om met aparte variabelen bron en doel te werken: Dat helpt met debuggen. Als ik suffixen toepas als argumenten voor rsync, mis ik dat
  • Merk op, dat er geen / nodig is aan het eind van bron en doel. Vermoedelijk heb je dat nooit nodig.

Kopiëer meerdere mappen (met wildcard) naar een andere map

Zo dus:

#!/bin/bash
#
# Hoe kopiëer ik alle mapen die beginnen met "in" naar de doellocatie?

inmap="/tmp/in*"
uitmap="/tmp/uit-map"

bron=$inmap
doel=$uitmap

echo "Bron: "$bron
echo "Doel: "$doel

rsync -vva $bron $doel

Recursie: -r & -a

Om een of andere reden gebruik ik -a voor recursie, terwijl -r daar ook voor bestaat, en misschien zelfs logischer is:

  • -r: Gewone recursie
  • -a: Iets ingewikkelds met archieven, identiek aan -rlptgoD [3] - Heb ik dat echt nodig?

Arbitrage: Behoud het grootste bestand

Regelmatig (juli 2020) synchroniseer ik grote hoeveelheden bestanden via Nemo. Daarbij moet ik steeds wachten tot het dialoogvenster Merge directories en Overwrite or skip file. Dat kan vast efficiënter met rsync -- Komt nog!

Bandbreedte

  • Met de switch --info=progress2 krijg je info over de bandbreedte, gedurende de transfer
  • In oudere versies krijg je die info met de switch --progress.

Ignore errors

--ignore-errors doet waarschijnlijk wat 't zegt.

Casus (nov. 2020)

rsync -r gebruiker@112.123.199.40:applications/example.com/public_html/* . --info=progress2

 17,227,398,622  99%   84.26MB/s    0:03:14 (xfr#263949, ir-chk=1023/268363)  
rsync: send_files failed to open "/home/master/applications/example_com/public_html/wp-content/wflogs/attack-data.php": Permission denied (13)
rsync: send_files failed to open "/home/master/applications/example_com/public_html/wp-content/wflogs/config-livewaf.php": Permission denied (13)
rsync: send_files failed to open "/home/master/applications/example_com/public_html/wp-content/wflogs/config-synced.php": Permission denied (13)
rsync: send_files failed to open "/home/master/applications/example_com/public_html/wp-content/wflogs/config-transient.php": Permission denied (13)
 17,231,297,150  99%   84.27MB/s    0:03:15 (xfr#263952, ir-chk=1016/268363)
rsync: send_files failed to open "/home/master/applications/example_com/public_html/wp-content/wflogs/template.php": Permission denied (13)
 17,266,793,136  99%   84.26MB/s    0:03:15 (xfr#265138, to-chk=0/268708)   
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1668) [generator=3.1.2]

Diagnose

Ik nam aan, dat transfer was gestopt vanwege de permission denied-foutmeldingen. Nu ik het wat beter bekijk: Waarschijnlijk ging het proces gewoon door en is zoiets als --ignore-errors dus niet nodig.

Zie ook

Bronnen