SHFS

Introduction

SHFS (SHell File System) est un projet consistant en un module du noyau et des outils de montage/démontage de dossiers distants via SSH.

C'est un moyen 'secure' d'accéder à ses ressources distantes puisqu'il repose sur SSH (beaucoup plus sûr que NFS, Samba, FTP,...).


Pour les références, voir la rubrique Liens


Installation

Pour compiler le module du noyau, il est nécessaire de disposer de la même version de GCC que celle utilisée pour compiler le noyau:

[sam avr 09 13:39:01 root@deepglue shfs]
# cat /proc/version
Linux version 2.6.8.1-24mdk (qateam@updates.mandrakesoft.com) (gcc version 3.4.1 (Mandrakelinux 10.1 3.4.1-4mdk)) #1 Fri Jan 14 03:01:00 MST 2005
[sam avr 09 13:39:05 root@deepglue shfs]
# gcc --version
gcc (GCC) 3.4.1 (Mandrakelinux 10.1 3.4.1-4mdk)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

[sam avr 09 13:39:13 root@deepglue shfs]
#

C'est bien la même version.


J'ai extrait l'archive shfs-0.35.tar.gz dans /usr/local/src:

[sam avr 09 13:40:00 root@deepglue shfs]
# cd /usr/local/src/
[sam avr 09 13:40:04 root@deepglue src]
# tar -xzf /home/steph/2005_03_09/shfs/shfs-0.35.tar.gz
[sam avr 09 13:40:22 root@deepglue src]
# cd shfs-0.35/


Dans le dossier shfs-0.35, j'ai compilé le module:

[sam avr 09 13:40:26 root@deepglue shfs-0.35]
# make
make[1]: Entering directory `/usr/local/src/shfs-0.35/shfs'
make[2]: Entering directory `/usr/local/src/shfs-0.35/shfs/Linux-2.6'
make -C //lib/modules/2.6.8.1-24mdk/build SUBDIRS=/usr/local/src/shfs-0.35/shfs/Linux-2.6 modules
make[3]: Entering directory `/usr/src/linux-2.6.8.1-24mdk'
CC [M]  /usr/local/src/shfs-0.35/shfs/Linux-2.6/dcache.o
CC [M]  /usr/local/src/shfs-0.35/shfs/Linux-2.6/dir.o
CC [M]  /usr/local/src/shfs-0.35/shfs/Linux-2.6/fcache.o
CC [M]  /usr/local/src/shfs-0.35/shfs/Linux-2.6/file.o
CC [M]  /usr/local/src/shfs-0.35/shfs/Linux-2.6/inode.o
CC [M]  /usr/local/src/shfs-0.35/shfs/Linux-2.6/ioctl.o
CC [M]  /usr/local/src/shfs-0.35/shfs/Linux-2.6/proc.o
CC [M]  /usr/local/src/shfs-0.35/shfs/Linux-2.6/shell.o
CC [M]  /usr/local/src/shfs-0.35/shfs/Linux-2.6/symlink.o
LD [M]  /usr/local/src/shfs-0.35/shfs/Linux-2.6/shfs.o
Building modules, stage 2.
MODPOST
CC      /usr/local/src/shfs-0.35/shfs/Linux-2.6/shfs.mod.o
LD [M]  /usr/local/src/shfs-0.35/shfs/Linux-2.6/shfs.ko
make[3]: Leaving directory `/usr/src/linux-2.6.8.1-24mdk'
make[2]: Leaving directory `/usr/local/src/shfs-0.35/shfs/Linux-2.6'
make[1]: Leaving directory `/usr/local/src/shfs-0.35/shfs'
make[1]: Entering directory `/usr/local/src/shfs-0.35/shfsmount'
gcc -g -Wall -I- -I. -I../shfs/Linux-2.4/ -DSHFS_VERSION="0.35" -c shfsmount.c -o shfsmount.o
sed -e '/^[ ]*#/d;/^$/d;s/\/\\/g;s/"/\"/g;s/^(.*)$/"1\n"/' <shell-test.in | sed -e "s/'/'\\\\''/g" >shell-test.h
sed -e '/^[ ]*#/d;/^$/d;s/\/\\/g;s/"/\"/g;s/^(.*)$/"1\n"/' <shell-code.in | sed -e "s/'/'\\\\''/g" >shell-code.h
sed -e '/^[ ]*#/d;/^$/d;s/\/\\/g;s/"/\"/g;s/^(.*)$/"1\n"/' <perl-test.in | sed -e "s/'/'\\\\''/g" >perl-test.h
sed -e '/^[ ]*#/d;/^$/d;s/\/\\/g;s/"/\"/g;s/^(.*)$/"1\n"/' <perl-code.in | sed -e "s/'/'\\\\''/g" >perl-code.h
gcc -g -Wall -I- -I. -I../shfs/Linux-2.4/ -DSHFS_VERSION="0.35" -c proto.c -o proto.o
gcc  -o shfsmount shfsmount.o proto.o
gcc -g -Wall -I- -I. -I../shfs/Linux-2.4/ -DSHFS_VERSION="0.35" -c shfsumount.c -o shfsumount.o
gcc  -o shfsumount shfsumount.o
make[1]: Leaving directory `/usr/local/src/shfs-0.35/shfsmount'
make[1]: Entering directory `/usr/local/src/shfs-0.35/docs'
make[2]: Entering directory `/usr/local/src/shfs-0.35/docs/manpages'
make[2]: Rien à faire pour « all ».
make[2]: Leaving directory `/usr/local/src/shfs-0.35/docs/manpages'
make[2]: Entering directory `/usr/local/src/shfs-0.35/docs/html'
make[2]: Rien à faire pour « all ».
make[2]: Leaving directory `/usr/local/src/shfs-0.35/docs/html'
make[1]: Leaving directory `/usr/local/src/shfs-0.35/docs'
[sam avr 09 13:41:04 root@deepglue shfs-0.35]
#


