Dernière modification : 25/01/2010 - chargement du module fuse

Dans ce billet nous verrons le cas particulier d'un serveur FTP qui peut être sur Internet ou chez vous, et pourquoi pas votre box ADSL. Par exemple sur ma box ADSL je peux connecter des clefs USB et les voir dans le système de fichiers des ordinateurs connectés au réseau de ma maison, pratique pour mettre en commun des fichiers et les emmener en voyage. Le fait de monter le serveur FTP comme un répertoire permet alors de les présenter de manière transparente aux utilisateurs. Ainsi on transforme presque la Freebox en serveur de fichiers[1] ! Bien sûr, si ce n'est pas FTP qui vous intéresse, vous adapterez les propos exposés qui se veulent généraux pour utiliser le bon outil de montage de votre service.

Montage manuel

Pour monter un serveur FTP dans un répertoire, il nous faut deux outils :

  • le système de fichiers FTP curlftpfs
  • les outils de montage manuel fuse-utils

Plus loin nous verrons d'autres outils qui permettent de monter le répertoire automatiquement ou seulement lorsqu'un accès y est demandé. On pourra ainsi déclarer de nombreux services sans pour autant avoir en permanence les connexions réseau associées actives, notamment quand on n'a pas le réseau ou pas le bon ! Pour l'instant installons donc ces deux premiers outils en supposant que vous êtes sur un Linux Debian ou dérivé comme Ubuntu :

$ sudo apt-get install curlftpfs fuse-utils

Donc fuse-utils permet de créer des répertoire virtuels avec tout ce qui peut être présenté ainsi. Il faut ensuite de quoi lier les vraies données avec le répertoire virtuel, ce que fait le paquet curlftpfs pour les serveurs FTP. Remarque : si vous cherchez des outils pour d'autres services que FTP, les mots-clefs à utiliser sont fuse ou virtual file. Vous pouvez exécuter ce genre de recherche avec la commande apt-cache search :

$ apt-cache search fuse
$ apt-cache search virtual file

Vous pouvez aussi utiliser l'outil de recherche de paquets en ligne.

Pour pouvoir utiliser fuse, il vous faut faire partie du groupe d'utilisateurs du même nom. Si ce n'est pas le cas, il faut vous y ajouter par exemple avec la commande suivante :

$ sudo adduser $(whoami) fuse

Il faut alors sortir de session et y rentrer de nouveau afin d'avoir le groupe dans la liste de vos groupes :

$ groups
jm adm sudo audio video plugdev games powerdev netdev fuse

Ensuite il faut que le module fuse soit chargé dans le système, sans quoi vous aurez une erreur du genre « device /dev/fuse doesn't exist ». La commande de chargement manuel est la suivante :

$ sudo modprobe fuse

Pour que ce module soit par la suite systématiquement chargé au démarrage de la machine, il suffit d'inscrire son petit nom dans le fichier /etc/modules avec cette commande qui demande le mot de passe root et non votre mot de passe sudo :

$ su -c 'echo fuse >> /etc/modules'

Pour monter un répertoire FTP dans votre système de fichiers, la commande est la suivante :

$ curlftpfs -o user=<username>:<password> <ftp.server.com> </chemin/vers/repertoire/local>

Vous prendrez bien soin de remplacer ce qui est entre les symboles <…> respectivement par le nom d'utilisateur FTP, le mot de passe, le serveur FTP et le chemin du répertoire local d'accueil, lequel doit pointer sur un répertoire existant. Par exemple :

$ mkdir ~/ftp.free.fr
$ curlftpfs -o user=torapamon:modepace philipjm.free.fr ~/ftp.free.fr

On peut alors lister le contenu du répertoire :

$ ls -l ~/ftp.free.fr
total 1
drwxr-xr-x 2 root root 4096 oct 25 08:42 blog/

Lorsque vous n'en avez plus l'utilité, vous démontez le répertoire avec la commande suivante :

$ fusermount -u -z </chemin/vers/repertoire/local>

Donc dans l'exemple précédent :

$ fusermount -u -z ~/ftp.free.fr

Et effectivement :

$ ls -l ~/ftp.free.fr
total 0

Comme il n'est pas pratique de taper ces commandes à chaque fois, vous pouvez les écrire dans votre script de démarrage de session ~/.bashrc ou vous créer des alias. Ceci suppose aussi que vous êtes la seule personne utilisant la machine à avoir besoin de tels montages. Dans le cas contraire, lisez la suite !

Montage automatique

