Een backup van het systeem maken met rdiff-backup

rdiff-backup is een programma om je bestanden te 'backuppen' (het kan op verschillende *nix-porten gedraaid worden).

Voer de commando's in als root in de konsole, tenzij anders vermeld.

*het is geschikt om misgelopen dist-upgrades, kernel-upgrades enz te herstellen (trouwens ook prima om individuele bestanden terug te halen).
*het maakt alleen een backup van wat er veranderd is, zoals rsync dat doet (dus iedere backup neemt maar weinig tijd in beslag).
*het houdt bij wat er verandert (dat betekent dat je een bestand kunt terug halen dat je drie weken geleden verwijderd hebt!).
*het maakt veilige backups over een netwerk (gebruikt daarbij ssh)
*het maakt een backup van partities terwijl ze gemount (aangekoppeld) zijn. (dus het is erg makkelijk om een dagelijkse backup in te stellen ... umounten (ontkoppelen) is niet nodig).
*het kan alles herstellen als je harde schijf over de kop gaat en je een nieuwe moet kopen.
*het past zich aan om backups te maken ook binnen grotere netwerken (linux doet het hier goed, windows is moeilijker) en wordt gebruikt in het bedrijfsleven.
*het is een command-line applicatie, dus het is zeer geschikt als je ervan houdt om dingen als automatische backups op een krachtige manier te doen (bijvoorbeeld een bash script dat aangeroepen wordt door cron).
*het herinnert zich en gaat om met bestandseigendom en -permissie, en ook met symbolische links (en dat soort zaken), zodat je als je iets herstelt of terughaalt, dat precies zo terugkrijgt als het was.

Wat je nodig hebt

rdiff-backup bewaart een volledige (uncompressed) kopie van de files waar je een backup van maakt, en ook een geschiedenis (incremental backups). Dit betekent dat de ruimte die je gebruikt om backups te maken groter moet zijn dan die waar je een backup van maakt. Als je een backup maakt van 100 gig, heb je daar misschien wel 120 gig voor nodig (bij voorkeur op een aparte schijf!).

Hoe je het moet instellen

Laten we zeggen dat er het volgende in je pc zit:
* een harde schijf van 100 gig (sda) die in gebruik is, met koppelpunten (mounts): sda1 voor de root partitie, en sda5 om muziek en andere bestanden op te slaan, en sda6 voor swap (wisselheugen).
* een lege harde schijf van 200 gig (sdb), die niet gebruikt wordt, met één koppelpunt (mount) op sdb1 .... deze gebruiken we om onze backup op te maken.
* IP addres 192.168.0.1

Het eerste wat je moet doen is rdiff-backup installeren:

# apt-get install rdiff-backup

Hoewel je van iedere directory een backup kunt maken, gaan we er hier van uit dat je een backup maakt van een hele partitie ... je wilt een backup maken van sda1 en sda5 (en niet van sda6), en dus maak je een paar directories aan waar je je data op gaat slaan:

# mkdir -p /media/sdb1/rdiff-backups/192.168.0.1/root
# mkdir -p /media/sdb1/rdiff-backups/192.168.0.1/sda5

Je hebt een eigen IP adres nodig voor als je deze computer wilt gebruiken om ook een backup te maken vanaf een andere computer (dit wordt later behandeld).

Het maken van een backup

rdiff-backup gebruikt de syntax rdiff-backup source-dir dest-dir. Opmerking: specificeer altijd de namen van directories, niet van bestanden.

Om een backup te maken van sda5, doe het volgende:

# rdiff-backup /media/sda5 /media/sdb1/rdiff-backups/192.168.0.1/sda5

En om een backup van de root-partitie te maken, doe je:

# rdiff-backup --exclude '/tmp/*' --exclude '/proc/*' --exclude '/sys/*' --exclude '/media/*/*' / /media/sdb1/rdiff-backups/192.168.0.1/root

Alle "AF_UNIX path too long" foutmeldingen kun je negeren.
Het kan allemaal een tijdje duren omdat dit de eerste keer is dat er een backup van de partitie gemaakt wordt. rdiff-back maakt dus een backup van de hele partitie (niet alleen van de verschillen). Merk op dat je niet van alles een backup wilt maken: niet van /tmp omdat deze altijd verandert; niet van /proc of /sys omdat hier geen echte bestanden op staan; bovendien willen we ook geen backup van mounts (koppelpunten), zoals in /media - als je daar wel een backup van maakt, doe je dat in dit geval van sdb1 en kom je terecht in een eeuwige 'loop'. Een manier om daaraan te ontkomen is om van de (andere) mounts een aparte backup te maken.

