...der Treffpunkt für Linuxbegeisterte im Landkreis Trauntein....

Backup

Backup auf Basis von btrfs im Cryptocontainer + Snapshots als incrementelle Backups

Backup Tar
Backup Tar
backup.tar.bz2
166.8 KiB
165 Downloads
Details

Ich beschränke mich hier auf die Installation unter Debian/Ubuntu. Bei anderen Distributionen ist der entsprechende Paketmanager zu verwenden. Vorraussetzung:

apt-get install btrfs-tools cryptsetup hashalot uuidgen

( Beachtet, dass der Pfad zum btrfs binary in Ubuntu 14.04 /sbin/btrfs und 16.04 /bin/btrfs unterschiedlich ist. Bitte dann im Script anpassen. )

Deises Script ist nun modifiziert, so dass es den Pfad zu Binary automatisch setzt.

## SETTING LOCATION OF BTRFS
if [ -x /sbin/btrfs ]; then
   ## UBUNTU 14.04
   BTRFS="/sbin/btrfs"
else
   ## UBUNTU 16.04
   BTRFS="/bin/btrfs"
fi

NEU PLATTE ANSCHLIESSEN

dmesg |tail -10
[ 5262.314455] usb-storage 4-1.2:1.0: USB Mass Storage device detected
[ 5262.314773] scsi host7: usb-storage 4-1.2:1.0
[ 5263.314261] scsi 7:0:0:0: Direct-Access   SAMSUNG   HM100JC   YN10 PQ: 0 ANSI: 0 CCS
[ 5263.315046] sd 7:0:0:0: Attached scsi generic sg2 type 0
[ 5263.315591] sd 7:0:0:0: [sdb] 195371568 512-byte logical blocks: (100 GB/93.1 GiB)
[ 5263.316206] sd 7:0:0:0: [sdb] Write Protect is off
[ 5263.316213] sd 7:0:0:0: [sdb] Mode Sense: 00 14 00 00
[ 5263.316917] sd 7:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[ 5263.412267]  sdb: sdb1
[ 5263.415103] sd 7:0:0:0: [sdb] Attached SCSI disk

man kann nur erkenn dass eine neue Platte (sdb) mit einer Partition im System vorhanden ist. Ein Backup sollte gut gesichert werden und vor unbefugten Zugriff abgeschottet sein. Hierfür bieten sich Boarmittel wie cryptsetup an, welches eingangs installiert wurde. Um nun einen Cryptocontainer zu erzeugen, muss die Platte (sdb), respektive die Partition 1 (sdb1) mit cryptsetup (luks) formatiert werden.

## MIT ZUFALLSZAHLEN FÜLLEN (DAUER EXTREM LANGE)
dd if=/dev/urandom bs=2M of=/dev/sdb1

## MIT NULLEN FÜLLEN (DAUER NICHT SEHR LANGE, REDUZIERT DIE SICHERHEIT)
## dd if=/dev/Zero bs=2M of=/dev/sdb1
cryptsetup luksFormat /dev/sdb1
WARNING!
========
Hiermit überschreiben Sie Daten auf /dev/sdb1 unwiderruflich.

Are you sure? (Type uppercase yes): YES
Passsatz eingeben:
Verify passphrase:

Nun wird ein Passwort angegeben dass man sich tunlichst merken sollte. Es stellt das Masterpasswort des Containers dar. Allerdings man auch Keys wieder entfernen. ( man cryptsetup )

Es muss nun ein Verzeichnis namens /opt/key/ erzeugt werden. Wir möchten ja beim Backup nicht immer ein Passwort angeben, schon gar nicht wenn es automatisch über cron gestartet wir. Ergo benötigt man einen Keyfile und der wandert nach /opt/keys/luks.key

/opt/keys/luks.key

PASSKEY ERZEUGEN

mkdir -p /opt/key
uuidgen > /opt/key/luks.key

Der Key wird nun dem Container zugewiesen