Il est possible de monter vos services à chaque démarrage de la machine en modifiant le fichier de configuration de votre système de fichiers : /etc/fstab. La technique est rapidement expliquée dans la section FAQ en bas de la page du projet curlftpfs. On supposera par ailleurs que vous avez déjà installé les outils nécessaires pour la méthode manuelle. Il suffit d'ajouter pour chaque service à monter une ligne de ce type :

curlftpfs#<username>:<password>@<ftp.server.com>	</chemin/vers/repertoire/local>		fuse	allow_other,rw,user,noauto	0	0

Soit dans notre exemple :

curlftpfs#torapamon:modepace@philipjm.free.fr	/mnt		fuse	allow_other,rw,user,noauto	0	0

Vous remarquerez que, par rapport au cas manuel, on retrouve les mêmes informations mais dans un formalisme un peu différent. Il y a aussi une option supplémentaire allow_other qui sert à faire en sorte que l'on puisse lire et écrire éventuellement dans le répertoire virtuel. En effet au démarrage c'est l'administrateur root qui effectue les montages et non vous. Par conséquent, c'est seulement lui qui aura par défaut l'accès réservé au répertoire monté, ce qui n'est pas très intéressant.

Du coup vous aurez peut-être d'ailleurs à user d'autres options selon vos besoins :

  • uid change l'identifiant numérique du propriétaire des fichiers et répertoires montés
  • gid pareil que uid mais pour le groupe
  • umask change les droits appliqués aux fichiers et répertoires montés

Vous obtiendrez votre uid avec la commande id -u et votre gid avec la commande id -g. Veuillez noter que umask fonctionne comme pour les systèmes de fichiers classiques. Pour tester, pas la peine de redémarrer, il suffit de demander au système de monter le répertoire nouvellement déclaré, donc dans notre cas :

$ sudo mount /mnt
$ ls -l /mnt
total 1
drwxr-xr-x 2 root root 4096 oct 25 08:42 blog/

Montage à la demande

Maintenant nous allons voir comment on peut n'effectuer le montage des services réseau que lorsqu'il y en a réellement besoin, c'est-à-dire lorsqu'on y accède. Il y a deux outils possibles pour faire cela : afuse qui est spécifique à fuse, et autofs qui est un outil plus généraliste. Sans surprise, on installe l'un ou l'autre avec l'une des deux commandes suivantes :

$ sudo apt-get install afuse
$ sudo apt-get install autofs

À nouveau vous aurez au préalable installé les outils nécessaires pour la méthode manuelle. Quant au choix entre les deux, afuse est plutôt destiné à l'utilisateur alors que autofs est plus dans l'esprit de la solution précédente avec /etc/fstab : tous les utilisateurs pourront utiliser les répertoires montés. Un point commun aux deux est que les répertoires virtuels seront créés automatiquement dans un répertoire parent. Nous verrons aussi que autofs est plus souple et rendra probablement de meilleurs services.

En pratique l'utilisation de afuse consiste à lui déclarer une commande de montage et une de démontage (en gras) pour un répertoire local parent donné et existant déjà, dans votre répertoire personnel a priori :

$ afuse -o mount_template='curlftpfs %r %m' -o unmount_template='fusermount -u -z %m' </chemin/vers/repertoire/parent>

Dans les commandes de montage/démontage, %r sera remplacé par le serveur et %m le chemin du répertoire local d'accueil à l'exécution de la commande. Ce qui peut surprendre au départ, et c'est le principal inconvénient, c'est que le répertoire parent est vide tant qu'on n'a pas utilisé de service réseau. C'est seulement lorsqu'on tente d'accéder à un sous-répertoire que celui-ci va apparaître, par exemple :

$ afuse -o mount_template='curlftpfs %r %m' -o unmount_template='fusermount -u -z %m' ~/ftp
$ ls ~/ftp
total 0
$ ls ~/ftp/philipjm.free.fr
total 1
drwxr-xr-x 2 root root 4096 oct 25 08:42 blog/

En fait afuse utilise le chemin que vous demandez pour en déduire le nom du serveur FTP où vous voulez aller. Si vous avez besoin de vous authentifier, il faut alors ajouter vos identifiants devant le nom du serveur selon le formalisme standard des adresses web :

$ ls </chemin/vers/repertoire/parent>/username:password@ftp.server.com

Qui devient donc dans l'exemple :

$ ls ~/ftp/torapamon:modepace@philipjm.free.fr
total 1
drwxr-xr-x 2 root root 4096 oct 25 08:42 blog/

Ceci ne fonctionnera toutefois pas si vous avez un caractère arrobase « @ » dans votre nom d'utilisateur. En outre afuse ne se souviendra pas pour vous des services auxquels vous avez droit (les adresses web), il faut retaper l'URL à chaque fois, c'est là qu'il est plus intéressant de passer à autofs