Comme recommandé dans la FAQ, j'ai testé le module avant de l'installer:

[sam avr 09 13:41:19 root@deepglue shfs-0.35]
# ls shfs/Linux-2.6/
dcache.c  fcache.c  inode.c  kernel-config.diff  proc.o        shfs_fs.h     shfs.ko     symlink.c
dcache.o  fcache.o  inode.o  Makefile            shell.c       shfs_fs_i.h   shfs.mod.c  symlink.o
dir.c     file.c    ioctl.c  proc.c              shell.o       shfs_fs_sb.h  shfs.mod.o
dir.o     file.o    ioctl.o  proc.h              shfs_debug.h  shfs.h        shfs.o
[sam avr 09 13:41:25 root@deepglue shfs-0.35]
# insmod shfs/Linux-2.6/shfs.o
insmod: error inserting 'shfs/Linux-2.6/shfs.o': -1 Invalid module format
[sam avr 09 13:41:42 root@deepglue shfs-0.35]
# insmod shfs/Linux-2.6/shfs.ko
[sam avr 09 13:42:05 root@deepglue shfs-0.35]
#

Dans un premier temps, je me suis trompé de module:
C'est '.ko' et non '.o' pour les noyaux 2.6


J'ai ensuite tenté le montage:

[sam avr 09 13:42:05 root@deepglue shfs-0.35]
# ./shfsmount/shfsmount root@192.168.52.196 /mnt/disk
Warning: Permanently added '192.168.52.199' (RSA) to the list of known hosts.
root@192.168.52.199's password:
[sam avr 09 13:43:40 root@deepglue shfs-0.35]
# ls /mnt/disk
chgproprio.sh*                  discover*                          memtest.img*
coucou.txt                      echange_classes.sh                 modules.dis
createtemplateparc.sh*          etc_skel_user.tar.gz               rediriger_Docs_vers_Classes.sh*
createtemplateparc.sh.reserve*  finsdelignesdos.sh*                retablir_Docs_dans_home.sh*
createtemplateparc_vrac.sh*     home_hugov_profile.tar.gz          tmp/
creer_classes_profs_prof.sh*    home_netlogon_Default_User.tar.gz
[sam avr 09 13:43:43 root@deepglue shfs-0.35]
#

