Rsync: Lista med mappar för Compare-dest [LÖST]

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Majo
Inlägg: 48
Blev medlem: 26 feb 2008, 19:41
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Rsync: Lista med mappar för Compare-dest [LÖST]

Inlägg av Majo »

Enligt man-sidan för rsync kan man sedan version 2.6.4 använda multipla mappar att jämföra med när man använder Compare-dest. Är det nån som vet hur en sådan lista ska formateras? Ungefär så här har jag tänkt:

Kod: Markera allt

FOLDERLIST=här ska det vara en lista med mappar, men hur?
rsync -aq --compare-dest=$FOLDERLIST $SOURCEDIR $TARGETDIR
Syftet är att kuna köra inkrementella backuper som jämförs mot en tidigare fullbackup och alla inkrementella backuper sedan fullbackupen gjordes. Listan med mappar ska alltså skapas dynamiskt efter datum och allt det har jag löst så tillvida att det fungerar om man i stället anger bara en mapp att jämföra med för compare-dest. Men hur skriver man en lista? Blir bara fel hur jag än gör...
Senast redigerad av 1 Majo, redigerad totalt 22 gånger.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Rsync: Lista med mappar för Compare-dest

Inlägg av Konservburk »

Killen som skrivit den patchen kom med följande exempel:
Vidar Madsen skrev: First full backup:

Kod: Markera allt

rsync -a somedir full-20040415/
First incremental:

Kod: Markera allt

rsync -a --compare-dest=../full-20040415 somedir incr-20040416/
Second incremental, on top of first:

Kod: Markera allt

rsync -a --compare-dest=../incr-20040416 --compare-dest=../full-20040415 somedir incr-20040417/
The args must be given in the correct order; Latest incremental first, last resort last.
Majo
Inlägg: 48
Blev medlem: 26 feb 2008, 19:41
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Re: Rsync: Lista med mappar för Compare-dest

Inlägg av Majo »

Konservburk skrev:Killen som skrivit den patchen kom med följande exempel:

Kod: Markera allt

rsync -a --compare-dest=../incr-20040416 --compare-dest=../full-20040415 somedir incr-20040417/
The args must be given in the correct order; Latest incremental first, last resort last.
[/quote]

Jo, precis så där har jag skrivit. Compare-dest fungerar fint i den första inkrementella backupen, när man jämför mot enenda mapp. Men genast när man jämför mot två eller flera, så slutar det att fungera alls - då körs en ny full backup mot mål-mappen istället. Alltså: Om när jag lägger till Compare-dest nummer två, så slutar även nummer ett att fungera.

Nu är jag inte hundra på vilken version av rsync som körs (hur ser man det?), men eftersom det står om möjligheten att lista jämförelsemappar på man-sidan, förutsätter jag att det är en version där det ska fungera.
Majo
Inlägg: 48
Blev medlem: 26 feb 2008, 19:41
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Re: Rsync: Lista med mappar för Compare-dest

Inlägg av Majo »

Nu såg jag att jag var lite för snabb! I ditt exempel så lade man ju mapparna i fallande ordning. Jag testade detta och fick en annan variant på fel... ??? I stället för att kopiera hela fullbackupen en gång till så kopierades förviss de nya filerna, men även de som ligger i de tidigare inkrementella backuperna. På det viset blir det ju meningslöst att jämföra mot fler mappar än den första fullbackupen.
Något är alltså fortfarande fel, frågan är vad?
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Rsync: Lista med mappar för Compare-dest

Inlägg av Konservburk »

Jag tror inte riktigt jag förstår vad du menar. Vi tar ett exempel så kanske det klarnar lite:

Kod: Markera allt

mkdir live
touch live/a live/b live/c
rsync -a live/ 0
sleep 1
touch live/a
rsync -a --compare-dest=../0 live/ 1
sleep 1
touch live/b
rsync -a --compare-dest=../1 --compare-dest=../0 live/ 2
Och så kollar vi vad som har hänt:

Kod: Markera allt

$ ls 0 1 2 live
0:
a  b  c

1:
a

2:
b

live:
a  b  c
Jag tycker det ser rätt ut.
Majo
Inlägg: 48
Blev medlem: 26 feb 2008, 19:41
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Re: Rsync: Lista med mappar för Compare-dest

Inlägg av Majo »

Konservburk skrev:Jag tror inte riktigt jag förstår vad du menar. Vi tar ett exempel så kanske det klarnar lite:

Kod: Markera allt

