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 :


.include “../../mk/fuse.buildlink3.mk”

fichier dans lequel on peut lire :


. elif ${OPSYS} == “NetBSD”
. if !exists(/usr/include/fuse.h)
PKG_FAIL_REASON+= “Couldn’t find fuse headers, please install librefuse.”
. endif

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


file-system PUFFS

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 :

mkdir /usr/obj

cd /usr/src && ./build.sh -m i386 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 :

cd /usr/src/sys/fs/puffs

make install


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

modload /usr/lkm/puffs.o


Puis à créer son device dans /dev :

cd /dev && ./MAKEDEV puffs


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


puffs.o -s - - - BEFOREMOUNT

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 :

tar zxvf librefuse_nb4-20080115.tar.gz

cd librefuse

make install


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 :

cp fuse.h /usr/include

cp fuse_opt.h /usr/include


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

cd /usr/pkgsrc/filesystems/fuse-curlftpfs/ && make install clean


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

curlftpfs -v -o disable_epsv ftp.lip6.fr /mnt


Et de tester


~/src/librefuse$ ls -l /mnt/
total 782080
dr-xr-xr-x 2 root wheel 512 Sep 8 2006 etc
drwxr-xr-x 9 root wheel 512 Feb 16 2001 ibp
drwxr-xr-x 10 root wheel 512 Jun 22 2000 jussieu
drwxr-xr-x 2 root wheel 512 Feb 16 2001 liafa
drwxr-xr-x 5 root wheel 512 Jul 23 2003 lip6
-rw-r–r– 1 root wheel 50020898 Nov 2 09:50 ls-lR.gz
drwx—— 3 root wheel 512 Feb 16 2001 private
drwxr-xr-x 43 root wheel 1024 Jan 22 2008 pub

Magnifique.
[tags]NetBSD,FUSE,puffs[/tags]