Backup za pomocą ZFS

Za pomocą zfs send oraz zfs receive (zfs recv) można dość szybko wykonać backup całej partycji ZFSowej. Podstawą jest wykonania snapshota.

Skrypt

# wykonanie snaphota wraz ze wszystkimi "dziećmi"
zfs snapshot -r storage/imap@pelny

# wyslanie snapshota do pliku GZip
zfs send -Rv storage/imap@pelny | gzip -c > /opt/_imap_full.zfs.gz

# rozpakowanie "snapshota" w miejscu docelowym:
gunzip -c /opt/_imap_full.zfs.gz | zfs recv -vdeusF  sda

Uprawnienia dla zwykłego użytkownika

Można również wykonać zfs send oraz zfs receive poprzez SSH. Trzeba tylko upoważnić użytkownika do wykonywania operacji na partycji ZFS:

zfs allow -u <user> create,receive,rename,mount,share,send sda/backup/imap

Wykorzystanie mbuffer

Dzięki wykorzystaniu mbuffer, to można całość spokojnie przesyłać przez sieć:

# dla sieci Internet
export _MBUF="-s 256k -m 512M"

# dla sieci LAN
export _MBUF="-s 256k -m 1G"

# send:
#   -R r/ownie/z wszystkie ew. dzieci danego zfs-a
#
# receive
#   -d u/zyj ca/lego snapshota, ale bez pierwszego cz/lonu (bez nazwy pool-i)
#   -e u/zyj tylko ostatniego cz/lonu snapshota (jak w opisie dla -d)
#   -u nie montuj automatycznie
#   -s mo/zliwo/s/c wznowienia wysy/lania, gdyby wyst/api/ly b/l/edy
#   -F wymu/s rollback przed uruchomieniem zfs recv
#
zfs send -R storage/imap@pelny | mbuffer $_MBUF 2>/dev/null | ssh -c aes128-ctr __user__@server2 "mbuffer $_MBUF | zfs receive -deusF sda/backup/imap"

/!\ UWAGA /!\ Jeżeli ssh wymaga podania hasła, to komunikat w celu jego wpisania zostanie przykryty przez komunikaty mbuffer o przesyłaniu danych z prędkością 0/0. Tak więc najlepiej jest wykonać kopiowanie z wykorzystaniem kluczy (bez hasła).

Algorytmy szyfrowania SSH

Dodanie odpowiedniego algorytmu szyfrowania (patrz odnośniki poniżej) znacznie przyspieszy przesyłanie dużego backupu. Niemniej jest to algorytm, który trzeba dopisać do konfiguracji demona OpenSSH:

Ciphers +aes256-gcm@openssh.com

Oczywiście po zmianach należy wykonać restart demona:

service openssh restart

Jeżeli serwer (procesor) wspiera obsługę AESNI, to warto wgrać stosowny moduł:

kldload aesni