mkdir live
touch live/a live/b live/c
rsync -a live/ 0
sleep 1
touch live/a
rsync -a --compare-dest=../0 live/ 1
sleep 1
touch live/b
rsync -a --compare-dest=../1 --compare-dest=../0 live/ 2
Och så kollar vi vad som har hänt:

Kod: Markera allt

$ ls 0 1 2 live
0:
a  b  c

1:
a

2:
b

live:
a  b  c
Jag tycker det ser rätt ut.
Tack för att du engagerar dig, men tyvärr hänger jag inte riktigt med. Jag kanske borde sagt att jag är nybörjare av värsta sorten på Linux, Ubuntu och bash-scriptning... :-[
Jag kan visa det jag totat ihop, så kanske du förstår. Det är det script som ska sköta den inkrementella backupen, via cron varje natt. Lagring sker roterande i månadsintervall. Ett annat script ska köras varje månadsskifte och köra en full backup. Jag har testat följande:

Kod: Markera allt

rsync --compare-dest=../Fullbackup Sourcemapp Targetmapp_datum1
(Fungerar som tänkt - bara nya och ändrade filer jämfört med Fullbackup lagras i targetmapp_datum1)

Kod: Markera allt

rsync --compare-dest=../Fullbackup --compare-dest=../Targetmapp_datum1 Sourcemapp Targetmapp_datum2
(Här borde alltså bara nya filer läggas i Targetmapp_datum2, men filerna i Targetmapp_datum1 ignoreras - alltså lagras allt nytt efter Fullbackup här)
Inget större problem med en backup som roterar på två-tre dagar, men om man roterar en hel månad blir ju det en massa onödigt kopierande och lagringsutrymme i kubik som går åt.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Rsync: Lista med mappar för Compare-dest

Inlägg av Konservburk »

Du säger att det inte fungerar? Men jag tyckte att det verkade funka precis som du ville ha det:

* Du har orginalet som ska backupas
* Du gör en full_backup av orginalet

Kod: Markera allt

rsync -a orginalet/ full_backup
* Du ändrar på och lägger till nya filer till orginalet
* Du gör en ny_backup bestående av alla filer i orginalet som inte redan finns i full_backup

Kod: Markera allt

rsync -a --compare-dest=../full_backup orginalet/ ny_backup
* Du ändrar åter på och lägger till nya filer till orginalet
* Du gör en nyare_backup bestående av alla filer i orginalet som varken redan finns i ny_backup eller full_backup

Kod: Markera allt

rsync -a --compare-dest=../ny_backup --compare-dest=../full_backup orginalet/ nyare_backup
Så vad är du missnöjd med?
Majo
Inlägg: 48
Blev medlem: 26 feb 2008, 19:41
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Re: Rsync: Lista med mappar för Compare-dest

Inlägg av Majo »

Konservburk skrev:Du säger att det inte fungerar? Men jag tyckte att det verkade funka precis som du ville ha det:
Så vad är du missnöjd med?
Så här:

1) Jag kör en full backup. Filera a, b och c kopieras till FB_DAG1
2) Dag två kör jag en inkremetell backup. Filen d är ny och endast den kopieras till DAG_2 (så långt allt väl)
3) Dag 3: Ny inkremetell backup. Compare-dest kollar först mot FB_DAG1 och sen mot DAG_2. Ny fil är e men tyvärr kopieras både d och e till mappen DAG_3, när rsync med hjälp av compare-dest borde se att d redan finns i DAG_2

4) När hela varvet har gått runt (upp till 31 dagar) ligger alltså filen d i trettio mappar (filen e i 29 mappar, f i 28...etc). Inte min idé om inkrementell backup.

Problemet är att compare-dest fungerar jättebra mot en mapp, men inte mot flera. Förhoppningsvis beror det på att jag gör något fel.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Rsync: Lista med mappar för Compare-dest

Inlägg av Konservburk »

Majo skrev:Ny fil är e men tyvärr kopieras både d och e till mappen DAG_3, när rsync med hjälp av compare-dest borde se att d redan finns i DAG_2

4) När hela varvet har gått runt (upp till 31 dagar) ligger alltså filen d i trettio mappar (filen e i 29 mappar, f i 28...etc). Inte min idé om inkrementell backup.
För mig ser rsync att d redan finns i dag DAG_2 så den kopierar bara e till DAG_3. Det var så du ville ha det, eller hur?

Jag körde med den här testkoden:

Kod: Markera allt