J'ai bien obtenu l'accès au dossier personnel de root sur une machine SambaEdu3 de test distante.


J'ai donc procédé à l'installation du module:

[sam avr 09 13:43:58 root@deepglue shfs-0.35]
# make install
make[1]: Entering directory `/usr/local/src/shfs-0.35/shfs'
make[2]: Entering directory `/usr/local/src/shfs-0.35/shfs/Linux-2.6'
rm -f //lib/modules/2.6.8.1-24mdk/kernel/fs/shfs/shfs.ko
install -m644 -b -D shfs.ko //lib/modules/2.6.8.1-24mdk/kernel/fs/shfs/shfs.ko
if [ -x /sbin/depmod -a "/" = "/" ]; then /sbin/depmod -aq; fi
make[2]: Leaving directory `/usr/local/src/shfs-0.35/shfs/Linux-2.6'
make[1]: Leaving directory `/usr/local/src/shfs-0.35/shfs'
make[1]: Entering directory `/usr/local/src/shfs-0.35/shfsmount'
install -m755 -b -D shfsmount //usr/bin/shfsmount
install -m755 -b -D shfsumount //usr/bin/shfsumount
if [ ! -d //sbin ]; then mkdir //sbin; fi
ln -fs /usr/bin/shfsmount //sbin/mount.shfs
make[1]: Leaving directory `/usr/local/src/shfs-0.35/shfsmount'
make[1]: Entering directory `/usr/local/src/shfs-0.35/docs'
make[2]: Entering directory `/usr/local/src/shfs-0.35/docs/manpages'
install -m644 -b -D shfsmount.8 //usr/share/man/man8/shfsmount.8
install -m644 -b -D shfsumount.8 //usr/share/man/man8/shfsumount.8
make[2]: Leaving directory `/usr/local/src/shfs-0.35/docs/manpages'
make[2]: Entering directory `/usr/local/src/shfs-0.35/docs/html'
make[2]: Rien à faire pour « install ».
make[2]: Leaving directory `/usr/local/src/shfs-0.35/docs/html'
make[1]: Leaving directory `/usr/local/src/shfs-0.35/docs'
[sam avr 09 13:45:46 root@deepglue shfs-0.35]
#


Le module est en place, mais il reste encore des choses à faire, comme nous allons le voir ci-dessous.


Utilisation en utilisateur standard

J'ai tenté le montage en utilisateur standard:

[sam avr 09 13:46:57 steph@deepglue shfs]
$ mkdir /home/steph/mnt/ssh
[sam avr 09 13:47:05 steph@deepglue shfs]
$ mount -t shfs root@192.168.52.199 /home/steph/mnt/ssh
mount: seul l'usager ROOT peut faire cela
[sam avr 09 13:47:08 steph@deepglue shfs]
$ shfsmount root@192.168.52.199 /home/steph/mnt/ssh
root@192.168.52.199's password:
shfsmount: Operation not permitted
[sam avr 09 13:47:44 steph@deepglue shfs]
$

C'est un échec!


La FAQ mentionne le fait qu'il faut positionner le bit SUID sur les programmes shfsmount et shfsumount.

Voici l'état initial:

[sam avr 09 13:48:31 root@deepglue shfs]
# ls -l /usr/bin/shfsmount
-rwxr-xr-x  1 root root 51740 avr  9 13:45 /usr/bin/shfsmount*
[sam avr 09 13:48:49 root@deepglue shfs]
# ls -l /usr/bin/shfsumount
-rwxr-xr-x  1 root root 15055 avr  9 13:45 /usr/bin/shfsumount*
[sam avr 09 13:48:55 root@deepglue shfs]
#


J'ai effectué la modification:

