Opret sikkerhedskopier med rdiff-backup

rdiff-backup er et værktøj til at oprette sikkerhedskopier af dine filer med. (det kan køre på flere *nix systemer).

Du skal køre alle kommandoerne som root i konsollen/ terminalen, -medmindre andet er angivet

* fantastisk til at redde dist-upgrades eller kernel-upgrades, der gik grueligt galt, osv. (og kan også bruges til bare at genskabe personlige filer).

* sikkerhedskopierer kun det der er ændret siden sidst, ligesom rsync gør (så hver backup går hurtig).

* indeholder oversigt over ændringer (history of changes) (så du kan genskabe en fil du slettede for 3 uger siden!)

* kan udføre sikre sikkerhedskopieringer over nettet (med ssh).

* Sikkerhedskopierer partitioner imens de er monterede (så deter nemt at automatisere en daglig sikkerhedskopi...ingen brug for at afmontere).

* kan gendanne alt hvis din harddisk står af, og du skal købe en helt ny.

* scales to backup large networks (problemløst i linux netværk, Windows-netværk er mere komplekst at arbejde med) og bruges af firmaer.

* kommandolinie drevet program, perfekt for dem der kan lide at udføre ting som automatiseret sikkerhedskopi på den 'stærkeste' måde (bash script der kaldes af cron).

* husker og håndterer fil-ejerskab og -tilladelser, kan også håndtere symbolske links (og andet i den dur), så når du gendanner, så er tingene nøjagtigt som de var.

Hvad skal du bruge

rdiff-backup gemmer en komplet (ikke komprimeret) kopi af filerne som du sikkerhedskopierer, og den gemmer også en oversigt over ændringerne (incremental backups), dette betyder at pladsen til dine sikkerhedskopier skal være større end det du gerne vil lave sikkerhedskopierne af. Så hvis du vil sikkerhedskopiere 100 GB kan det være at du skal bruge helt op til 120 GB (på en separat harddisk, om muligt!).

Opsætning

lad os antage at din maskine har det følgende:
* en 100 gb harddisk (sda) i anvendelse, hvor monteringspunkterne sda1 er root partitionen, sda5 bruges til at gemme musik og andre filer, og sda6 er swap partitionen.
* en overskydende 200 gb harddisk (sdb) som du ikke bruger endnu, med et monteringspunkt sdb1 ... den vil vi bruge til vores sikkerhedskopier.
* IP addressen 192.168.0.1

Det første du skal gøre er at installere rdiff-backup:

# apt-get install rdiff-backup

Selv om du sagtens kan tage backups af enkelte mapper er denne guide møntet på at sikkerhedskopiere hele partitioner... vi vil sikkerhedskopiere sda1 og sda5 (vi vil ikke tage en backup af sda6), og derfor skal vi have oprettet nogle mapper til vores data:

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

Du skal specificere IP-adressen fordi det er denne maskine du vil oprette en sikkerhedskopi fra (og senere vil vi se på hvordan du også opretter sikkerhedskopier fra andre maskiner på netværket).

Oprette sikkerhedskopier

rdiff-backup bruger syntaksen rdiff-backup source-dir dest-dir. OBS: du skal altid angive mappenavne, ikke filnavne.

For at sikkerhedskopiere sda5, kør:

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

Og for at sikkerhedskopiere root partitionen, kør:

# 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" fejl kan ignoreres. Det kan tage lidt tid hvis det er første gang der oprettes sikkerhedskopi af denne partition, idet rdiff-backup så skal kopiere hele partitionen (ikke bare ændringerne). Bemærk at vi ikke inkluderer /tmp, eftersom dette hele tiden ændres, heller ikke /proc eller /sys eftersom de ikke indeholder rigtige filer, og vi vil heller ikke kopiere monteringer (mounts). Hvis du vælger at sikkerhedskopiere monteringer, så kopierer du sdb1 og det kan føre til en endeløs løkke (infinite loop!). En måde at omgå dette på er at sikkerhedskopiere monteringer separat.

Grunden til at du udelader '/proc/*' og ikke bare '/proc' er at dette på snedig vis vil tage en sikkerhedskopi af mappen /proc, men udelade alle filerne i den. Det samme gælder for /tmp, /sys, og, allermest listigt, alle monteringspunkternes navne.

På denne måde vil du få genskabt dine /tmp, /proc, /sys og monteringspunkters navne hvis du skulle destruere din root partition og have brug for en fuld gendannelse. Hvis /tmp ikke findes når X starter, brokker X sig muligvis over dette. Se man page for mere omkring --exclude og --include).

Genoprettelse af mapper fra sikkerhedskopier