Pour faire fonctionner autofs avec curlftpfs, il faut déclarer dans le fichier principal de montage autofs un répertoire parent et un autre fichier de configuration autofs que nous allons créer plus loin. On l'édite par exemple avec nano :

$ sudo nano /etc/auto.master

On ajoute alors dans ce fichier la ligne suivante en fin de fichier :

/ftp    /etc/auto.ftp uid=1000,gid=1000,--timeout=30,--ghost

Ici nous décidons de monter nos répertoires FTP dans le répertoire /ftp qui sera créé au démarrage du service autofs. Ainsi tout autre nom est possible dans la mesure où il ne télescope pas un répertoire existant et non vide. Comme indiqué en gras dans la ligne de configuration précédente, le fichier de configuration à créer est /etc/auto.ftp. Nous avons par ailleurs ajouté des options :

  • pour modifier le propriétaire et le groupe des fichiers montés (uid, gid)
  • pour réduire à 30s le temps d'attente avant démontage automatique des répertoires (--timeout=30)
  • pour toujours afficher les répertoires qui peuvent être montés (--ghost)

C'est cette dernière option qui fera que le répertoire d'accueil contient la liste des services déclarés même lorsqu'ils ne sont pas montés. Vous pouvez bien sûr adapter tout cela à vos besoins, notamment les droits des fichiers et répertoires. Reste à créer le nouveau fichier de configuration :

$ sudo nano /etc/auto.ftp

On place alors dedans une ligne par serveur FTP à monter, par exemple :

ftp.freebox.fr      -fstype=fuse,allow_other,user=freebox:1234    :curlftpfs\#hd1.freebox.fr
philipjm.free.fr    -fstype=fuse,allow_other,user=torapamon:modepace   :curlftpfs\#philipjm.free.fr

À nouveau c'est toujours les mêmes informations qu'on retrouve mais avec un formalisme encore un peu différent… Vous noterez que le fait de pouvoir spécifier cette fois l'option user permet d'écrire le caractère @ inaccessible avec la solution afuse. Il ne reste plus qu'à redémarrer autofs :

$ sudo /etc/init.d/autofs restart
Stopping automounter: done.
Starting automounter: done.

On peut alors savoir s'il a bien vu notre configuration (gras ajouté) :

$ sudo /etc/init.d/autofs status
Configured Mount Points:
------------------------
/usr/sbin/automount --timeout=30 --ghost /ftp file /etc/auto.ftp uid=1000,gid=1000,, 

Active Mount Points:
------------------------
/usr/sbin/automount --pid-file=/var/run/autofs/_etc_auto.ftp.pid --timeout=30 --ghost /ftp file /etc/auto.ftp uid=1000,gid=1000,,

Tout va bien et effectivement le répertoire parent contient bien ce qui a été spécifié :

$ ls /ftp/
ftp.freebox.fr  philipjm.free.fr
$ ls /ftp/ftp.freebox.fr/
Disque dur
$ tree /ftp/ftp.freebox.fr/Disque\ dur/
/ftp/ftp.freebox.fr/Disque dur/
|-- Enregistrements
`-- Video

2 directories, 0 files

Comme vous pouvez le constater, nous avons ainsi pu exécuter la commande tree qui affiche dans la console l'arborescence d'un répertoire, alors que cette commande n'est pas sensée fonctionner sur un répertoire FTP distant.

Pour finir, si vous avez des problèmes pour accéder à vos serveurs via autofs, vous obtiendrez certainement des informations intéressantes dans le fichier journal des services de Linux (gras ajouté) :

$ tail /var/log/daemon.log
Oct 25 21:26:33 lenny automount[11059]: >> Enter host password for user 'freebox':Error connecting to ftp: Access denied: 530
Oct 25 21:26:33 lenny automount[11059]: mount(generic): failed to mount curlftpfs#hd1.freebox.fr (type fuse) on /mnt/ftp.freebox.fr
Oct 25 21:26:33 lenny automount[11059]: failed to mount /mnt/ftp.freebox.fr
Oct 25 21:38:02 lenny automount[12312]: >> Error connecting to ftp: Got a 421 ftp-server response when 220 was expected
[…]

Dans ce cas il ne vous reste plus qu'à rechercher sur Internet la signification de ces erreurs, ici erreur de mot de passe et nombre de connexions maxi simultanées atteint.

Notes

[1] toutefois avec la Freebox il y a des problèmes d'écriture via Fuse : refus sous Debian Lenny et écriture au deuxième essai seulement pour la future Squeeze (voir le rapport de bug Debian correspondant)