puffs et FUSE sous NetBSD

NetBSD 4.0 a vu apparaitre un nouveau filesystem, plus ou moins équivalent au FUSE de GNU/Linux. Il s’agit de proposer un framework qui permettra de manipuler sous forme de filesystem (via les opérations associées open, close, read, write…) des outils userland. Parmi les plus pratiques de ces utilisations, citons par exemple SSHfs ou CurlFtpFS. Et c’est précisemment de cette dernière abstraction dont j’ai recemment eu besoin.

Un rapide tour dans pkgsrc nous montre l’existence du package filesystems/fuse-curlftpfs, ce qui signifie que ce que nous envisageons semble à portée. On note cependant dans le Makefile de ce package la dépendance suivante :

fichier dans lequel on peut lire :

Munis de ces quelques informations, une recherche bien placée nous dirige evidemment sur NetBSD.org, et en particulier à la section dédiée à puffs. Là, nous pouvons lire la chose suivante : _ Using FUSE file systems on NetBSD 4.0 is possible, but in addition to adding puffs support support to the kernel, it requires fetching and manually installing a backport of the ReFUSE library. The library is available here and further instructions are available here. _ Bien. Résumons :

Pour utiliser FUSE et ses nombreux backends, nous avons besoin :

  • Du support puffs dans le noyau
  • Du backport de la librairie ReFUSE Execution.

Le support puffs s’active de deux façons differentes, directement dans la configuration du noyau via la directive

ou plus simplement en chargeant un module noyau. C’est cette derniere methode, bien moins contraignante, pour laquelle nous allons opter.

Pour mon plus grand malheur, dans une installation de base, pas trace d’un /usr/lkm/puffs.o, il est donc nécessaire de compiler ce dernier puis l’installer. D’abord, la documentation officielle explique qu’il fau placer la variable MKPUFFS=yes dans le fichier /etc/mk.conf. Ensuite, puisque cette machine comporte bien les sources du système mais n’a jamais reconstruit quoi que ce soit concernant la base, construisons les tools :

Operation à l’issue de laquelle un repertoire /usr/src/tooldir.NetBSD-uname -r-i386 devrait avoir fait son apparition. Il est maintenant possible de construire notre module en se rendant dans son repertoire source :

Un module noyau est maintenant disponible dans /usr/lkm, reste à le charger :

Puis à créer son device dans /dev :

Et afin d’automatiser cette opération à chaque reboot, de placer dans le fichier /etc/lkm/conf la ligne suivante :

Maintenant que notre système est puffs-ready, il est temps d’installer la couche d’emulation FUSE pour puffs, ReFUSE.

On trouve le lien vers le backport NetBSD 4.0 de la libReFUSE dans la page de puffs chez NetBSD.org. À l’heure ou j’écris ces lignes, ce backport se trouve ici et la documentation associée, ici.

L’installation est “à peu près” complète :

Mais l’auteur a oublié de mentionner qu’il fallait copier les fichiers fuse.h et fuse_opt.h dans /usr/include pour satisfaire buildlink. Donc :

Voila ! il est maintenant possible d’installer un backend FUSE issu de pkgsrc :

De le démarrer (attention cette commande ne rend pas la main):

Et de tester

Magnifique.