cryptsetup luksAddKey /dev/sdb1 /opt/key/luks.key
Geben Sie irgendeinen Passsatz ein:

Der hier geforderte Passatz ist das initial gesetzte Masterpasswort

DAS LAUFWERK ENTSCHLÜSSELN UND EINEM DEVICE ZUWEISEN

cryptsetup luksOpen /dev/sdb1 unlock
Geben Sie den Passsatz für /dev/sdb ein:

Und wieder das Masterpasswort eingeben

Das erzeugte Device heisst nun

/dev/mapper/unlock

ll /dev/mapper/unlock 
lrwxrwxrwx 1 root root 7 Feb  2 11:48 /dev/mapper/unlock -> ../dm-0

 

ERZEUGNEN DES btrfs FILESYSTEM

mkfs.btrfs /dev/mapper/unlock 
WARNING! - Btrfs v3.12 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using
Turning ON incompat feature 'extref': increased hardlink limit per file to 65536
fs created label (null) on /dev/mapper/unlock
    nodesize 16384 leafsize 16384 sectorsize 4096 size 15.14GiB
Btrfs v3.12

Mit der Erstellung des Cryptocontainers und des Filesystems wurden IDs zur Identifikation der Volumes gesetzt.

AUSLESEN DER ID

blkid | egrep -i "btrfs|unlock|luks"
/dev/mapper/unlock: UUID="8450fc0a-b368-4754-8631-2e8916e219f6" UUID_SUB="491bd681-7f9a-47b4-a99c-f4b1135686a2" TYPE="btrfs" 
/dev/sdb: UUID="c6e1c3ba-e454-4e8e-9bd5-4d8797bded68" TYPE="crypto_LUKS"

Das erstellen des Containers ist abgeschlossen.
Anpassung der Config innerhalb der Backuprutine

CONTAINER UNMOUNTEN

umount /dev/mapper/unlock
cryptsetup luksClose /dev/mapper/unlock

 

ERSTELLEN DES SCRIPTVERZEICHNIS

mkdir -p /opt/local/backup

ENTPACKEN DES TARBALLS backup.tar.bz2

cd /Dein/Download/Verzeichnis/
tar xvfj backup.tar.bz2
cd local/backup
 
ll
 
## OUTPUT
insgesamt 36
drwxr-xr-x 6 backup backup 4096 Jan 31 19:11 ./
drwxr-xr-x 5 root root 4096 Jan 27 11:06 ../
-rwxr--r-- 1 backup backup 5481 Jan 31 19:11 backup.sh*
drwxr-xr-x 2 backup backup 4096 Jan 13 15:34 bin/
drwxr-xr-x 2 backup backup 4096 Jan 31 19:19 config/
drwxr-xr-x 2 backup backup 4096 Jan 13 16:03 include/
drwxr-xr-x 2 backup backup 4096 Jan  6  2014 ssh-keys/
-rwxr--r-- 1 backup backup 3319 Jan 26 22:21 unlock.sh*

ERZEUGEN DES BACKUPKEY

Das ist nötig, da das Backup nicht als clientbackup konzipiert wurde sondern als serverseitiges.
Es steht dem Nutzer also frei es auch als Serverseitiges backup (zentral) für mehrere Maschinen zu verwenden.

ssh-key OHNE PASSWORT ERZEUGEN

ssh-keygen -f ssh-keys/backup_rsa

Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in ssh-keys/backup_rsa.
Your public key has been saved in ssh-keys/backup_rsa.pub.
The key fingerprint is:
62:50:fa:00:5a:42:cd:3a:55:79:77:d7:d3:cc:f2:fd root@bb8
The key's randomart image is:
+--[ RSA 2048]----+
|o.= ..o       .o.|
| + = + . . . ..o+|
|. o + . . . .  oo|
+-----------------+

PUBLICKKEY FÜR ROOT BEREITSTELLEN

cat ssh-keys/backup_rsa.pub >> /root/.ssh/authorized_keys