mkdir live
touch live/a live/b live/c
rsync -a live/ DAG_1
touch live/d
rsync -a --compare-dest=../DAG_1 live/ DAG_2
touch live/e
rsync -a --compare-dest=../DAG_2 --compare-dest=../DAG_1 live/ DAG_3
ls DAG_1 DAG_2 DAG_3 live
Resultatet blev:

Kod: Markera allt

DAG_1:
a  b  c

DAG_2:
d

DAG_3:
e

live:
a  b  c  d  e
Om du inte får samma resultat så har du antagligen en annan version av rsync.
Majo
Inlägg: 48
Blev medlem: 26 feb 2008, 19:41
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Re: Rsync: Lista med mappar för Compare-dest

Inlägg av Majo »

Konservburk skrev:
Om du inte får samma resultat så har du antagligen en annan version av rsync.
Ok, tack för allt jobb du lagt ned. Men hur ser jag vilken version av rsync jag har? Och hur uppdaterar jag om versionen är gammal? Med apt-get på nåt sätt, eller?
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Rsync: Lista med mappar för Compare-dest

Inlägg av Konservburk »

Majo skrev:hur ser jag vilken version av rsync jag har?

Kod: Markera allt

$ rsync --version
rsync  version 2.6.9  protocol version 29
Copyright (C) 1996-2006 by Andrew Tridgell, Wayne Davison, and others.
<http://rsync.samba.org/>
Capabilities: 64-bit files, socketpairs, hard links, symlinks, batchfiles,
              inplace, IPv6, 64-bit system inums, 64-bit internal inums

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.
Majo
Inlägg: 48
Blev medlem: 26 feb 2008, 19:41
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Re: Rsync: Lista med mappar för Compare-dest

Inlägg av Majo »

Tack så mycket för all hjälp, Konservburk. Nu har jag fått det hela att rulla.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Rsync: Lista med mappar för Compare-dest

Inlägg av Konservburk »

Nu är jag nyfiken på vad du gjorde för fel förut? Var det bara fel version av rsync, eller var det något annat?
Majo
Inlägg: 48
Blev medlem: 26 feb 2008, 19:41
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Re: Rsync: Lista med mappar för Compare-dest

Inlägg av Majo »

Konservburk skrev:Nu är jag nyfiken på vad du gjorde för fel förut? Var det bara fel version av rsync, eller var det något annat?
Det var flera problem. Dels hade jag inte kläm på hur man formaterade listan av compare-dest. Jag testade alla möjliga varianter, men eftersom jag hade fel version av rsync i botten, fungerade ju ingen av dem. Eftersom jag inte hittade någon dokumentation hur man formaterade listan, antog jag bara att det fanns nåt annat sätt jag inte hade provat. När du bekräftade hur listan skull se ut, började jag ana att nåt annat var fel och på så sätt kom jag fram till att jag hade version 2.6.3. Det jag tycker är konstigt är att i man-filen för mitt rsync omnämns ju att funktionen kom till i version 2.6.4. Kommer inte man-filen med installationen av programmet? Uppdateras den informationen utan att programmet rsync uppdateras?
Jaja, jag har mycket grundläggande kvar att lära inom Linux-världen... Men så här ser det slutliga scriptet ut, om någon är intresserad. Det är ett roterande, inkremetellt backupsystem till en extern disk med en månads cykel. (Om nån har synpunkter på saker som kan förbättras tas de naturligtvis tacksamt emot...)

Kod: Markera allt

[b]Köra med cron varje dag, strax efter midnatt.[/b]

#!/bin/bash
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin

#Mounta måldisken. Kanske bör ha en if-sats här som kollar om den redan är mountad?
mount /dev/sdc1 /mnt/usb-disken

#Flytta till arbetskatalogen
cd /mnt/usb-disken

# Sätta en rad variabler, som källmapp, målmapp och två som loopen använder
SOURCEDIR=/home
TARGETDIR=´date +%d´
let YESTERDAY=`date +%d`-1
LISTPARTS=" --compare-dest=../"

#Loop för att skapa en lista med jämförelsemappar
until [ $YESTERDAY -eq 1 ];
do
if [ $YESTERDAY -lt 10 ]; then TEMP_YD="0$YESTERDAY"; else
TEMP_YD=$YESTERDAY
fi

FOLDERLIST="$LISTPARTS$TEMP_YD"
COMPDEST="$COMPDEST$FOLDERLIST"
YESTERDAY=$[$YESTERDAY-1]
done


