Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: BASH Script voor Backup. Deze script wil ik graag delen.  (gelezen 1499 keer)

Offline bartveurink

  • Lid
  • Steunpunt: Nee
BASH Script voor Backup. Deze script wil ik graag delen.
« Gepost op: 2015/06/03, 15:15:28 »
Het script werkt met een regel in fstab:
LABEL=BACKUP /mnt/BACKUP ext4 defaults,noauto 0 0
Het script maakt een backup van het bestand of directory dat als argument word meegegeven. Het script is bedoeld om snel een backup te maken van configuratiebestanden of configuratiedirectory. Het script koppeld de partitie automatisch aan en daarna ook weer af. In het geval dat hij als is aangekoppeld dan word de partitie niet afgekoppeld.
Het script heb ik op mijn Linux systeem in de directory /usr/bin geplaatst.

Script in BASH:
#!/bin/bash

bakfile=$1

if  mount | grep BACKUP > /dev/null
then
echo "mounted"
a=`mount | grep BACKUP`
else
a=`sudo mount -v LABEL=BACKUP`
dev=$(echo $a | cut --delimiter=" " -f 1)
fi

BACKUP_DIR=`echo "$a" | cut --delimiter=" " -f 3`
bakto=$BACKUP_DIR/ubuntu

if [[ -d $bakfile ]]
then
sudo cp -pRv "$bakfile" $bakto
else
sudo cp -pv "$bakfile" $bakto
fi

if [ ! -z $dev ]
then
sudo umount $dev
fi

Offline EZ-man

  • Lid
  • Steunpunt: Nee
Re: BASH Script voor Backup. Deze script wil ik graag delen.
« Reactie #1 Gepost op: 2015/06/03, 15:48:14 »
Dag Bart,
Het lijkt mij een handig script, maar ik heb moeite het helemaal te begrijpen (ligt niet aan jou).
Misschien is het een idee om het te documenteren door er commentaar regels aan toe te voegen.

Als voorbeeld, wat wordt bedoeld met:  bakfile=$1. Waar kijkt deze parameter naar? (sorry dat ik het vraag)
En heeft  sudo cp -pRv "$bakfile" te maken met recursief kopieren?

Nog belangrijker: welke config bestanden kopieer je met dit script?   in /home of ergens anders vandaan?

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Re: BASH Script voor Backup. Deze script wil ik graag delen.
« Reactie #2 Gepost op: 2015/06/03, 16:05:07 »
bakfile is het bestand of directory waarvan je een backup wilt maken.  Deze word als argument meegegeven:
backup.sh fileHet script bekijkt of $bakfile een directory of bestand is. Bij een directory kopieert hij deze recursief, bij een bestand alleen het bestand.
Vervolgens kopieert hij het naar de directory ubuntu in de partitie met het label BACKUP.
De partitie word aangekoppeld als hij dat nog niet is. Werd de partitie aangekoppeld dan koppeld hij hem na het kopieeren ook weer af.

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Re: BASH Script voor Backup. Deze script wil ik graag delen.
« Reactie #3 Gepost op: 2015/06/03, 16:38:53 »
Met commentaar:
#!/bin/bash

bakfile=$1

if  mount | grep BACKUP > /dev/null # controleren of BACKUP al gemount is.
then
echo "mounted"
a=`mount | grep BACKUP` # a is informatie over device en mountpoint.
else
a=`sudo mount -v LABEL=BACKUP`
# mounten indien niet gemount is. informatie over device en mountpoint komt in a te staan.
dev=$(echo $a | cut --delimiter=" " -f 1) #device path.
fi

BACKUP_DIR=`echo "$a" | cut --delimiter=" " -f 3` # mountpoint vanuit a.
bakto=$BACKUP_DIR/ubuntu # directory voor backup.

if [[ -d $bakfile ]] # controleren of backupfile een file of directory is.
then
sudo cp -pRv "$bakfile" $bakto # directory kopieeren.
else
sudo cp -pv "$bakfile" $bakto # bestand kopieeren.
fi

if [ ! -z $dev ] # device afkoppelen indien hij ook werd aangekoppeld.
then
sudo umount $dev
fi