rdiff-backup bruger syntaksen:

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

Hvis du ved en fejl er kommet til at slette mappen /media/sda7/photos, så gendanner du den med:

# rdiff-backup -r now /media/sdb1/rdiff-backups/192.168.0.1/sda5/photos /media/sda5/photos

Her betyder"-r now" parameteren 'genskab fra sidste sikkerhedskopi'. Hvis du periodisk sikkerhedskopierer alt (via crontab, for eksempel), og du ikke havde opdaget at photos mappen manglede før nogle dage senere, så ville du skulle genskabe den fra en sikkerhedskopi der er nogle dage gammel (og ikke "now", eftersom den seneste sikkerhedskopi ikke indeholder mappen). Eller måske vil du bare gerne tilbage til en tidligere version af noget.

Hvis du vil genskabe systemet som for tre dage siden, så bruger du"-r 3D" ... men, som man page siger, bemærk at:

"3D" henviser til øjeblikket 72 timer før nu. Og hvis der ikke blev taget en sikkerhedskopi på det tidspunkt, så vil rdiff-backup genskabe fra den første tidligere kopi den finder. Hvis for eksempel som ovennævnt, man anvender "3D", og der ikke findes nogen sikkerhedskopi oprettet for 3 dage siden, men der er sikkerhedskopier oprettet hhv. for 2 og for 4 dage siden, da vil rdiff-backup genskabe til tilstanden som den var for 4 dage siden. Du skal altså lige tænke over dette, inden du genskaber noget med rdiff-backup.

Ved at skrive følgende kommando kan du få rdiff til at skrive en liste over datoer og tidspunkter hvor der er blevet oprettet sikkerhedskopier af sda5:

# rdiff-backup -l /media/sdb1/rdiff-backups/192.168.0.1/sda5
Genoprettelse af partitioner

Du kan også genoprette hele partitioner (mounts); når det kommer til stykket er monteringspunkter egentlig blot mapper.

ADVARSEL: Genopret ikke root partitionen (/) mens du er bootet ind i den! Med en kommando vil du miste alle filerne på alle dine partitioner, inklusiv alle sikkerhedskopier på separate harddiske!! rdiff-backup gør nemlig det du siger den skal gøre ... hvis din sikkerhedskopi for root partitionen har tomme monteringspunkter, så vil rdiff-backup slette alt hvad der er i monteringspunkterne for at få dem genoprettet til tilstanden i sikkerhedskopien.

For at genoprette sda5 fra den sidste sikkerhedskopi, skriver vi:

# rdiff-backup -r now /media/sdb1/rdiff-backups/192.168.0.1/sda5 /media/sda5
Genoprettelse af root partitionen

Dette er ikke helt simpelt. Forsøg aldrig på dette hvis partitionen er monteret (se ovenstående advarsel). Det er enormt nyttigt at kunne genoprette root partitionen, eftersom hvis noget går galt med installation/afinstallation eller kernel-upgrades, så kan du med fred i sindet bare gendanne systemet til en tidligere tilstand i løbet af kun 20 minutter.

En måde at genoprette en root partition på er ved at boot ind i en overskydende linux partition, hvis du har en såden på din maskine. Herfra vil du være i stand til at genskabe din root partition da den så ikke vil være monteret som root. Når du igen booter ind i den vil partitionen være præcis som da du tog en sikkerhedskopi af den. Dette er langt den nemmeste metode til at gendanne root partitionen.

En anden måde er genoprette root partitionen på er ved at opstarte med aptosid live-CD'en og udføre kommandoen derfra. rdiff-backup er inkluderet i aptosid. I det tilfælde at den version du har af aptosid CD'en ikke inkluderer rdiff, kan du anvende cheatcoden "unionfs" i Grubs kommandolinie, den betyder at du så kan installere yderligere software mens du kører live-CD'en. Boot Live-CD'en med denne cheatcode og udfør følgende kommandoer:

$ sudo su
# wget -O /etc/apt/sources.list http://aptosid.com/files/misc/sources.list
# apt-get update
# apt-get install rdiff-backup
Lad os så genoprette:
# 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

OBS: Hvis du ikke har en aptosid-CD kan du benytte en anden Live-CD hvis denne understøtter installation via 'klik'. Du kan så installere rdiff-backup med Klik og kalde:

$ 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

Det anbefales alle, der opretter en sikkerhedskopi af root partitionen (med den intention at genoprette fra den), at de tester processen med genopretning fra sikkerhedskopien. Der er næsten intet der er værre, end at tro at den hellige grav er velforvaret, for så at få sig en ubehagelig overraskelse når uheldet virkelig er ude.