# Tömma mappen där inkrementella backupen ska lagras, för att rulla i cykeln.
rm -r `date +%d`
mkdir `date +%d`
#Sätta fler variabler: Sista biten på listan med jämförelsemappar och alternativen för rsync
COMPDEST="$COMPDEST --compare-dest=../full_backup"
ALTS=" -aq $COMPDEST"

#Själva backupkörningen
rsync $ALTS $SOURCEDIR $TARGETDIR

#Gå tillbaka till rootkatalogen
cd

#Unmounta måldisken
umount /dev/sdc1




[b]Full backup, köras med cron den första varje månad:[/b]

#!/bin/sh
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin

#Mounta måldisken
mount /dev/sdc1 /mnt/usb-disken

#Gå till arbetskatalogen
cd /mnt/usb-disken

# mapp som ska backuppas
SOURCEDIR=/home

# mapp för lagring/mottagning
TARGETDIR=full_backup

# Den förra fullbackupen sparas som reserv
rm -r tidigare_fullbackup
mv full_backup tidigare_fullbackup
mkdir full_backup

#Själva backupen
rsync -aq $SOURCEDIR $TARGETDIR

cd

#Unmounta måldisken
umount /dev/sdc1
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Rsync: Lista med mappar för Compare-dest

Inlägg av Konservburk »

Den första delen av ditt skript ska ju köras varje dag... men har du tänkt på vad som händer den 1:a varje månad? Jag tycker det ser ut som att skriptet kommer att hamna i en oändlig loop och dra 100% cpu. Inte speciellt bra med andra ord.

Probemet är until-loopen när du skapar listan med jämförelsemappar. Jag hade nog använt mig av en for-loop istället, ungefär så här:

Kod: Markera allt

COMPDEST="--compare-dest=../full_backup"
for i in $(seq -f%02.f 2 $(date -d-1day +%d))
do COMPDEST="--compare-dest=../$i $COMPDEST"
done
Jag skulle även ha slagit ihop de båda delarna av skriptet till ett enda skript som ska köras varje dag, men göra olika saker beroende på om det är den 1:a i månaden eller inte. Typ så här:

Kod: Markera allt

if test x"$(date +%d)" = x01
then
   echo full_backup
else
   echo incr_backup
fi
Dessutom verkar du ha fnuttarna åt fel håll här:

Kod: Markera allt

TARGETDIR=´date +%d´
Om du använder $() istället så slipper du missa sånt:

Kod: Markera allt

TARGETDIR=$(date +%d)
Majo
Inlägg: 48
Blev medlem: 26 feb 2008, 19:41
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Re: Rsync: Lista med mappar för Compare-dest

Inlägg av Majo »

Konservburk skrev:Den första delen av ditt skript ska ju köras varje dag... men har du tänkt på vad som händer den 1:a varje månad? Jag tycker det ser ut som att skriptet kommer att hamna i en oändlig loop och dra 100% cpu. Inte speciellt bra med andra ord.

Probemet är until-loopen när du skapar listan med jämförelsemappar. Jag hade nog använt mig av en for-loop istället, ungefär så här:

Kod: Markera allt

COMPDEST="--compare-dest=../full_backup"
for i in $(seq -f%02.f 2 $(date -d-1day +%d))
do COMPDEST="--compare-dest=../$i $COMPDEST"
done
Jag skulle även ha slagit ihop de båda delarna av skriptet till ett enda skript som ska köras varje dag, men göra olika saker beroende på om det är den 1:a i månaden eller inte. Typ så här:

Kod: Markera allt

if test x"$(date +%d)" = x01
then
   echo full_backup
else
   echo incr_backup
fi
Dessutom verkar du ha fnuttarna åt fel håll här:

Kod: Markera allt

TARGETDIR=´date +%d´
Om du använder $() istället så slipper du missa sånt:

Kod: Markera allt