ANPASSEN DER BACKUPCONFIG

<strong>cd config</strong>

ll
insgesamt 16
drwxr-xr-x 2 backup backup 4096 Jan 31 19:19 ./
drwxr-xr-x 6 backup backup 4096 Feb 2 12:15 ../
-rw-r----- 1 backup backup 645 Jan 27 11:05 backup.conf
-rw-r--r-- 1 backup backup 196 Jan 31 19:19 hosts.cfg
-rw-r----- 1 backup backup 645 Jan 27 11:05 unlock.conf

 

hosts.cfg EDITIEREN

##################################
## 4LORDS BACKUP PARAMETER
##################################
root;bb8;4lords.intra;22;/etc /home /data /var /usr /lib* /boot /dev /root /sbin /opt/local/backup

## JEDE WEITERE ZEILE IST EIN NEUER ZU SICHERNDER HOST
##
## bb8 = Hostname der zu backupenden Box
## 4lords.intra = Die Domäne in der sich bb8 befindet
## 22 = der ssh-port
## /etc /home ... = die zu sichernden Verzeichnisse ( WICHTIG :: durch Leerzeichen trennen!!! )

unlock.conf EDITIEREN

#!/bin/bash
UNLOCKED_MOUNTPOINT="/opt/local/usb"                         # the mountpoint the file ist temporarely mounted in
BACKUP_DEVICE_BY_UUID="c6e1c3ba-e454-4e8e-9bd5-4d8797bded68" # ENCRYPTED DEVICE
KEY_FILE="/opt/key/luks.key"                                 # the name of your passwordfile (should later stored on an usb-stick)
FILESYSTEM="auto"                                            # the filesystem which is created in imagefile
# +---------------------------- DO NOT EDIT BELOW ----------------------------------+ #
## ALARM
LENGTH="2000"
HIGH="13"

## DEFAULT BACKUP DECLARATIONS
FILESYSTEM="auto"
UNLOCKED_DEVICE="/dev/mapper/${SOURCE_DEVICE_BY_UUID}"

backup.conf EDITIEREN

KEEP_BACKUPS="30"

Die blkid c6e1c3ba-e454-4e8e-9bd5-4d8797bded68 haben wir oben bereits durch ausführen des Befehls blkid gefunden. Sie muss in SOURCE_DEVICE_BY_UUID gesetzt werden.
Inhalt des entpacketen Tarballs vollständig nach /opt/local/backup kopieren

rsync -av /Dein/Download/verzeichnis/backup /opt/local/

Abschliesend soll evtl. das Backup manuell über einen Desktostarter gestartet werden. Hierfür ist ein Eintrag in /etc/sudoers notwendig

DeinUserName = jener, mit dem Du auf dem Host arbeitest

/etc/sudoers EDITIEREN