Hvis harddisken er blevet ændret eller reformatteret skal du sikre dig at UUID'erne stadig passer (eller Labels hvis du bruger dem). Det gør du ved at se i /boot/grub/menu.lst (grub-legacy) eller på filerne i /etc/grub.d (grub2) og /etc/fstab. Du skal tilpasse dem hvis det er nødvendigt. En nem måde at få den ønskede information til disse operationer (ændring af menu.lst og fstab filer), hvis krævet, er at køre følgende kommando som root:

blkid
Sikkerhedskopiering af andre maskiner

Du kan sikkerhedskopiere andre maskiner til din lokal-maskine, så længe din lokale maskine kan afvikle ssh forbindelser til de andre maskiner (og så længe som du har plads på dine harddiske). ssh server'en (sshd) skal køre på fjern-maskinen. De andre maskiner skal ikke nødvendigvis være i dit LAN, -de kan være placeret hvor som helst i verden.

Lad os antage at fjern-maskinen har følgende:
1) en 100 gb harddisk (sda) som er i brug, med fgl. monteringspunkter,
2) sda1 anvendt som root partition(/),
3) sda5 hvor vi gemmer midlertidige data, som vi ikke vil sikkerhedkopiere,
4) og sda6 som er swap,
5) samt IP-addressen 192.168.0.2

OBS: Begge 100 gb drev kan ikke normalt blive sikkerhedskopieret til en 200 gb harddisk med rdiff-backup (eftersom dette ikke ville efterlade noget plads til ændringer), men eftersom du ikke vil sikkerhedskopiere sda5 på fjern-maskinen (og siden harddiske sjældent er helt fulde, -det kan du dog ikke regne med som standard) så antager vi at du har plads nok. For hver gang rdiff-backup opretter en ny sikkerhedskopi, dannes der flere filer (incremental files), og mere og mere plads anvendes.

Du kan fortælle rdiff-backup at den kun skal gemme den sidste måneds sikkerhedskopier (kommandoen til dette viser vi senere), og dette vil naturligvis gøre at rdiff-backup bruger mindre plads end hvis den skal beholde sikkerhedskopierne fra et helt år.

Først installerer du også rdiff-backup på fjern-maskinen (enhver computer du du vil sikkerhedskopiere fra, inklusiv backup serveren, skal have rdiff-backup installeret).

For at sikkerhedskopiere fjern-maskinen til lokal-maskinen, kør fgl. på lokal-maskinen (ie 192.168.0.1): Bemærk anvendelsen af dobbelt kolon ::

# 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

Hvis du vil genoprette en mappe på fjern-maskinen, kan du enten starte processen fra lokal- eller fra fjern-maskinen.

Dette er hvordan du ville genoprette mappen /usr/local/games på fjern-maskinen, ved at initiere det fra fjern-maskinen:

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

Dette er hvordan du ville genoprette mappen /usr/local/games på fjern-maskinen, ved at initiere det fra den lokale maskine:

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

Brug den samme slags syntaks hvis du genopretter din root partition fra en Live-CD (hvor fjern-maskinen er booted op med Live-CD... se ovenstående).

Automatisering af sikkerhedskopiering:

Hvis du sikkerhedskopierer fra en anden maskine til din egen lokale maskine, så er det første du skal gøre at aktivere password-frie ssh logins med ssh keys. Bemærk at der menes password-frie ssh-logins som root. Dette kan indskrænkes såldes at der kun kan udføres kommandoer til rdiff-backup, men det er uden for denne sides område, se venligst SSH Configuration. Vi antager at der er fuldstændig tillid, og viser den mest simple måde hvorpå man kan opsætte password-frie ssh logins.

Fra den lokale maskine gør du følgende:

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

Og tryk retur to gange for blanke passwords. Så gør du:

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

Der vil blive spurgt efter dit root password.

Nu kan du ssh til fjern-maskinen som root uden at skulle skrive et password, og rdiff-backup kan automatiseres.

Som det næste skal du oprette et bash script der indeholder alle rdiff-backup kommandoerne. Vores bash script kan ligne det følgende eksempel:

#!/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

Nu kan du ændre navnet af dette bash script til "myrdiff-backups.bash" og flytte det til /usr/local/bin på din lokale (backup server) maskine, og ændre det til at kunne køres. Kør script'et for at sikre dig at det virker.

Til sidst kan du få cron til at kalde det hver aften klokken 20. Den følgende linie i root's crontab vil sørge for dette, kald

# crontab -e
og indsæt følgende linie
0 20 * * * /usr/local/bin/myrdiff-backups.bash
Content last revised 14/08/2010 0100 UTC