Rsync

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen

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 -e 'ssh -p 20202' srv12:/var/www/example.com/wp-content/uploads/2023/09/* .
rsync -e 'ssh -p 22' ./* hetzner:/var/www/example.com/wp-content/uploads/2023/09/
rsync -e 'ssh -p 22' -r hetzner:/var/www/example.com/wp-content/uploads/2023/09/ . --info=progress2
rsync -e 'ssh -p 20202' -r srv12:/var/www/example.com/* . --info=progress2

A bit older

rsync -r srv12:/var/www/example.com/* . --info=progress2 --links   # Site downloaden, inclusief links
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

Switch -r staat voor recursie.

Daarnaast is deze switch opgenomen op de switch -a, die een hoop switches combineert die handig zijn bij het maken van backups (zie elders).

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!

Voortgang-informatie

Met de switch --info=progress2 krijg je info over de bandbreedte en voortgang gedurende de transfer. In oudere versies krijg je die info met de switch --progress. Ik vind --info=progress2 vaak handiger dan -v (verbose), omdat de output beperkt blijft tot één regel.

Voorbeeld:

1,362,405,405   12%   1.78MB/s   0:12:28 (xfr#50785, ir-chk=244722/300517)

Voorbeeld als de switch -h (human-readable) is gespecificeerd:

1.16G   12%   1.78MB/s   0:12:28 (xfr#50785, ir-chk=244722/300517)
  • 1.16G: Er is voor 1,16GB gesynchroniseerd
  • 12%: Van de geschatte totale hoeveelheid data, is nu 12% gesynchroniseerd. Dat is hier de eerdegenoemde 1,16GB. Naar het zich laat aanzien, betreft deze hele transfer dus zo'n 9,67GB. Let op: Het lijkt erop, dat rsync niet inventariseert om hoeveel data of bestanden het gaat, voorafgaand aan een transfer. Daarom kan dit getal alle kanten opgaan, als blijkt dat het om meer of minder bestanden gaat
  • 1.78MB/s: Synchronisatie gaat met 1,78MB/s
  • 0:12:28: Het proces is al 12min28s bezig. Deze teller loopt gewoon op
  • xfr#50785: 50.785 bestanden zijn gesynchroniseerd
  • ir-chk=244722/300517: Tot op heden zijn er 300.517 bestanden gedetecteerd. Hiervan zijn er 244.722 geverifiëerd (wat dat precies moge inhouden). Gedurende het process zullen aanvankelijk beide getallen toenemen, totdat alle bestanden zijn gedetecteerd. Dan verandert het tweede getal niet meer, en neemt het eerste getal alleen nog af.

Dezefde transfer, bij afloop:

15.31G  99%   10.45MB/s    0:23:17 (xfr#304901, to-chk=0/311914) 

Compressie gedurende transfer

Met de switch -z specificeer je, dat data gedurende transport gecomprimeerd moet worden. Ik vind het vreemd dat dit niet standaard het geval is.

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.

Keep permissions - p-switch

De switch -p behoudt de permissies en overige bestandseigenschappen van mappen en bestanden. Deze switch is opgenomen in de archive-switch -a.

Waarom deze switch belangrijk kan zijn: Normaliter wordt je zelf eigenaar en groep van gekopiëerde bestanden en mappen. Daardoor kan het gebeuren, dat je de doelmappen niet meer kunt lezen (omdat je die daarvoor kon lezen via group, maar nu niet meer), waardoor backups niet compleet zijn. Dit ervoer ik in maart 2021, bij het restoren van een webwinkel.

Migratie eigen server → Cloudways (juli 2021)

Waarschijnlijk is dit het probleem dat in de laatste zinnen hieronder bedoelt wordt, maar voor de zekerheid hier iets uitgebreider:

  • Op een eigen server kan de eigenaar (www-data) alleen lezen en niet schrijven. Group (www-admin) kan ook schrijven. Ik zit in de groep. De webserver is de eigenaar
  • Op een CloudWays-server, moeten de rechten 'normaal' zijn, waarbij ik eigenaar ben
  • Als ik bestanden kopiëer van deze eigen server naar Cloudways, kunnen er op een gegeven moment geen submappen meer worden aangemaakt: Op de oude locatie kon 'eigenaar' niet schrijven. Dus op de nieuwe locatie ook niet.

Oplossing (dit moet gemakkelijker kunnen):

  • Ik maak een complete kopie van de site op bronlocatie. Da's trouwens ook al een hoop gedoe, want bv. WordFence verandert de instellingen voortdurend
  • Kopie: Rechten aanpassen zoals die op de doellocatie zullen zijn. Ihb.: chmod -R u+w * en nog wat
  • Nu kan ik de site kopiëren naar CloudWays.

Archive-swith -a

-a staat voor archive. Het is identiek aan de switches -rlptgoD [3]. Sinds maart 2021 maak ik hier gebruik van bij het maken van backups.

Port number

E.g. - Without port number:

rsync -r wokkel@124.229.129.40:applications/example_nl/public_html/* . --info=progress2

With a non-standard port number (20202 in this example), include -e 'ssh -p 20202' (inclusief -e). E.g.:

rsync -e 'ssh -p 20202' ./test.tmp jeroen@123.45.56.89:/tmp/test.tmp

Zie ook

Bronnen