[systemd-devel] advice for zfs-mount-generator

Jörg Thalheim joerg.systemd at higgsboson.tk
Tue Jun 28 03:49:48 UTC 2016


Hi,

when using zfs in combination with systemd, users run into the following problem:

- zfs manages mountpoints on its own and systemd is not aware of those.
- this leads to problems, when mountpoints for other filesystems are mounted
  on directories in a zfs dataset or files are created in a directory before zfs could
  mount its dataset there. 
- the default behaviour in zfs case is to refuse to mount a filesystem on top of a non-empty directory.

In case zfs is loaded via initrd (to allow to use zfs as bootfs) during early boot, writing a generator should be easy:

```
$ zfs get all -H | grep mountpoint
zroot/home      mountpoint      /home  local
zroot/journal   mountpoint      /var/lib/journal  local
zroot/postgres  mountpoint      /var/lib/postgres  local
zroot/root      mountpoint      /     local
zroot/root/nix  mountpoint      /nix  local
zroot/root/tmp  mountpoint      /tmp  local
```

It should be also noted that those filesystems will be not mounted using mount(2),
but the command interface `zfs mount` except mountpoint is set the `legacy`

However currently some zfs services exists which import zfs pools after the generator run:

```/usr/lib/systemd/system/zfs-import-scan.service
[Unit]
Description=Import ZFS pools by device scanning
DefaultDependencies=no
Requires=systemd-udev-settle.service
After=systemd-udev-settle.service
After=cryptsetup.target
Before=dracut-mount.service
ConditionPathExists=!/etc/zfs/zpool.cache

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/sbin/modprobe zfs
ExecStart=/usr/bin/zpool import -aN -o cachefile=none

[Install]
WantedBy=zfs-mount.service
WantedBy=zfs.target
```

```/usr/lib/systemd/system/zfs-mount.service
[Unit]
Description=Mount ZFS filesystems
DefaultDependencies=no
After=systemd-udev-settle.service
After=zfs-import-cache.service
After=zfs-import-scan.service
After=systemd-remount-fs.service
Before=local-fs.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/zfs mount -a

[Install]
WantedBy=zfs-share.service
WantedBy=zfs.target
```

As generators will run before unit I run into a Chicken or the egg problem.
I would appreciate, if you have suggestions how to make this scheme compatible 
with the way systemd handle mounts.

Thanks Jörg Thalheim.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 603 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/systemd-devel/attachments/20160628/f8f41b9a/attachment-0001.sig>


More information about the systemd-devel mailing list