Ich erstelle gerade ein Backup eines Notebooks. Plan ist das dieses Backup auf eine USB Platte geht. Dateisystem ist dabei ZFS…

Ein Backup per zfs send und zfs recv ist kein weiteres Problem und sofort zu erledigen. Ein Detail gibt es aber noch, ich will alles verschlüsselt! Das Notebook selbst besitzt eine full disk encryption. Da Notebook, sowie Datensicherung am Ende an einem nicht 100%tig sicherem Ort liegen werden, muss die Datensicherung ebenfalls vollverschlüsselt sein. Da die freie Version von ZFS leider keine Verschlüsselung bietet, setzte ich hier ebenfalls auf eine geli full disk encryption. So muss ich nur den Schlüssel an einem sicheren Ort aufbewahren und darf das Kennwort nicht vergessen 😉 Beides ist machbar, so kann ich mein Backup also liegen lassen. Greift sich jemand die Platte, wird er die Daten kaum entschlüsseln können \o/

Ich habe folgendes gemacht…

dmesg verrät mir, dass die USB-Platte erkannt wurde:

ugen0.2: <Intenso> at usbus0
umass0: <Intenso External USB 3.0, class 0/0, rev 3.00/5.07, addr 2> on usbus0
umass0:  SCSI over Bulk-Only; quirks = 0x0100
umass0:5:0:-1: Attached to scbus5
da0 at umass-sim0 bus 0 scbus5 target 0 lun 0
da0: <Intenso External USB 3.0 5438> Fixed Direct Access SCSI-6 device
da0: Serial Number 20141231055346
da0: 400.000MB/s transfers
da0: 953869MB (1953525164 512 byte sectors: 255H 63S/T 121601C)
da0: quirks=0x2<NO_6_BYTE>

Als ersten Schritt entferne ich nun per gdisk die voreingerichtete Partitionierung der Platte und erstelle eine neue GPT Partitionstabelle inkl. einer neuen Partition.

geli benötigt einen Schlüssel und dieser besteht am besten aus Zufallsdaten, diese liefert mir /dev/random:

$ dd if=/dev/random of=./backup-key bs=256 count=1

Mit diesem Schlüssel kann ich nun die verschlüsselte geli Partition auf der USB Platte einrichten:

$ geli init -s 4096 -K ./backup-key -l 256 /dev/da0s1
Enter new passphrase:
Reenter new passphrase:

Metadata backup can be found in /var/backups/da0s1.eli and
can be restored with the following command:

    # geli restore /var/backups/da0s1.eli /dev/da0s1

So, los geht es… Die neue verschlüsselte Partition kann eingehangen werden:

$ geli attach -k ./backup-key /dev/da0s1
Enter passphrase:

Fast geschafft, denn nun lässt sich bereits der ZFS-Pool anlegen:

$ zpool create usb-backup /dev/da0s1.eli

Tja, schon kann ich mit dem Pool arbeiten:

$ zpool list
NAME         SIZE  ALLOC   FREE   FRAG  EXPANDSZ    CAP  DEDUP  HEALTH  ALTROOT
smeerbsd     460G   184G   276G    24%         -    40%  1.00x  ONLINE  -
usb-backup   928G   296K   928G     0%         -     0%  1.00x  ONLINE  -

Ich starte also mal ein initiales Backup:

zfs send -R smeerbsd@auto-2015-05-23-21-00-00 | zfs recv -u usb-backup/notebook

Beim zfs send sorgt die Option -R dafür, dass alles rekursiv gesendet wird. Ich schiebe also mein komplettes Notebook auf den USB-Pool unter das neue Volume usb-backup/notebook. Beim zfs revc sorgt die Option -u dafür, dass die Laufwerke dort nicht gemountet werden. Dieses lässt sich optimieren. So kann man dafür sorgen, dass die Volumes auf der USB-Platte unmountbar sind. Dann hängt zfs diese bei einem neuen Import nicht ein, dieses ist aber eher ein neues Thema 😀

Bei weiteren Backups, muss dann natürlich nur noch die Differenz zwischen den Snapshots übertragen werden. Ebenfalls ein anderes Thema.

Beim Aushängen muss man nun natürlich ein paar Dinge beachten:

– sync erzwingen um alle Daten sicher geschrieben zu wissen.
– zpool exportieren
– geli Partition detachen

$ sync
$ zpool export usb-backup
$ geli detach /dev/da0s1

So, nun natürlich noch den Key an einen sicheren Ort legen. Es sollte ein dritter Ort sein, da er ja zur Entschlüsselung benötigt wird. Auf dem Notebook und auf der Sicherungsplatte liegt er also schlecht 😛

Bei Fragen, einfach melden 😀