Howdy, I’ve heard that it’s not a great idea to stick everything in a single pool. Also, I once did a trial install of Ubuntu back when ZFS was an option and I seem to remember it created a thousand pools.
I’ve looked around, but haven’t seen this type of elementary topic documented. Does anyone have any links handy?
First, some terminology—and I found this very confusing when I started with ZFS. The pool is made up of vdevs (the physical grouping of disks) and it houses datasets of various types. So substitute ‘dataset’ in place of ‘pool’ in your question.
Basically, you want a separate dataset for any boundary where you need different properties (like maybe you want some parts encrypted or a different block size for database storage or you want to take backups on a different schedule). For a desktop machine, I think the most important thing is to have the /home directory and all of its subdirectories be separate datasets. That would make it trivial to keep really frequent backups of your user’s data without storing the whole operating system.
A few months ago, I used the installer for Ubuntu 25.04 (as a basis for my Kubuntu with root-on-OpenZFS). Here’s the filesystems layout of the two pools that were produced by the installer:
grahamperrin@mowa219-gjp4 ~> zfs list -t fs -o name,mountpoint,canmount -r bpool
NAME MOUNTPOINT CANMOUNT
bpool /boot off
bpool/BOOT none off
bpool/BOOT/ubuntu_v0hpws /boot on
grahamperrin@mowa219-gjp4 ~> zfs list -t fs -o name,mountpoint,canmount -r rpool
NAME MOUNTPOINT CANMOUNT
rpool / off
rpool/ROOT none off
rpool/ROOT/ubuntu_v0hpws / on
rpool/ROOT/ubuntu_v0hpws/srv /srv on
rpool/ROOT/ubuntu_v0hpws/usr /usr off
rpool/ROOT/ubuntu_v0hpws/usr/local /usr/local on
rpool/ROOT/ubuntu_v0hpws/var /var off
rpool/ROOT/ubuntu_v0hpws/var/games /var/games on
rpool/ROOT/ubuntu_v0hpws/var/lib /var/lib on
rpool/ROOT/ubuntu_v0hpws/var/lib/AccountsService /var/lib/AccountsService on
rpool/ROOT/ubuntu_v0hpws/var/lib/NetworkManager /var/lib/NetworkManager on
rpool/ROOT/ubuntu_v0hpws/var/lib/apt /var/lib/apt on
rpool/ROOT/ubuntu_v0hpws/var/lib/dpkg /var/lib/dpkg on
rpool/ROOT/ubuntu_v0hpws/var/log /var/log on
rpool/ROOT/ubuntu_v0hpws/var/mail /var/mail on
rpool/ROOT/ubuntu_v0hpws/var/snap /var/snap on
rpool/ROOT/ubuntu_v0hpws/var/spool /var/spool on
rpool/ROOT/ubuntu_v0hpws/var/www /var/www on
rpool/USERDATA none off
rpool/USERDATA/home_dz7uxs /home on
rpool/USERDATA/root_dz7uxs /root on
rpool/var /var off
rpool/var/lib /var/lib off
rpool/var/lib/docker /var/lib/docker on
grahamperrin@mowa219-gjp4 ~>
at risk of necro-bumping, but can’t help but insert an opinion:
Apparently Ubuntu uses a separate boot pool because they insist on using GRUB (grub’s support of zfs is old, and from what I’ve read, partly broken). If you can get away from GRUB (I’d suspect you’d thank yourself at some point), then no need to complicate things by creating 2 pools.
I read or heard somewhere, a comment about mountpoints. This person (whoever it was, can’t remember) said it was much easier to create your datasets in the hierarchy of the mountpoints, that way the mountpoints don’t have to be manually altered/managed/maintained; they will just be correct by inheriting the relative paths from the one, top level dataset.
This Ubuntu example from @grahamperrinmostly demonstrates that, though there are some deviations.