Je voert '/proc/*' in in plaats van alleen '/proc' omdat hierdoor slim genoeg wel een backup gemaakt wordt van de directorienaam /proc, maar alles in de directory met rust laat. Hetzelfde geldt voor /tmp, /sys en nog bijdehanter: alle namen van de koppelpunten (mountpoints).

Als je dus je rootpartitie vernietigt en een volledig herstel uitvoert zullen de directorienamen: /tmp, /proc, /sys, en de mountpoints aangemaakt worden (zoals dat ook hoort). Als /tmp niet bestaat terwijl X opstart, zou deze daarover kunnen klagen. Daardoor werkt deze mogelijk dan niet. Zie voor meer informatie de handleiding over: --exclude en --include).

Directories herstellen vanaf backups

rdiff-backup gebruikt dee syntax:

rdiff-backup -r <from-when> <source-dir> <dest-dir>

Als je nu per ongeluk de directorie /media/sda7/foto's verwijderd hebt, kun je dit herstellen door het volgende in te voeren:

# rdiff-backup -r now /media/sdb1/rdiff-backups/192.168.0.1/sda5/foto's /media/sda5/foto's

De optie "-r now" betekent: herstel vanaf de laatste backup. Als je van alles periodiek een backup maakte (laat we zeggen met crontab), en je je tot een paar dagen terug niet realiseerde dat de foto's directorie ontbrak, zou je een backup van een paar dagen eerder moeten gebruiken (en niet "now", aangezien de laatste backup aangeeft dat de foto's directorie ontbreekt). Misschien wil je ook wel gewoon om wat voor reden dan ook teruggaan naar een eerdere versie of iets dergelijks.

Als je iets wilt herstellen van drie dagen terug, gebruik dan "-r 3D" ... maar, zoals de handleiding aangeeft, let hier dan wel even op:

"3D" refereert aan de onmiddellijke 72 uur vóór het huidige moment, en als er toen geen backup gemaakt is, herstelt rdiff-backup de situatie zoals die met de backup daarvóór vastgelegd is. Bijvoorbeeld in bovengenoemd situatie: als "3D" gebruikt wordt en er zijn alleen backups van 2 en 4 dagen geleden, dan wordt de directorie teruggezet zoals die 4 dagen geleden was (dus denk daar even aan als je een herstel wilt uitvoeren).

Het volgende commando zal de data en tijdstippen weergeven waarop de backups van sda5 werden uitgevoerd:

# rdiff-backup -l /media/sdb1/rdiff-backups/192.168.0.1/sda5
Partities herstellen

Je kunt ook hele partities (mounts) terugzetten, tenslotte is een mount point (koppelpunt) eigenlijk gewoon een directorie.

WAARSCHUWING: Herstel je root-partitie niet als je erin geboot bent! Met één commando verlies je alle bestanden op al je partities, ook alle backups die op een aparte schijf staan!!
rdiff-backup doet precies waarvoor het opdracht krijgt ... als de backup voor de root-partitie lege mount points (koppelpunten) heeft, dus om de situatie te herstellen naar hoe die was, verwijdert diff-backup alles in de mounts.

Om sda5 terug te zetten van de laatste backup, doe je gewoon:

# rdiff-backup -r now /media/sdb1/rdiff-backups/192.168.0.1/sda5 /media/sda5
De root-partitie herstellen

Maar de root-partitie terugzetten is minder simpel. Zet de root-partitie niet terug, zolang deze aangekoppeld is (zie daarvoor de waarschuwing hierboven).
Het kan echt nuttig zijn om de root-partitie te herstellen. Als je onder het installeren/upgraden de zaak verprutst of de boel verpest bij het installeren van een nieuwe kernel, kun je met een gerust hart alles terugdraaien naar hoe je het had. Dat kost je maar 20 minuten.

Een van de manieren om een root-partitie te herstellen is, om in een ongebruikte linux-partitie te booten - als je er één op je harde schijf hebt. Dan kun je elke partitie herstellen die je maar wilt, aangezien die dan niet gemount is als root. Boot erin, nadat je die partitie hersteld hebt, en alles is precies hetzelfde als wanneer je een backup had gebruikt - precies hetzelfde! Deze manier is verreweg de makkelijkste.