TARGETDIR=$(date +%d)
Tack så jättemycket. Ska genast prova alla tips. For-loop har jag meckat med från början, eftersom även jag tyckte det var det bästa alternativet, men jag fick det inte att lira. For-loopen i Bash ser lite annorlunda ut än i andra språk jag använt den i.
Att lägga scripten tillsammans under en if-sats är naturligtvis det bästa alternativet. Att jag inte tänkte på det själv... :-[
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Rsync: Lista med mappar för Compare-dest

Inlägg av Konservburk »

Majo skrev:For-loopen i Bash ser lite annorlunda ut än i andra språk jag använt den i.
I t.ex. c/java och liknande så är for-looparna inget annat än förklädda while-loopar, dvs de loopar ända tills något villkor börjar gälla. I sh/bash använder for-loopen istället en lista som den går igenom. När listan är slut är for-loopen klar - så det blir inga oändliga loopar för att man råkar få ett villkor som aldrig gäller.

Kod: Markera allt

for i in a b c
do
   echo $i
done
Majo
Inlägg: 48
Blev medlem: 26 feb 2008, 19:41
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Re: Rsync: Lista med mappar för Compare-dest

Inlägg av Majo »

Konservburk skrev:

Kod: Markera allt

COMPDEST="--compare-dest=../full_backup"
for i in $(seq -f%02.f 2 $(date -d-1day +%d))
do COMPDEST="--compare-dest=../$i $COMPDEST"
done
Har du lust att förklara exakt vad som händer i denna for-loop? Den fungerar ju klockrent, men jag förstår inte exakt hur. Vore kul att lära sig och inte bara kopiera.
Har du förresten nåt förslag på en bra bok om bashscriptning, där man hittar språk, tips, tekniker? Sajter på nätet i all ära, men inget går upp mot en stadig bok i handen... :)
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Rsync: Lista med mappar för Compare-dest

Inlägg av Konservburk »

Majo skrev:
Konservburk skrev:

Kod: Markera allt

COMPDEST="--compare-dest=../full_backup"
for i in $(seq -f%02.f 2 $(date -d-1day +%d))
do COMPDEST="--compare-dest=../$i $COMPDEST"
done
Har du lust att förklara exakt vad som händer i denna for-loop? Den fungerar ju klockrent, men jag förstår inte exakt hur. Vore kul att lära sig och inte bara kopiera.
Vi börjar med date-kommandot:

Kod: Markera allt

date -d-1day +%d
Detta tar reda på vilken dag i månaden det var igår. Man kan skriva samma sak mer lättläst om man vill:

Kod: Markera allt

date -d yesterday +%d
Just idag ger ovanstående 07 som svar, dvs det var den 7:e igår.

Sedan har vi seq-kommandot:

Kod: Markera allt

seq -f%02.f 2 $(date -d-1day +%d)
Vilket idag är samma sak som:

Kod: Markera allt

seq -f%02.f 2 07
Ta en titt på den grundläggande formen:

Kod: Markera allt

seq 2 7
Detta ger en lista med talen 2 3 4 5 6 7. Den konstiga -f%02.f anger att talen ska fyllas på med 0 framför tills de blir två siffror långa, vilket ger oss listan 02 03 04 05 06 07. Med andra ord ser foor-loopen egentligen ut så här (idag):

Kod: Markera allt

COMPDEST="--compare-dest=../full_backup"
for i in 02 03 04 05 06 07
do COMPDEST="--compare-dest=../$i $COMPDEST"
done
Om vi flätar upp foor-loopen blir det:

Kod: Markera allt

COMPDEST="--compare-dest=../full_backup"
COMPDEST="--compare-dest=../02 $COMPDEST"
COMPDEST="--compare-dest=../03 $COMPDEST"
COMPDEST="--compare-dest=../04 $COMPDEST"
COMPDEST="--compare-dest=../05 $COMPDEST"
COMPDEST="--compare-dest=../06 $COMPDEST"
COMPDEST="--compare-dest=../07 $COMPDEST"
Vilket är samma sak som:

Kod: Markera allt

COMPDEST="--compare-dest=../07 --compare-dest=../06 --compare-dest=../05 --compare-dest=../04 --compare-dest=../03 --compare-dest=../02 --compare-dest=../full_backup"
Värt att notera är att seq 2 1 ger en tom lista, vilket innebär att foor-lopen inte körs alls i det fallet (2:a dagen i månaden).
Majo skrev:Har du förresten nåt förslag på en bra bok om bashscriptning, där man hittar språk, tips, tekniker? Sajter på nätet i all ära, men inget går upp mot en stadig bok i handen... :)
Känner tyvärr inte till vilka böcker som är bra. Själv brukar jag använda Advanced Bash-Scripting Guide om jag är osäker på något: http://tldp.org/LDP/abs/html/
Majo
Inlägg: 48
Blev medlem: 26 feb 2008, 19:41
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

Re: Rsync: Lista med mappar för Compare-dest

Inlägg av Majo »

Tack så hemskt mycket för all hjälp, Konservburk. Jag har fått en hel del kött på benen. Och Advanced Bash-Scripting Guide var ju en guldklimp. :)
Skriv svar

Återgå till "Terminalforum"