1eda14cbcSMatt Macy.\" 2eda14cbcSMatt Macy.\" Copyright 2018 Antonio Russo <antonio.e.russo@gmail.com> 3eda14cbcSMatt Macy.\" Copyright 2019 Kjeld Schouten-Lebbing <kjeld@schouten-lebbing.nl> 4eda14cbcSMatt Macy.\" Copyright 2020 InsanePrawn <insane.prawny@gmail.com> 5eda14cbcSMatt Macy.\" 6eda14cbcSMatt Macy.\" Permission is hereby granted, free of charge, to any person obtaining 7eda14cbcSMatt Macy.\" a copy of this software and associated documentation files (the 8eda14cbcSMatt Macy.\" "Software"), to deal in the Software without restriction, including 9eda14cbcSMatt Macy.\" without limitation the rights to use, copy, modify, merge, publish, 10eda14cbcSMatt Macy.\" distribute, sublicense, and/or sell copies of the Software, and to 11eda14cbcSMatt Macy.\" permit persons to whom the Software is furnished to do so, subject to 12eda14cbcSMatt Macy.\" the following conditions: 13eda14cbcSMatt Macy.\" 14eda14cbcSMatt Macy.\" The above copyright notice and this permission notice shall be 15eda14cbcSMatt Macy.\" included in all copies or substantial portions of the Software. 16eda14cbcSMatt Macy.\" 17eda14cbcSMatt Macy.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18eda14cbcSMatt Macy.\" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19eda14cbcSMatt Macy.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 20eda14cbcSMatt Macy.\" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 21eda14cbcSMatt Macy.\" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 22eda14cbcSMatt Macy.\" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23eda14cbcSMatt Macy.\" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24*16038816SMartin Matuska.\" 25*16038816SMartin Matuska.Dd May 31, 2021 26*16038816SMartin Matuska.Dt ZFS-MOUNT-GENERATOR 8 27*16038816SMartin Matuska.Os 28eda14cbcSMatt Macy. 29*16038816SMartin Matuska.Sh NAME 30*16038816SMartin Matuska.Nm zfs-mount-generator 31*16038816SMartin Matuska.Nd generate systemd mount units for ZFS filesystems 32*16038816SMartin Matuska.Sh SYNOPSIS 33*16038816SMartin Matuska.Pa @systemdgeneratordir@/zfs-mount-generator 34*16038816SMartin Matuska. 35*16038816SMartin Matuska.Sh DESCRIPTION 36*16038816SMartin Matuska.Nm 37*16038816SMartin Matuskais a 38*16038816SMartin Matuska.Xr systemd.generator 7 39*16038816SMartin Matuskathat generates native 40*16038816SMartin Matuska.Xr systemd.mount 5 41*16038816SMartin Matuskaunits for configured ZFS datasets. 42*16038816SMartin Matuska. 43*16038816SMartin Matuska.Ss Properties 44*16038816SMartin Matuska.Bl -tag -compact -width "org.openzfs.systemd:required-by=unit[ unit]…" 45*16038816SMartin Matuska.It Sy mountpoint Ns = 46*16038816SMartin Matuska.No Skipped if Sy legacy No or Sy none . 47*16038816SMartin Matuska. 48*16038816SMartin Matuska.It Sy canmount Ns = 49*16038816SMartin Matuska.No Skipped if Sy off . 50*16038816SMartin Matuska.No Skipped if only Sy noauto 51*16038816SMartin Matuskadatasets exist for a given mountpoint and there's more than one. 52*16038816SMartin Matuska.No Datasets with Sy yes No take precedence over ones with Sy noauto No for the same mountpoint. 53*16038816SMartin Matuska.No Sets logical Em noauto No flag if Sy noauto . 54*16038816SMartin MatuskaEncryption roots always generate 55*16038816SMartin Matuska.Sy zfs-load-key@ Ns Ar root Ns Sy .service , 56*16038816SMartin Matuskaeven if 57*16038816SMartin Matuska.Sy off . 58*16038816SMartin Matuska. 59*16038816SMartin Matuska.It Sy atime Ns = , Sy relatime Ns = , Sy devices Ns = , Sy exec Ns = , Sy readonly Ns = , Sy setuid Ns = , Sy nbmand Ns = 60*16038816SMartin MatuskaUsed to generate mount options equivalent to 61*16038816SMartin Matuska.Nm zfs Cm mount . 62*16038816SMartin Matuska. 63*16038816SMartin Matuska.It Sy encroot Ns = , Sy keylocation Ns = 64*16038816SMartin MatuskaIf the dataset is an encryption root, its mount unit will bind to 65*16038816SMartin Matuska.Sy zfs-load-key@ Ns Ar root Ns Sy .service , 66*16038816SMartin Matuskawith additional dependencies as follows: 67*16038816SMartin Matuska.Bl -tag -compact -offset Ds -width "keylocation=https://URL (et al.)" 68*16038816SMartin Matuska.It Sy keylocation Ns = Ns Sy prompt 69*16038816SMartin MatuskaNone, uses 70*16038816SMartin Matuska.Xr systemd-ask-password 1 71*16038816SMartin Matuska.It Sy keylocation Ns = Ns Sy https:// Ns Ar URL Pq et al.\& 72*16038816SMartin Matuska.Sy Wants Ns = , Sy After Ns = : Pa network-online.target 73*16038816SMartin Matuska.It Sy keylocation Ns = Ns Sy file:// Ns < Ns Ar path Ns > 74*16038816SMartin Matuska.Sy RequiresMountsFor Ns = Ns Ar path 75*16038816SMartin Matuska.El 76*16038816SMartin Matuska. 77*16038816SMartin MatuskaThe service also uses the same 78*16038816SMartin Matuska.Sy Wants Ns = , 79*16038816SMartin Matuska.Sy After Ns = , 80*16038816SMartin Matuska.Sy Requires Ns = , No and 81*16038816SMartin Matuska.Sy RequiresMountsFor Ns = , 82*16038816SMartin Matuskaas the mount unit. 83*16038816SMartin Matuska. 84*16038816SMartin Matuska.It Sy org.openzfs.systemd:requires Ns = Ns Pa path Ns Oo " " Ns Pa path Oc Ns … 85*16038816SMartin Matuska.No Sets Sy Requires Ns = for the mount- and key-loading unit. 86*16038816SMartin Matuska. 87*16038816SMartin Matuska.It Sy org.openzfs.systemd:requires-mounts-for Ns = Ns Pa path Ns Oo " " Ns Pa path Oc Ns … 88*16038816SMartin Matuska.No Sets Sy RequiresMountsFor Ns = for the mount- and key-loading unit. 89*16038816SMartin Matuska. 90*16038816SMartin Matuska.It Sy org.openzfs.systemd:before Ns = Ns Pa unit Ns Oo " " Ns Pa unit Oc Ns … 91*16038816SMartin Matuska.No Sets Sy Before Ns = for the mount unit. 92*16038816SMartin Matuska. 93*16038816SMartin Matuska.It Sy org.openzfs.systemd:after Ns = Ns Pa unit Ns Oo " " Ns Pa unit Oc Ns … 94*16038816SMartin Matuska.No Sets Sy After Ns = for the mount unit. 95*16038816SMartin Matuska. 96*16038816SMartin Matuska.It Sy org.openzfs.systemd:wanted-by Ns = Ns Pa unit Ns Oo " " Ns Pa unit Oc Ns … 97*16038816SMartin Matuska.No Sets logical Em noauto No flag (see below). 98*16038816SMartin Matuska.No If not Sy none , No sets Sy WantedBy Ns = for the mount unit. 99*16038816SMartin Matuska.It Sy org.openzfs.systemd:required-by Ns = Ns Pa unit Ns Oo " " Ns Pa unit Oc Ns … 100*16038816SMartin Matuska.No Sets logical Em noauto No flag (see below). 101*16038816SMartin Matuska.No If not Sy none , No sets Sy RequiredBy Ns = for the mount unit. 102*16038816SMartin Matuska. 103*16038816SMartin Matuska.It Sy org.openzfs.systemd:nofail Ns = Ns (unset) Ns | Ns Sy on Ns | Ns Sy off 104*16038816SMartin MatuskaWaxes or wanes strength of default reverse dependencies of the mount unit, see below. 105*16038816SMartin Matuska. 106*16038816SMartin Matuska.It Sy org.openzfs.systemd:ignore Ns = Ns Sy on Ns | Ns Sy off 107*16038816SMartin Matuska.No Skip if Sy on . 108*16038816SMartin Matuska.No Defaults to Sy off . 109*16038816SMartin Matuska.El 110*16038816SMartin Matuska. 111*16038816SMartin Matuska.Ss Unit Ordering And Dependencies 112*16038816SMartin MatuskaAdditionally, unless the pool the dataset resides on 113*16038816SMartin Matuskais imported at generation time, both units gain 114*16038816SMartin Matuska.Sy Wants Ns = Ns Pa zfs-import.target 115eda14cbcSMatt Macyand 116*16038816SMartin Matuska.Sy After Ns = Ns Pa zfs-import.target . 117*16038816SMartin Matuska.Pp 118*16038816SMartin MatuskaAdditionally, unless the logical 119*16038816SMartin Matuska.Em noauto 120*16038816SMartin Matuskaflag is set, the mount unit gains a reverse-dependency for 121*16038816SMartin Matuska.Pa local-fs.target 122*16038816SMartin Matuskaof strength 123*16038816SMartin Matuska.Bl -tag -compact -offset Ds -width "(unset)" 124*16038816SMartin Matuska.It (unset) 125*16038816SMartin Matuska.Sy WantedBy Ns = No + Sy Before Ns = 126*16038816SMartin Matuska.It Sy on 127*16038816SMartin Matuska.Sy WantedBy Ns = 128*16038816SMartin Matuska.It Sy off 129*16038816SMartin Matuska.Sy RequiredBy Ns = No + Sy Before Ns = 130*16038816SMartin Matuska.El 131*16038816SMartin Matuska. 132*16038816SMartin Matuska.Ss Cache File 133*16038816SMartin MatuskaBecause ZFS pools may not be available very early in the boot process, 134*16038816SMartin Matuskainformation on ZFS mountpoints must be stored separately. 135*16038816SMartin MatuskaThe output of 136*16038816SMartin Matuska.Dl Nm zfs Cm list Fl Ho Ar name , Ns Aq every property above in order 137*16038816SMartin Matuskafor datasets that should be mounted by systemd should be kept at 138*16038816SMartin Matuska.Pa @sysconfdir@/zfs/zfs-list.cache/ Ns Ar poolname , 139*16038816SMartin Matuskaand, if writeable, will be kept synchronized for the entire pool by the 140*16038816SMartin Matuska.Pa history_event-zfs-list-cacher.sh 141*16038816SMartin MatuskaZEDLET, if enabled 142*16038816SMartin Matuska.Pq see Xr zed 8 . 143*16038816SMartin Matuska. 144*16038816SMartin Matuska.Sh ENVIRONMENT 145*16038816SMartin MatuskaThe 146*16038816SMartin Matuska.Sy ZFS_DEBUG 147*16038816SMartin Matuskaenvironment variable can either be 148*16038816SMartin Matuska.Sy 0 149*16038816SMartin Matuska(default), 150*16038816SMartin Matuska.Sy 1 151*16038816SMartin Matuska(print summary accounting information at the end), or at least 152*16038816SMartin Matuska.Sy 2 153*16038816SMartin Matuska(print accounting information for each subprocess as it finishes). 154*16038816SMartin Matuska. 155*16038816SMartin MatuskaIf not present, 156*16038816SMartin Matuska.Pa /proc/cmdline 157*16038816SMartin Matuskais additionally checked for 158*16038816SMartin Matuska.Qq debug , 159*16038816SMartin Matuskain which case the debug level is set to 160*16038816SMartin Matuska.Sy 2 . 161*16038816SMartin Matuska. 162*16038816SMartin Matuska.Sh EXAMPLES 163eda14cbcSMatt MacyTo begin, enable tracking for the pool: 164*16038816SMartin Matuska.Dl # Nm touch Pa @sysconfdir@/zfs/zfs-list.cache/ Ns Ar poolname 165*16038816SMartin MatuskaThen enable the tracking ZEDLET: 166*16038816SMartin Matuska.Dl # Nm ln Fl s Pa @zfsexecdir@/zed.d/history_event-zfs-list-cacher.sh @sysconfdir@/zfs/zed.d 167*16038816SMartin Matuska.Dl # Nm systemctl Cm enable Pa zfs-zed.service 168*16038816SMartin Matuska.Dl # Nm systemctl Cm restart Pa zfs-zed.service 169*16038816SMartin Matuska.Pp 170*16038816SMartin MatuskaIf no history event is in the queue, 171*16038816SMartin Matuskainject one to ensure the ZEDLET runs to refresh the cache file 172*16038816SMartin Matuskaby setting a monitored property somewhere on the pool: 173*16038816SMartin Matuska.Dl # Nm zfs Cm set Sy relatime Ns = Ns Sy off Ar poolname/dset 174*16038816SMartin Matuska.Dl # Nm zfs Cm inherit Sy relatime Ar poolname/dset 175*16038816SMartin Matuska.Pp 176*16038816SMartin MatuskaTo test the generator output: 177*16038816SMartin Matuska.Dl $ Nm mkdir Pa /tmp/zfs-mount-generator 178*16038816SMartin Matuska.Dl $ Nm @systemdgeneratordir@/zfs-mount-generator Pa /tmp/zfs-mount-generator 179*16038816SMartin Matuska. 180*16038816SMartin MatuskaIf the generated units are satisfactory, instruct 181*16038816SMartin Matuska.Nm systemd 182*16038816SMartin Matuskato re-run all generators: 183*16038816SMartin Matuska.Dl # Nm systemctl daemon-reload 184*16038816SMartin Matuska. 185*16038816SMartin Matuska.Sh SEE ALSO 186*16038816SMartin Matuska.Xr systemd.mount 5 , 187*16038816SMartin Matuska.Xr systemd.target 5 , 188*16038816SMartin Matuska.Xr zfs 5 , 189*16038816SMartin Matuska.Xr zfs-events 5 , 190*16038816SMartin Matuska.Xr systemd.generator 7 , 191*16038816SMartin Matuska.Xr systemd.special 7 , 192*16038816SMartin Matuska.Xr zed 8 193