## DIESE ZEILE HINZUFÜGEN
DeinUserName ALL = NOPASSWD: /opt/local/backup/*

Für Deinen Windowmanager einen Desktopstarter erzeugen und den Befehl

sudo /opt/local/backup/backup.sh --umount

hinterlegen

Sobald die Backupplatte am Notebook hängt, kann nun durch Klick auf den Starter das Backup beginnen. Das Backup erstell für jeden Tag an dem es ausgeführt wird ein Backup mit folgender Struktur:

 

ll /opt/local/usb

insgesamt 20
drwxr-xr-x 1 root root 40 Jan 27 10:20 ./
drwxr-x---+ 3 root root 4096 Feb 2 12:43 ../
drwxr-xr-x 1 root root 6 Jan 27 10:12 4lords.intra/
drwxr-xr-x 1 root root 8 Jan 31 19:20 snapshot/

ll 4lords.intra/bb8/

insgesamt 0
drwxr-xr-x 1 root root 86 Jan 31 19:18 ./
drwxr-xr-x 1 root root 6 Jan 27 10:12 ../
drwxr-xr-x 1 root root 364 Jan 26 22:10 boot/
drwxr-xr-x 1 root root 6 Jan 26 21:49 data/
drwxr-xr-x 1 root root 2312 Jan 31 19:18 dev/
drwxr-xr-x 1 root root 4636 Jan 31 19:18 etc/
drwxr-xr-x 1 root root 6 Jan 26 19:56 home/
drwxr-xr-x 1 root root 954 Jan 26 21:46 lib/
drwxr-xr-x 1 root root 40 Nov 28 15:22 lib64/
drwxr-xr-x 1 root root 10 Jan 31 19:18 opt/
drwx------ 1 root root 234 Jan 31 19:19 root/
drwxr-xr-x 1 root root 5294 Jan 26 22:10 sbin/
drwxr-xr-x 1 root root 70 Nov 28 15:19 usr/
drwxr-xr-x 1 root root 90 Nov 28 15:57 var/

ll snapshot/

insgesamt 64
drwxr-xr-x 1 root root  8 Jan 31 19:20 ./
drwxr-xr-x 1 root root 40 Jan 27 10:20 ../
....
drwxr-xr-x 1 root root 40 Jan 27 10:20 2016-01-31_15-12
drwxr-xr-x 1 root root 40 Jan 27 10:20 2016-02-01_15-45
drwxr-xr-x 1 root root 40 Jan 27 10:20 2016-02-02_15-24

ll snapshot/2016-02-01_15-45/4lords.intra/bb8/insgesamt 0

drwxr-xr-x 1 root root 86 Jan 31 19:18 ./
drwxr-xr-x 1 root root 6 Jan 27 10:12 ../
drwxr-xr-x 1 root root 364 Jan 26 22:10 boot/
drwxr-xr-x 1 root root 6 Jan 26 21:49 data/
drwxr-xr-x 1 root root 2312 Jan 31 19:18 dev/
drwxr-xr-x 1 root root 4636 Jan 31 19:18 etc/
drwxr-xr-x 1 root root 6 Jan 26 19:56 home/
drwxr-xr-x 1 root root 954 Jan 26 21:46 lib/
drwxr-xr-x 1 root root 40 Nov 28 15:22 lib64/
drwxr-xr-x 1 root root 10 Jan 31 19:18 opt/
drwx------ 1 root root 234 Jan 31 19:19 root/
drwxr-xr-x 1 root root 5294 Jan 26 22:10 sbin/
drwxr-xr-x 1 root root 70 Nov 28 15:19 usr/
drwxr-xr-x 1 root root 90 Nov 28 15:57 var/

Die Snapshots belegen nur die Differenz zumdavor erstellenBackup. Sind aber ansonsten vollständige Backups. Man kann aus diesen den vollständigen Stand des Tages z.B. 2016-02-01_15-45 zurückspielen.

Have Fun :o)

USAGE

./backup --help
USAGE: /opt/local/backup/backup.sh 
       /opt/local/backup/backup.sh --umount --dedupe

Author: Matthias Schweizer

Der Autor übernimmt keinerlei Gewähr für die Aktualität, Richtigkeit und Vollständigkeit der bereitgestellten Informationen auf unserer Website. Haftungsansprüche gegen den Autor, welche sich auf Schäden materieller oder ideeller Art beziehen, die durch die Nutzung oder Nichtnutzung der dargebotenen Informationen bzw. durch die Nutzung fehlerhafter und unvollständiger Informationen verursacht wurden, sind grundsätzlich ausgeschlossen, sofern seitens des Autors kein nachweislich vorsätzliches oder grob fahrlässiges Verschulden vorliegt. Alle Angebote sind freibleibend und unverbindlich. Der Autor behält es sich ausdrücklich vor, Teile der Seiten oder das gesamte Angebot ohne gesonderte Ankündigung zu verändern, zu ergänzen, zu löschen oder die Veröffentlichung zeitweise oder endgültig einzustellen.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.