Hard-link backup

I gamle dage opbevarede man data på bånd fordi det var det billigste. Nu da harddisk er blevet så billige, så kunne man fristes til at lave en backup til harddisk i stedet for.

Har man rigtigt meget diskplads, så bruger man bare rsync og laver en kopi til anden maskine. De mindre bemidlede der har lært om hvad en inkrementalbackup er, vil foretrække kun at lave backup af det der er ændret. Her vil vi give dig en løsning der kræver at du anskaffer dig følgende software:

Programmerne er fri software, så du kan enten anskaffe dem meget billigt, men mere sandsynligt er det dog at allerede har dem installeret på dine computere.

Inden du får løsningen på hvordan du gør, er det væsentligt at du har en idé om hvordan det hele virker. Derfor bliver vi nødt til at gennemgå hvordan et filsystem fungere, og specielt hvad et hard-link kan, og endnu mere hvad det ikke kan.

Den overordnede idé med det hele, er at du en gang dagligt kopiere data fra en maskine, over til en anden. Det du kopiere, er kun de data der er blevet ændret, hvilket programmet rsync selv sørger for. Dernæst skal du dagligt lave en inkremental backup, hvilket blot betyder at du gemmer en kopi af forskellene.

Filsystemet

På et Linux-system var det tidligere almindeligtt at bruge ext2, hvor det idag nok er mere almindeligt med ext3 eller reiserfs. Fælles for dem er dog at de alle supportere hard-links, og så skulle dit system være klar. Når man laver et link fra en fil til en anden, byder det at man får en fil der er præcis magen til, uden at det fylder ekstra på harddisken. Der er to typer links man kan lave, en sym-link og hard-link. Har du haft bare lidt fat i kommando-prompten på Linux, så kender du sikkert allerede sym-links. Hard-links er lidt anderledes, og dem bruger man kun når man ved hvorfor man gør det.

Ved hjælp af en simpel prompt, kan man undersøge hvordan filsystemet i virkeligheden fungere. Her følger nogle eksempler som de uøvede anbefales at prøve, hvor de mere øvede kan nøjes med at læse med. Først opretter vi et sub-dir til at arbejde med, og dernæst en fil til test:

[tyge@hven ~]$ mkdir hardlink
[tyge@hven ~]$ cd hardlink
[tyge@hven hardlink]$ echo "Hello, world\!" > hello
[tyge@hven hardlink]$ ls -l
-rw-rw-r--    1 tyge   backup     13 Jan 31 15:26 hello

Her skulle ikke være så meget nyt for dig, hvor vi har filen hello der er 13 bytes lang, filens ejer er tyge og filadgangen er at alle kan læse den, og brugeren tyge og gruppen backup kan skrive i filen. Når man så laver et hard-link fra hello til en anden fil, sker der en del ting i baggrunden, men knap så mange som hvis man kopiere filen. Har du prøvet at lave links før, vil du nok bruge kommandoen ln, men af pædagogiske årsager bruger vi i stedet cp -l, som gør det samme.

[tyge@hven hardlink]$ cp -l hello world
[tyge@hven hardlink]$ ls -l
-rw-rw-r--    2 tyge     backup         13 Jan 31 15:26 hello
-rw-rw-r--    2 tyge     backup         13 Jan 31 15:26 world

Umiddelbart ser det ikke så underligt ud, lige bortset fra at datoen er den samme, hvilket den ikke ville have været, hvis vi havde kopieret filen. En anden ting er at der står et 2-tal ud for brugernavnet. Det 2-tal betyder at der er 2 inode-links til de data som filen indeholder.

Vi har nu to filer som er meget ens, pånær at de lige har et forskelligt navn. Hvis man nu ændre datoen på den ene fil, så vil den anden nok ikke ændre dato, eller hvad?

[tyge@hven hardlink]$ touch hello
[tyge@hven hardlink]$ ls -l
-rw-rw-r--    2 tyge     backup         13 Dec 31 15:30 hello
-rw-rw-r--    2 tyge     backup         13 Dec 31 15:30 world

Jo, datoen for filerne er den samme. Det er altså ikke blot indholdet at de to filer der er ens, men også datoen. For fuldstændighedens skyld, er det nok bedst lige at rette filrettighederne, så der ikke er nogen tvivl om at de to filer i virkeligheden kun er en fil:

[tyge@hven hardlink]$ chmod g-w hello
[tyge@hven hardlink]$ ls -l
-rw-r--r--    2 tyge     backup         13 Dec 31 15:30 hello
-rw-r--r--    2 tyge     backup         13 Dec 31 15:30 world

Nu er begge filer kun læsbare for gruppen backup.

Det næste trin er at kunne tage kopier af hele directories. Almindeligvis vil man oprette symbolske links med ln, men da ln ikke klare directories på den rigtige måde, skal der i stedet bruges cp -lr.

Senere skal der laves en backup til current og efterfølgende skal der så laves en hard-link kopi til dags dato. Vi starter lige med en test hvor vi lægger en enkelt fil ned i current og så en cp -lr til dags dato.