Offline MauRice2

  • Lid
  • Steunpunt: Nee
Re: BASH Script voor Backup. Deze script wil ik graag delen.
« Reactie #4 Gepost op: 2015/06/03, 16:51:09 »
Bart,

Heeft het script altijd EEN argument nodig, bouw dan een check erin:
if [ $# -ne 1 ]
then
  echo "Usage: `basename $0` <argument>"
  exit 1
fi

Zijn er meerdere, past het aan.
MvG,
MauRice
Registered Linux user: 473556

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Re: BASH Script voor Backup. Deze script wil ik graag delen.
« Reactie #5 Gepost op: 2015/06/03, 17:06:54 »
Ja, het heeft altijd een argument nodig. Het checken van argumenten kende ik nog niet.

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Re: BASH Script voor Backup. Deze script wil ik graag delen.
« Reactie #6 Gepost op: 2015/06/03, 18:22:37 »
Kun je uitleggen wat $# -ne 1 doet. Waar staat $# voor. Waar is -ne voor.

Offline Johan van Dijk

  • Administrator
    • johanvandijk
  • Steunpunt: Nee
Re: BASH Script voor Backup. Deze script wil ik graag delen.
« Reactie #7 Gepost op: 2015/06/03, 18:43:57 »
http://www.tldp.org/LDP/abs/html/index.html of http://www.tldp.org/LDP/abs/html/abs-guide.html als je alles in 1 pagina wil hebben.
Dit is een goed naslagwerk als je gaat scripten in Bash.

$# is het aantal argumenten dat je meegeeft.
de -ne in de if test betekent "not equal", dus ongelijk aan 1 in dit geval.

Verder zou ik in plaats van de backticks (`) deze constructie gebruiken: $(basename $0), dit is leesbaarder en die kan je nesten zonder dat je moet escapen. http://www.tldp.org/LDP/abs/html/abs-guide.html#COMMANDSUBREF

Andere handige sites zijn http://www.shellcheck.net/ en http://explainshell.com/

Offline MauRice2

  • Lid
  • Steunpunt: Nee
Re: BASH Script voor Backup. Deze script wil ik graag delen.
« Reactie #8 Gepost op: 2015/06/03, 19:34:46 »
http://www.tldp.org/LDP/abs/html/index.html of http://www.tldp.org/LDP/abs/html/abs-guide.html als je alles in 1 pagina wil hebben.
Dit is een goed naslagwerk als je gaat scripten in Bash.

$# is het aantal argumenten dat je meegeeft.
de -ne in de if test betekent "not equal", dus ongelijk aan 1 in dit geval.

Verder zou ik in plaats van de backticks (`) deze constructie gebruiken: $(basename $0), dit is leesbaarder en die kan je nesten zonder dat je moet escapen. http://www.tldp.org/LDP/abs/html/abs-guide.html#COMMANDSUBREF

Andere handige sites zijn http://www.shellcheck.net/ en http://explainshell.com/
Dank u Johan.
Nooit te oud om te leren.
MvG,
MauRice
Registered Linux user: 473556

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Re: BASH Script voor Backup. Deze script wil ik graag delen.
« Reactie #9 Gepost op: 2015/06/03, 20:25:28 »
In de code gebruik ik cut om een veld uit een variabele te knippen. Kan ik daar de constructie ${} ook voor gebruiken?

Offline Johan van Dijk

  • Administrator
    • johanvandijk
  • Steunpunt: Nee
Re: BASH Script voor Backup. Deze script wil ik graag delen.
« Reactie #10 Gepost op: 2015/06/03, 23:37:32 »
Nee, want ${} is parameter substitution. Je kan er wel stukken mee uit knippen of veranderen zoals met awk of sed, maar cut is in dit geval makkelijker lijkt me.

Offline Bloom

  • Lid
  • Steunpunt: Ja
Re: BASH Script voor Backup. Deze script wil ik graag delen.
« Reactie #11 Gepost op: 2015/06/04, 11:22:37 »
Over het script zelf wil ik graag opmerken dat het wellicht interessanter is rsync te gebruiken ipv cp.
if [[ -d $bakfile ]] # controleren of backupfile een file of directory is.
then
sudo rsync -vau "$bakfile/" "$bakto/" # directory kopiƫren.
else
sudo rsync -vau "$bakfile" "$bakto/" # bestand kopiƫren.
fi
Het voordeel hiervan is dat $bakto dan ook naar andere computers mag wijzen, het doelwit hoeft dus geen lokale schijf te zijn.

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Re: BASH Script voor Backup. Deze script wil ik graag delen.
« Reactie #12 Gepost op: 2015/06/04, 14:31:04 »
Ik mis bij het gebruik van rsync de optie p. De p staat voor preserve, kopieeren met behoud van permissies. De optie r mis ik bij het kopieeren van een directory met rsync. r staat voor recursief kopieeren.

Offline Johan van Dijk

  • Administrator
    • johanvandijk
  • Steunpunt: Nee
Re: BASH Script voor Backup. Deze script wil ik graag delen.
« Reactie #13 Gepost op: 2015/06/04, 14:46:23 »
De a optie zorgt al voor de r en p optie (en nog een berg andere).

Ik backup alles naar een ZFS-on-Linux server en gebruik snapshots om de veranderingen bij te houden.
Belangrijkste stukjes code:
/usr/bin/rsync -aH --inplace --no-whole-file -e 'ssh -c aes128-cbc' --delete --filter="merge /home/johan/.rsync_filter" /home/johan/ server.local:/data/backup/desktop/home/johan/

ssh root@server.local /sbin/zfs-auto-snapshot --quiet --syslog --prefix=cron-desktop --label=backuphome --keep=31 data/backup/desktop/home

En in de .rsync-filter staan de zaken die ik niet wil backuppen:
- /Music/*
- /Videos/*
- /Steam
- /.steam
- /.cache/**
- /.local/share/Trash/**
- /.thumbnails/**
- /.gvfs
Een aantal zaken zoals muziek en films zijn bind-mounts en worden op een andere manier gebackupped. Steam etc. staan ook in de cloud en hoef ik dus niet te backuppen.

Een vergelijkbaar script gebruik ik voor de root directory, en die neemt dan weer niet de homes etc.. mee.

De lichtere SSH versleuteling gebruik ik omdat het allemaal toch binnen mijn eigen netwerk is en deze trekt wel de volledige Gbit-verbinding vol, in tegenstelling tot de normale versleuteling. Dit heeft te maken met AESNI instructies in de processors die AES versleutelingen kunnen versnellen.

Een vergelijkbaar plan met snapshots zou je ook met BTRFS kunnen doen, maar die vind ik toch nog wat te experimenteel (geen goede RAID bijv.)

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Re: BASH Script voor Backup. Deze script wil ik graag delen.
« Reactie #14 Gepost op: 2015/06/14, 21:19:48 »
Uiteindelijke code:
#!/bin/bash

if [ $# -eq 0 ]
then
  echo "Usage: "$(basename $0)" filename"
  exit 1
fi

OS=ubuntu

if  a=`mount | grep BACKUP` # controleren of BACKUP al gemount is. a is informatie over device en mountpoint.
then
echo "mounted"
else
a=`sudo mount -v LABEL=BACKUP`
# mounten indien niet gemount is. informatie over device en mountpoint komt in a te staan.
dev=$(echo $a | cut --delimiter=" " -f 1) #device path.
fi

date=$(date +%y%m%d) # datum voor de directorynaam
BACKUP_DIR=`echo "$a" | cut --delimiter=" " -f 3` # mountpoint vanuit a.
bakto=$BACKUP_DIR/$OS/$date # directory voor backup.
sudo mkdir -p $bakto

until [ -z "$1" ]
do
sudo rsync -vau $1 $bakto # BACKUP file
shift
done

if [ ! -z $dev ] # device afkoppelen indien hij ook werd aangekoppeld.
then
sudo umount $dev
fi

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Re: BASH Script voor Backup. Deze script wil ik graag delen.
« Reactie #15 Gepost op: 2015/06/28, 16:32:58 »
Na het uitvoeren van rsync kan onderstaande code een log maken met in de eerste kolom een datum en in de tweede het meegegeven bestand om te backuppen.

echo -e "$date\t$1" >> $BACKUP_DIR/$OS/log