[sam avr 09 13:49:34 root@deepglue shfs]
# chmod +s /usr/bin/shfsmount
[sam avr 09 13:49:55 root@deepglue shfs]
# ls -l /usr/bin/shfsmount
-rwsr-sr-x  1 root root 51740 avr  9 13:45 /usr/bin/shfsmount*
[sam avr 09 13:49:59 root@deepglue shfs]
# chmod +s /usr/bin/shfsumount
[sam avr 09 13:50:13 root@deepglue shfs]
# ls -l /usr/bin/shfsumount
-rwsr-sr-x  1 root root 15055 avr  9 13:45 /usr/bin/shfsumount*
[sam avr 09 13:50:16 root@deepglue shfs]
#


J'ai effectué le montage et contrôlé le contenu du dossier:

[sam avr 09 13:50:27 steph@deepglue shfs]
$ shfsmount root@192.168.52.199 /home/steph/mnt/ssh
root@192.168.52.199's password:
[sam avr 09 13:50:52 steph@deepglue shfs]
$ ls /home/steph/mnt/ssh
chgproprio.sh*                  discover*                          memtest.img*
coucou.txt                      echange_classes.sh                 modules.dis
createtemplateparc.sh*          etc_skel_user.tar.gz               rediriger_Docs_vers_Classes.sh*
createtemplateparc.sh.reserve*  finsdelignesdos.sh*                retablir_Docs_dans_home.sh*
createtemplateparc_vrac.sh*     home_hugov_profile.tar.gz          tmp/
creer_classes_profs_prof.sh*    home_netlogon_Default_User.tar.gz
[sam avr 09 13:50:59 steph@deepglue shfs]
$


J'ai contrôlé que j'avais bien un accès en écriture aussi:

[sam avr 09 13:50:59 steph@deepglue shfs]
$ echo coucou > /home/steph/mnt/ssh/coucou2.txt
[sam avr 09 13:51:12 steph@deepglue shfs]
$ ls /home/steph/mnt/ssh
chgproprio.sh*                  creer_classes_profs_prof.sh*  home_netlogon_Default_User.tar.gz
coucou2.txt                     discover*                     memtest.img*
coucou.txt                      echange_classes.sh            modules.dis
createtemplateparc.sh*          etc_skel_user.tar.gz          rediriger_Docs_vers_Classes.sh*
createtemplateparc.sh.reserve*  finsdelignesdos.sh*           retablir_Docs_dans_home.sh*
createtemplateparc_vrac.sh*     home_hugov_profile.tar.gz     tmp/
[sam avr 09 13:51:14 steph@deepglue shfs]
$


Puis j'ai démonté la ressource:

[sam avr 09 13:51:14 steph@deepglue shfs]
$ shfsumount /home/steph/mnt/ssh
[sam avr 09 13:51:35 steph@deepglue shfs]
$


Options

Il existe bien d'autres options mentionnées dans la FAQ:

Examples
	The simplest version (mount home dir of user at host):
	shfsmount user@host /mnt/shfs


	To specify remote directory:
	shfsmount user@host:/tmp /mnt/shfs


	To specify another port:
	shfsmount -P 2222 user@host /mnt/shfs


	To specify another ssh option:
	shfsmount --cmd="ssh -c blowfish %u@%h /bin/bash" user@host:/tmp /mnt/shfs/


	To make mount survive temporary connection outage (reconnect mode):
	shfsmount --persistent user@host /mnt/shfs


	Longer transfers? Increase cache size (1MB cache per file):
	shfsmount user@host /mnt/shfs -o cachesize=256


	To enable symlink resolution:
	shfsmount -s user@host /mnt/shfs


	To preserve uid (gid) (NFS replace mode :-)):
	shfsmount root@host /mnt/shfs -o preserve,rmode=755


	To see what is wrong (forces kernel debug output too):
	shfsmount -vvv user@host /mnt/shfs


Liens

Le site du projet: http://shfs.sourceforge.net/

L'archive utilisée: http://ovh.dl.sourceforge.net/sourceforge/shfs/shfs-0.35.tar.gz