[tyge@hven hardlink]$ mkdir current
[tyge@hven hardlink]$ echo "Hello, world\!" > current/hello
[tyge@hven hardlink]$ echo "Hello, world\!" > current/world
[tyge@hven hardlink]$ cp -lr current 2002-12-31
[tyge@hven hardlink]$ ls
2002-12-31/  current/
[tyge@hven hardlink]$ ls -l 2002-12-31 current
2002-12-31:
-rw-rw-r--    2 tyge     backup         13 Dec 31 15:30 hello
-rw-rw-r--    2 tyge     backup         13 Dec 31 15:31 world

current:
-rw-rw-r--    2 tyge     backup         13 Dec 31 15:30 hello
-rw-rw-r--    2 tyge     backup         13 Dec 31 15:31 world

Der er nu en komplet kopi af current over i 2002-12-31, uden at det fylder ekstra på harddisken.

Hvis denne brug af hard-link skal foregå automatisk, så er det mere bevendt at systemet selv finder ud af hvilken dato det er idag. Derfor oprettes sub-dir med en process substitution, såsom:

[tyge@hven hardlink]$ cp -lr current $(date -I)

Når vi så går videre til næste dag, og der så er blevet rettet i filen hello på den maskine der tages backup af, så kommer kopieringen til at foregå ved at filen i current først bliver slettet, og dernæst erstattet med en ny. Dette kan man simpelt simulere på kommandolinjen med følgende kommandoer:

[tyge@hven hardlink]$ rm -f current/hello
[tyge@hven hardlink]$ ls -l 2002-12-31 current
2002-12-31:
-rw-rw-r--    1 tyge     backup         13 Dec 31 15:30 hello
-rw-rw-r--    2 tyge     backup         13 Dec 31 15:31 world

current:
-rw-rw-r--    2 tyge     backup         13 Dec 31 15:30 world
[tyge@hven hardlink]$ echo "Hello, world\!" > current/hello
[tyge@hven hardlink]$ cp -lr current 2003-01-01
[tyge@hven hardlink]$ ls -l 2002-12-31 2003-01-01 current
2002-12-31:
-rw-rw-r--    1 tyge     backup         13 Dec 31 15:30 hello
-rw-rw-r--    3 tyge     backup         13 Dec 31 15:31 world

2003-01-01:
-rw-rw-r--    2 tyge     backup         13 Jan 01 11:03 hello
-rw-rw-r--    3 tyge     backup         13 Dec 31 15:31 world

current:
-rw-rw-r--    2 tyge     backup         13 Jan 01 11:03 hello
-rw-rw-r--    3 tyge     backup         13 Dec 31 15:31 world

Se godt på ovenstående og bemærk at hello fra 2002-12-31 kun har 1 hard-link. world er ikke blevet ændret, så den har nu 3 hard-links. Den nye fil hello er den samme både i current og 2003-01-01, så den har 2 hard-links. Der er så nu 2 versioner af hello, og diskforbruget er nu blevet forøget med den nye version.

Der er dog lige et enkelt minus ved hard-links: de kan ikke gå fra en disk til en anden. Det hele skal foregå på samme disk.

Du skulle nu have forstået de grundlæggende principper der ligger bag en hard-link, således at du efterfølgende ikke kommer til at rette i en fil, endsige blot ændre datoen på den, uden at være helt klar over hvad du gør.

MEN HUSK at du må aldrig rette i de filer der er i gamle directories. Når disse er hard-linket, så retter du en masse steder samtidigt. Du kan slette en backup og du kan tage en kopi tilbage på den oprindelige maskine, men aldrig rette i filerne.

rsync

rsync er lidt specielt program, der ikke bare kopiere en fil krypteret henover nettet, men det har også nogle bivirkninger som kan udnyttes til at lave en inkremental backup.

Når man kopiere en fil med rsync, bliver den gamle fil ikke overskrevet, før den nye er helt intakt. Hvis man kopiere en meget stor fil der tager lang tid, kan man nå og gå ind se at filen optræder som en skjult fil, fx .hello.2345 . Når filen er kopieret over slettes den gamle fil, og nye fil skifter navn til det rigtige navn. Sideeffekten er at den fil der hard-linket har stadig link til de oprindelige data, og sletning af den ene hello betyder ikke at den gamle hello mister sin data-block.

rsync bruges nogenlunde som cp, hvor der dog er lidt flere options der skal sættes. Der skal angives hvilken maskine der kopieres fra, samt hvilken der kopieres til. Hvis det er den maskine man sidder på der skal kopieres til, behøver man ikke angive det. Skille-tegnet til det hele er : (colon).

[tyge@hven ~]$ cd /home/backup/saltholm.sslug.dk
[tyge@hven saltholm.sslug.dk]$ rsync saltholm.sslug.dk:/etc current/

Skal backup foregå automatisk, så skal klienten sættes op således at man kan logge ind på den uden brug af password. rsync skal også have en del parametre for at det hele sker som det skal.

Skal ikke bare slutte her, og så sige at det er meget nemmere hvis du bare anskaffer dig ALbackup og installere den. ALbackup klare både det med rsync og hard-link.

Denne artikel skrevet af Hans Schou. Ole Tange har givet inspiration og instruktion til at skrive artiklen.