Solved importing zfs dataset from an external drive to new machine


Well-Known Member

Reaction score: 150
Messages: 275


I have just installed Freebsd on my old Macmini and want to transfer zfs datasets from a usb drive to the macmini

I just need to copy across some data and set up a few config files to get macmini set up,
so i can finally ditch osx and go full freebsd on all my machines

Is it possible to do a zfs send recv from the datasets on the usb drive to the datasets on the macmini

Note from future self to past self:
You can send zfs datasets from a usb drive to datasets on another computer using send recv

I had to set the altroot when i imported the zfs pool

# zpool import -o altroot=/mnt/usb zbackup

then use zfs send recv to send the snapshots

# zfs send -Rv zbackup/zroot/data/desktop@freebsd-12.1 | zfs recv -F zroot/data/desktop

after sending the snapshots i set the mount point

# zfs set mountpoint=/usr/home/djwilcox/Desktop zroot/data/desktop

and finally mount the datasets

# zfs mount -a

job done

First question:
When i import the zpool on the new machine the datasets for my home are mounted in my home directory,
so the zfs dataset for my Desktop is mounted over the current Desktop if that makes sense

# zpool import zbackup

What i want to do is mount the zbackup pool to /mnt/usb,
which is a mount point i have created

The zbackup pool has its zfs mount point set to /mnt/usb, like so

# zfs set mountpoint=/mnt/usb zbackup

I guess i need to set the altroot to /mnt/usb or something on macmini

Second question:
Is it possible to do a zfs send recv of the datasets from the the usb drive to the datasets on the macmini

something like this
# zfs send -Rv zbackup/zroot/data/desktop@freebsd-12.1 | zfs recv -F zroot/data/desktop

Or should i try and mount the zpool to /mnt/usb and then use rsync or cp -Rpv,
to copy the data from the usb to the zfs datasets i have created on the macmini

On the macmini i have created all the zfs datasets

# zfs create zroot/data
# zfs create zroot/data/desktop
# zfs create zroot/data/documents
# zfs create zroot/data/downloads
# zfs create zroot/data/git
# zfs create zroot/data/config
# zfs create zroot/data/emacsd
# zfs create zroot/data/local
# zfs create zroot/data/mozilla
# zfs create zroot/data/ossuary
# zfs create zroot/data/weechat

and mount points

mkdir -p ~/Desktop
mkdir -p ~/documents
mkdir -p ~/downloads
mkdir -p ~/git
mkdir -p ~/.config
mkdir -p ~/.emacs.d
mkdir -p ~/.local
mkdir -p ~/.mozzila
mkdir -p ~/.ossuary
mkdir -p ~/.weechat

after i transfer the data i would set the zfs mount points and then mount them

# zfs set mountpoint=/usr/home/djwilcox/Desktop zroot/data/desktop
# zfs set mountpoint=/usr/home/djwilcox/documents zroot/data/documents
# zfs set mountpoint=/usr/home/djwilcox/downloads zroot/data/downloads
# zfs set mountpoint=/usr/home/djwilcox/git zroot/data/git
# zfs set mountpoint=/usr/home/djwilcox/.config zroot/data/config
# zfs set mountpoint=/usr/home/djwilcox/.emacs.d zroot/data/emacsd
# zfs set mountpoint=/usr/home/djwilcox/.local zroot/data/local
# zfs set mountpoint=/usr/home/djwilcox/.mozilla zroot/data/mozilla
# zfs set mountpoint=/usr/home/djwilcox/.ossuary zroot/data/ossuary
# zfs set mountpoint=/usr/home/djwilcox/.weechat zroot/data/weechat

Heres how i created the zfs datasets on the external usb drive

list the disks

geom disk list

switch to root

doas su

wipe the drive which is /dev/da0

gpart destroy -F da0
dd if=/dev/zero of=/dev/da0 bs=1m count=128

use gpart to create a gpt partition on the drive and add a label

gpart create -s gpt da0
gpart add -t freebsd-zfs -l zbackup da0

create the mount point on my macbook air

# mkdir -p /mnt/usb

create a new zpool and give it the same name as the gpt label to make things easy to remember set the mount point and use chown to change the owner of the mount point, replacing username:username with your username

create zfs pool on the external drive

zpool create zbackup gpt/zbackup
zfs set mountpoint=/mnt/usb zbackup
chown username:username /mnt/usb

list zfs directory structure

zfs list

create the snapshot

# zfs snapshot -r zroot@freebsd-12.1

send the snapshots to the corresponding pool on the drive use the -R option to create the datasets on the external drive

# zfs send -Rv zroot@freebsd-12.1 | zfs receive -F zbackup/zroot

take a new snapshot to send the incremental snapshot

zfs snapshot -r zroot@second-snapshot

send incremental snapshots use the -R option on the zroot pool to send incremental snapshots of the descendant file system

# zfs send -Rv -I zroot@freebsd-12.1 zroot@second-snapshot | zfs recv -F zbackup/zroot

export the zfs backup before removing the drive

# zfs export zbackup