Archiv für den Monat: Oktober 2014

FreeBSD 10: ZFS Remote Backup & Recovery

Beispielszenario: Eine FreeBSD Maschine hat 3 Festplatten mit ZFS raidz (äq. RAID5) und führt regelmäßig Datensicherungen (zfs snapshot send/receiv) zu einer entfernten Backup Maschine aus, nach dem Ausfall von 2 Festplatten soll zuerst ein funktionierendes System auf die noch vorhandene, funktionstüchtige Festplatte wiederhergestellt werden.
Optional wird anschließend der „singlepool“, durch das hinzufügen einer weiteren Platte, zu einem ZFS mirror (äq. RAID1) umgewandelt.

für automatisierte Snapshots empfiehlt sich: zfstools (OpenSolaris-compatible auto snapshotting for ZFS)

Bei der Sicherung sind im Grunde nur die (Daten) Snapshots von den ZFS Datasets wichtig, natürlich kann man sich die Arbeit weiter erleichtern und das MBR/GPT Schema ebenfalls mit sichern

GPT Schema:

$
root@kaputt:~ # gpart show /dev/ada0
=>        34  3907029101  ada0  GPT  (1.8T)
          34           6        - free -  (3.0K)
          40        1024     1  freebsd-boot  (512K)
        1064     8388608     2  freebsd-swap  (4.0G)
     8389672  3898639456     3  freebsd-zfs  (1.8T)
  3907029128           7        - free -  (3.5K)
$

ZPOOL:

$
root@kaputt:~ # zfs list
NAME                 USED  AVAIL  REFER  MOUNTPOINT
zroot                860M  1.78T   144K  none
zroot/ROOT           857M  1.78T   144K  none
zroot/ROOT/default   857M  1.78T   857M  /
zroot/tmp            176K  1.78T   176K  /tmp
zroot/usr            576K  1.78T   144K  /usr
zroot/usr/home       144K  1.78T   144K  /usr/home
zroot/usr/ports      144K  1.78T   144K  /usr/ports
zroot/usr/src        144K  1.78T   144K  /usr/src
zroot/var           1.27M  1.78T   648K  /var
zroot/var/crash      148K  1.78T   148K  /var/crash
zroot/var/log        208K  1.78T   208K  /var/log
zroot/var/mail       144K  1.78T   144K  /var/mail
zroot/var/tmp        152K  1.78T   152K  /var/tmp
$

ggf. ZFS gnop on FreeBSD (ashift) beachten

FreeBSD Beastie ZFS Remote Backup & Recovery

Punkt 1 Snapshots erstellen

$
zfs list | grep zroot | awk '{print $1}' | xargs -L1 -I {} zfs snapshot "{}"@_0000_backup_12.10.2014
zfs list -t snapshot
$

oder einfach:

$
zfs snapshot -r zroot@_0000_backup_12.10.2014
$
$
root@kaputt:~ # zfs list -t snapshot
NAME                                         USED  AVAIL  REFER  MOUNTPOINT
zroot@_0000_backup_12.10.2014                   0      -   144K  -
zroot/ROOT@_0000_backup_12.10.2014              0      -   144K  -
zroot/ROOT/default@_0000_backup_12.10.2014      0      -   857M  -
zroot/tmp@_0000_backup_12.10.2014               0      -   176K  -
zroot/usr@_0000_backup_12.10.2014               0      -   144K  -
zroot/usr/home@_0000_backup_12.10.2014          0      -   144K  -
zroot/usr/ports@_0000_backup_12.10.2014         0      -   144K  -
zroot/usr/src@_0000_backup_12.10.2014           0      -   144K  -
zroot/var@_0000_backup_12.10.2014               0      -   648K  -
zroot/var/crash@_0000_backup_12.10.2014         0      -   148K  -
zroot/var/log@_0000_backup_12.10.2014           0      -   208K  -
zroot/var/mail@_0000_backup_12.10.2014          0      -   144K  -
zroot/var/tmp@_0000_backup_12.10.2014           0      -   152K  -
$

Punkt 2 auf den entfernten Server sichern

$
/bin/sh
for i in $(zfs list -t snapshot | grep 0000 | awk '{print $1}'); do zfs send $i | ssh root@10.0.100.1 zfs recv zroot/backup/machine1/$(echo $i | sed 's/@_0000_backup_12.10.2014//g'); done
$