Een andere manier om je root-partitie te herstellen is om de aptosid live cd te gebruiken en vanaf de live cd de zaak te herstellen. rdiff-backup staat erop. Mocht die niet staan op de aptosid live cd versie die jij gebruikt, dan kun je in grub (bootoptions, (Cheatcodes)) de cheatcode "unionfs" typen - dat houdt in dat je applicaties op je live cd kunt installeren. Boot gewoon en type de volgende commando's:

$ sudo su
# wget -O /etc/apt/sources.list http://aptosid.com/files/misc/sources.list
# apt-get update
# apt-get install rdiff-backup
Ok, nu gaan we herstellen:
# mount /dev/sda1 /media/sda1
# mount /dev/sdb1 /media/sdb1
# rdiff-backup -r now /media/sdb1/rdiff-backups/192.168.0.1/root /media/sda1

NB: Als je geen aptosid cd hebt maar je gebruikt een livecd met 'klik' ondersteuning, dan kun je rdiff-backup installeren door 'klik' te gebruiken en dan het volgende aan te roepen:

$ sudo ~/.zAppRun ~/Desktop/rdiff-backup_0.13.4-5.cmg rdiff-backup -r now /media/sdb1/rdiff-backups/192.168.0.1/root /media/sda1

Het is raadzaam om het herstelproces te controleren als je van je root-partitie een backup maakt (met de bedoeling een herstel uit te voeren als dat nodig is). Niets ergers dan denken dat alles in orde zal komen en dan iets onverwachts tegenkomen in een noodsituatie.

If the hard drive has been changed or reformatted, recheck the UUIDs, (or Labels), in /boot/grub/menu.lst (grub-legacy) or files in /etc/grub.d (grub2) and /etc/fstab, and alter accordingly. An easy way to get the information to alter the menu.lst and fstab files, if required, is as root:

blkid
Een backup maken van andere pc's

Je kunt ook een backup maken van andere pc's op je eigen pc. Voorwaarde is wel dat je eigen pc gebruik kan maken van het ssh-protocol naar de bedoelde pc-op-afstand - en je moet natuurlijk genoeg opslagcapaciteit hebben op je eigen pc. De ssh-server moet op die andere pc draaien. Hij hoeft niet in je lokale LAN te staan - hij mag overal op de wereld zijn.

Laten we ervan uitgaan dat je andere pc over het volgende beschikt:
1) een 100 gig harde schijf (sda) die in gebruik is en waarbij alles dus is aangekoppeld,
2) sda1 gebruikt voor de root-partitie,
3) sda5 gebruikt voor het opslaan van een paar tijdelijke gegevens waar we geen backup van willen maken,
4) en sda6 als swap
5) IP addres 192.168.0.2

NB: van alletwee de 100 gig schijven kan normaal gesproken niet een backup gemaakt worden op een 200 gig grote harde schijf, als je rdiff-backup gebruikt (dit omdat er dan geen plek is voor de zogenaamde 'incremental files'). Aangezien je geen backup maakt van sda5 van je pc-op-afstand en trouwens ook omdat normaal gesproken je harde schijf niet voor de volle 100% vol zit, kun je er vanuit gaan dat je genoeg ruimte hebt voor een backup. Het is wel zo dat elke keer dat je met rdiff-backup een backup maakt er meer van die zogenaamde 'incremental files' aangemaakt worden. Deze nemen dus meer en meer plek in beslag.

Je kunt rdiff-backup opdracht geven om slechts backups van een maand oud te bewaren (dat commando geven we je hier verderop), en dat neemt natuurlijk lang niet zoveel ruimte in beslag dan backups over de periode van ene jaar. Daarnaast .... als je over ene periode van ene jaar backups bewaart dan horen daar ook weer de nodige 'incremental files' bij.

Het eerste dat je moet doen is rdiff-backup op de pc-op-afstand te installeren (op elke pc waarvan je een backup wil maken en ook op de pc die als backup-server dienst doet moet rdiff-backup staan.)

Om een backup te maken van de pc-op-afstand op jouw pc (192.168.0.1), voer je het volgende in: Let op het gebruik van twee keer de dubbele punt ::

# mkdir /media/sdb1/rdiff-backups/192.168.0.2/root
# rdiff-backup --exclude '/tmp/*' --exclude '/proc/*' --exclude '/sys/*' --exclude '/media/*/*' 192.168.0.2::/ /media/sdb1/rdiff-backups/192.168.0.2/root

