ZFS info

Typical backup process

log into your main zfs server

use this one-liner to get the name of the last snapshot in the list, save as a variable, and echo it back:

last_snapshot=$(zfs list -t snapshot | tail -1 | awk '{print $1}') && echo $last_snapshot

form a new variable for your current snapshot

new_snapshot="<name-of-your-pool>@$(date +"%Y-%m-%d_%H-%M")"

for example:

new_snapshot="coldstorage/nas@$(date +"%Y-%m-%d_%H-%M")"

Then take a snapshot and check that it was taken:

zfs snapshot $new_snapshot && zfs list -t snapshot

on secondary machine, ensure that it has the same snapshot:

zfs list -t snapshot

from the primary machine, send it over using the template:

zfs send -v -i <last_snapshot> <current-snapshot> | ssh <secondary-machine> zfs recv <pool/data>

with literals it would look like

zfs send -v -i coldstorage/nas@2022-05-27 coldstorage/nas@2023-06-08_10-00 | ssh storage zfs recv storage

Full example

open in a tmux window in case your ssh session dies or window is closed:

tmux

Then

last_snapshot=$(zfs list -t snapshot | tail -1 | awk '{print $1}')
new_snapshot="coldstorage/nas@$(date +"%Y-%m-%d_%H-%M")"
zfs snapshot $new_snapshot
zfs send -v -i $last_snapshot $new_snapshot | ssh storage zfs recv storage

How to set up ZFS

First install it

sudo apt install -y zfsutils-linux
sudo fdisk -l
lsblk
lsblk -f

define permissions

add permissions using

sudo zfs allow -u <username> receive,create,send,hold,share,snapshot,mount <name-of pool>

For example,

sudo zfs allow -u danaukes receive,create,send,hold,share,snapshot,mount storage
sudo zfs allow -u danaukes receive,create,send,hold,share,snapshot,mount coldstorage
sudo zfs allow -u danaukes receive,create,send,hold,share,snapshot,mount coldstorage/nas

create a pool

sudo zpool create -f storage mirror /dev/sdb /dev/sdc
sudo zpool create -f coldstorage mirror /dev/sda /dev/sde
sudo zpool create -f coldstorage mirror /dev/sda /dev/sdb

Other useful commands related to pools

zpool status
zpool status -v
zpool list
sudo zpool destroy <pool-name>

Some examples

sudo zpool mount coldstorage
sudo zpool unmount coldstorage
sudo zpool online coldstorage
sudo zpool offline coldstorage
sudo zpool detatch coldstarge /dev/sdb1
sudo zpool replace -f coldstorage 11380073923137715223 /dev/sdb

import / export

You can import and export an existing pool if it is not currently loaded on your system.

sudo zpool export coldstorage
sudo zpool import coldstorage -d /dev/

filesystems

https://docs.oracle.com/cd/E19253-01/819-5461/gfkco/index.html

sudo zfs create coldstorage/nas
zfs set readonly=on coldstorage/nas
zfs get mountpoint coldstorage/nas
zfs list

rollback snapshots:

sudo zfs rollback <pool>/<datastore>@<identifier>
sudo zfs rollback coldstorage/nas@test

on colorado

sudo zpool create -f coldstorage mirror /dev/sda /dev/sdb
sudo zfs create coldstorage/nas
sudo zfs set readonly=on coldstorage/nas
sudo zfs rollback coldstorage/nas@test

List all data

zfs list
zfs list -t filesystem
zfs list -t snapshot

snapshots

tmux
zfs snapshot <pool>@<data>/<identifier>

zfs snapshot "storage@$(date +"%Y-%m-%d_%H-%M")"

zfs send -v -i <last_snapshot> <current-snapshot> | ssh <secondary-machine> zfs recv <pool/data>
zfs send -v -i storage@2022-05-27 storage@2023-06-08_10-00 | ssh colorado zfs recv coldstorage/nas

Sending recursive snapshots to another locally

zfs send -R -v storage@test | zfs recv -F coldstorage/nas

Sending recursive snapshots to another datastore remotely

zfs send -R -v storage@test | ssh colorado zfs recv -F coldstorage/nas

debugging

sudo dmesg | grep -i zfs

Managing ZFS File Systems - ZFS Administration Guide