Punkt 3 vom entfernten Server wiederherstellen

Punkt 3.1 FreeBSD USB Stick booten, LiveCD auswählen

$
FreeBSD/amd64 (Amnesiac) (ttyv0)

root@:~ #
$

Punkt 3.2 Festplatte säubern

$
/bin/sh
dd if=/dev/zero of=/dev/ada0 bs=100M
$

HINWEIS: bs muss je nach max. Festplattenperformance angepasst werden

Punkt 3.2 Partitionen erstellen & Bootloader installieren

$
gpart create -s gpt /dev/ada0
gpart add -s 512K -t freebsd-boot /dev/ada0
gpart add -s 4G -t freebsd-swap -l swap0 /dev/ada0
gpart add -t freebsd-zfs -l disk0 /dev/ada0

gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 /dev/ada0
$

Punkt 3.3 ZFS Modul laden und Netzwerk einrichten

$
kldload /boot/kernel/opensolaris.ko; kldload /boot/kernel/zfs.ko

ifconfig; ifconfig re0 up; dhclient re0
$

Punkt 3.4 ZPOOL (singlepool) erstellen

$
mkdir /tmp/zroot; zpool create -f zroot /dev/gpt/disk0

zfs set checksum=sha256 zroot; zfs set compression=lz4 zroot
$

Punkt 3.5 ZFS Datasets wiederherstellen

HINWEIS: statt mit einer for Schleife sollten lieber einzeln die Snapshots wiederhergestellt werden

$
ssh root@10.0.100.1 zfs send zroot/backup/machine1/zroot@_0000_backup_12.10.2014 | zfs recv -F zroot
ssh root@10.0.100.1 zfs send zroot/backup/machine1/zroot/ROOT@_0000_backup_12.10.2014 | zfs recv zroot/ROOT
ssh root@10.0.100.1 zfs send zroot/backup/machine1/zroot/ROOT/default@_0000_backup_12.10.2014 | zfs recv zroot/ROOT/default

... usw ...
$

HINWEIS: das zpool.cache File muss nicht gesondert (in der LiveCD Umgebung) angelegt werden, da es aus dem vorhandenen Snapshot verwendet wird

Punkt 3.6 ZFS Dataset mountpoints setzen

$
zfs umount -a
zfs set mountpoint=none zroot
zfs set mountpoint=none zroot/ROOT
zfs set mountpoint=/ zroot/ROOT/default
zfs set mountpoint=/tmp zroot/tmp
zfs set mountpoint=/usr zroot/usr
zfs set mountpoint=/usr/home zroot/usr/home
zfs set mountpoint=/usr/obj zroot/usr/obj
zfs set mountpoint=/usr/ports zroot/usr/ports
zfs set mountpoint=/usr/src zroot/usr/src
zfs set mountpoint=/var zroot/var
zfs set mountpoint=/var/crash zroot/var/crash
zfs set mountpoint=/var/log zroot/var/log
zfs set mountpoint=/var/mail zroot/var/mail
zfs set mountpoint=/var/tmp zroot/var/tmp

zpool set bootfs=zroot/ROOT/default zroot

reboot
$

Ergänzungen

Punkt 4 Nach dem Reboot gab es Probleme weil Daten aus /usr nicht im zroot/usr Snapshot enthalten waren (sondern in zroot/ROOT/default), Lösung:

Punkt 4.1 Maschine im singleboot starten

$
TASTE 2 beim starten
$

Punkt 4.2 root Filesystem schreibar mounten

$
zfs set readonly=off zroot/ROOT/default; mkdir /tmp/fixit
zfs set mountpoint=/tmp/fixit zroot/usr; zfs mount zroot/usr
$

Punkt 4.3 (optional) swap mounten

$
swapinfo; swapon /dev/gpt/swap0; swapon
$

HINWEIS: ein swap muss vorhanden sein, sonst bricht irgendwann der folgende copy Befehlt ab

Punkt 4.4 /usr Daten transferieren

$
# cp -prfv /usr/* /tmp/fixit/
### besser rsync ###
rsync -a --progress /usr/ /tmp/fixit/
zfs umount zroot/usr; zfs set mountpoint=/usr zroot/usr
reboot
$

That’s FreeBSD