Als je nou een directory wil herstellen op je pc-op-afstand, begin dan de 'restore' op of je eigen pc of op de pc-op-afstand.

Zo herstel je de directory /usr/local/games op je pc-op-afstand, vanaf die pc:

# rdiff-backup -r now 192.168.0.1::/media/sdb1/rdiff-backups/192.168.0.1/root/usr/local/games /usr/local/games

Zo herstel je de directory /usr/local/games op je pc-op-afstand, vanaf je eigen pc:

# rdiff-backup -r now /media/sdb1/rdiff-backups/192.168.0.1/root/usr/local/games 192.168.0.2::/usr/local/games

Gebruik dezelfde syntax als je je root partitie herstelt vanaf een live cd (de pc-op-afstand is dan wel met een live cd opgestart ... zie hierboven).

Automatische backups:

Als je backups maakt van andere pc's op je lokale pc, is het eerste dat je moet doen wachtwoordloze ssh logins mogelijk maken, gebruikmakend van ssh-keys. Let er op dat we het hier heben over wachtwoordloze ssh-logins als 'root'. Dit kun je zo inperken dat alleen rdiff-backup commando's zo uitgevoerd worden. - maar dit valt buiten de scope van dit topic. Ik verwijs daarom naar de SSH Configuration . We gaan uit van volledig vertrouwen en we zetten hier de eenvoudigste manier op van hetr verkrijgen van wachtwoordloze logins.

Doe het volgende vanaf je lokale pc:

# [ -f /root/.ssh/id_rsa ] || ssh-keygen -t rsa -f /root/.ssh/id_rsa

En dan twee keer 'enter' voor lege wachtwoorden. Daarna doe je:

# cat /root/.ssh/id_rsa.pub | ssh 192.168.0.2 'mkdir -p /root/.ssh;\
> cat - >>/root/.ssh/authorized_keys2'

Je zult om je root-wachtwoord gevraagd worden:

Je kunt nu naar de pc-op-afstand ssh-en als root zonder een wachtwoord te hoeven invoeren, en rdiff-backup kan nu geautomatiseerd worden.

Maak tenslotte een bash-script dat alle rdiff-backup commando's bevat. Dat van ons ziet er dan ongeveer zo uit:

#!/bin/bash
RDIFF=/usr/bin/rdiff-backup
echo
echo "=======Backing up 192.168.0.1 root======="
${RDIFF} --ssh-no-compression --exclude '/tmp/*' --exclude '/proc/*'\
 --exclude '/sys/*' --exclude '/media/*/*'\
 / /media/sdb1/rdiff-backups/192.168.0.1/root
echo "(and purge increments older than 1 month)"
${RDIFF} --remove-older-than 1M\
 --force /media/sdb1/rdiff-backups/192.168.0.1/root
echo
echo "=======Backing up 192.168.0.1 mount sda5======="
${RDIFF} --ssh-no-compression --exclude /media/sda5/myjunk /media/sda5\
 /media/sdb1/rdiff-backups/192.168.0.1/sda5
echo "(and purge increments older than 1 months)"
${RDIFF} --remove-older-than 1M\
 --force /media/sdb1/rdiff-backups/192.168.0.1/sda5
echo
echo "=======Backing up 192.168.0.2 root======="
${RDIFF} --ssh-no-compression --exclude '/tmp/*' --exclude '/proc/*' --exclude '/sys/*' --exclude '/media/*/*' --exclude '/mnt/*/*' 192.168.0.2::/media/sdb1/rdiff-backups/192.168.0.2/root
echo "(and purge increments older than 1 months)"
${RDIFF} --remove-older-than 1M\
 --force /media/sdb1/rdiff-backups/192.168.0.2/root

Je kunt dit bash-script nu "myrdiff-backups.bash" noemen en het in de /usr/local/bin plaatsen op je lokale (backup-server) machine, en het uitvoerbaar maken. Start het script en overtuig je ervan dat het goed werkt.

Tenslotte kun je 'cron' gebruiken om het elke avond om 8 uur te laten draaien. De hieronder weergegeven regel in de 'crontab' van de 'root' doet het hem:

# crontab -e
en voeg de volgende regel toe:
0 20 * * * /usr/local/bin/myrdiff-backups.bash
Inhoud het laatst gewijzigd op 14/08/2010 0100 UTC