When I set up ZFS on my main rig I was kind of doing it “fast as possible” and haven’t paid attention to much details. Recently, I wanted to customize my setup a bit so here’s how I migrated my
/home to another ZFS dataset.
Setup was as follows:
- There is ZFS pool called storage composed of two mirrored vdevs
- One vdev is 2x2TB drives while the other one is 2TB drive and 1,5TB drive. Giving total capacity of “3 and something” TB of usable space.
- Pool (root dataset of the pool) had
mountpoint=/homeand was only dataset in the pool.
My plan, and exact commands to accomplish that were as follows:
Set ZFS pool mountpoint to
/, so when dataset is created, it is mounted on sub-directory of
/: zfs set canmount=off storage zfs set mountpoint=/ storage
storage/homedataset and allow mount. Adjust
compressionalgorithm and turn off
atimein order to prevent writes on file access: zfs create storage/home zfs set canmount=on storage/home zfs set mountpoint=/home storage/home zfs set compression=lz4 storage/home zfs set atime=off storage/home
Create dataset for my user, this will inherit options from
storage/homeso nothing special to set there: zfs create storage/home/ivan
Fine, but since storage was already used for storing data, all data is on that dataset, so naturally, I had to copy all of that data to the new dataset which was accomplished with
Create directory for temporary mount: mkdir /oldhome
mountpointfor storage dataset: zfs set canmount=noauto storage zfs set mountpoint=/oldhome storage
Mount the dataset: zfs mount storage
Other datasets were already mounted to their appropriate places so I just copied the data over: rsync -avh /oldhome/ivan/ /home/ivan
Since I wanted to watch the progress I had command running in one
tmux pane and used verbose mode as you can see from the command. Other pane
df -h and
zpool iostat -v running in order to monitor the progress and read/write operations on the pool and vdevs.
Why did I copy all of the data manually instead of cloning the dataset?
- I wanted to apply new settings.
compression=lz4saved me about 27GB of disk space on my almost 900GB of data.
At last, I’ve changed
storage dataset options back to:
zfs set canmount=off storage zfs set mountpoint=/ storage
Would you do something differently? Feel free to post suggestions.