Je me suis heurté récemment à une situation un peu particulière avec ZFS. Sur un de mes serveurs, je dispose dans un zpool (monpool) d'un dataset (mondataset) contenant un répertoire (/monpool/mondataset/shared) qui a vocation à être partagé via NFS. Seulement, le répertoire qui sera partagé n'est pas le dataset lui-même, mais un montage LOFS d'un sous-répertoire de ce dataset dans un filesystem UFS.

Alors certes, on pourrait à juste titre s'interroger sur l'intérêt d'un tel enchaînement, mais ce n'est pas l'objectif de ce billet. Profitons plutôt de cette configuration quelque peu barbare pour présenter un problème intéressant, et les options ZFS permettant de le contourner.

Regardons déjà comment ces différents montages sont définis. Le dataset contenant les données à partager est défini simplement, avec un mountpoint positionné manuellement :

# zfs list monpool/mondataset NAME USED AVAIL REFER MOUNTPOINT monpool/mondataset 3.0G 30.0G 3.0G /data
Quant au montage LOFS, il est défini dans /etc/vfstab :
/data/shared - /public/data lofs - yes ro

Lorsqu'on fait ces opérations manuellement, tout se passe très bien. En revanche, lors du reboot suivant, le service svc:/system/filesystem/local:default génère une erreur, et le système rentre en mode maintenance.

L'erreur indiquée dans le log (/var/svc/log/system-filesystem-local:default.log) est la suivante :

[ Aug 20 10:59:29 Executing start method ("/lib/svc/method/fs-local") ] mount: /data/shared : No such file or directory WARNING: /sbin/mountall -l failed: exit status 1 [ Aug 20 10:59:33 Method "start" exited with status 95 ]

Il s'avère en fait que la vfstab est traitée avant les mountpoints ZFS. Une solution de contournement apparaît donc immédiatement : il suffit d'ajouter une entrée dans la vfstab pour monter ce dataset avant le montage lofs :

monpool/mondataset - /data zfs - yes - /data/shared - /public/data lofs - yes ro

Et voilà! Mais ce n'est en réalité pas tout à fait suffisant, et au redémarrage, une nouvelle erreur se manifeste :

[ Aug 20 11:05:59 Executing start method ("/lib/svc/method/fs-local") ] filesystem 'monpool/mondataset' cannot be mounted using 'mount -F zfs' Use 'zfs set mountpoint=/data' instead. If you must use 'mount -F zfs' or /etc/vfstab, use 'zfs set mountpoint=legacy'. See zfs(1M) for more information. mount: /produits/NB: No such file or directory WARNING: /sbin/mountall -l failed: exit status 1 [ Aug 20 11:06:02 Method "start" exited with status 95 ]

Le log nous donne la solution, il ne reste plus qu'à passer la commande suivante pour que tout fonctionne correctement :

# zfs set mountpoint=legacy monpool/mondataset

La morale de l'histoire : si vous voulez déclarer des filesystems ZFS dans la vfstab, il faut les déclarer avec l'option mountpoint=legacy !