Lorsque lâon fait des recherches sur le partage de dossier sous Linux, la solution la plus souvent proposĂ©e sâappuie sur des partages SAMBA.
Le problĂšme est que SAMBA (ou SMB) nâa pas Ă©tĂ© pensĂ© pour les systĂšmes Linux, mais est issue dâune veille technologie Microsoft comportant de nombreuses limitations vis-Ă -vis dâUnix.
Hormis la gestion des droits, le fait que les noms de fichiers ne soient pas sensibles Ă la casse (majuscules/minuscules) peut la source dâeffets inattendus.
Le support du partage des fichiers sous Linux
Le systÚme de partage natif sous Linux est NFS (Network File System), la gestion des droits est alors pleinement supportée, mais pour cela il faut que les utilisateurs soient déclarés sur toutes les machines concernées et avec le bon « mapping » (user_name/user_id et goup_name/goup_id), une contrainte qui dans certains cas est difficile à satisfaire, en particulier avec un NAS propriétaire (quelle que soit sa marque).
Attention sur Internet on trouve de nombreux articles qui confondent NSF et SMB. ; le second acronyme étant un raccourci pour SAMBA.
Il existe de nombreuses solutions pour Ă©changer des fichiers, mais le choix de sshfs sâinscrit dans une solution permettant un accĂšs aux fichiers Ă travers le systĂšme de fichier (« file system ») natif de la machine.
Par exemple une solution comme ftp ne correspond pas Ă cela, car vous ne pouvez pas avec nâimporte quel logiciel atteindre un fichier stockĂ© sur un serveur ftp.
Mais les solutions permettant de partager des partitions en fond partie, elles sont cependant sans doute plus adaptées à des besoins professionnels ou ponctuels :
- Network block device,
- Le ISCSI est typiquement une solution plutĂŽt orientĂ©e professionnel et qui nâest pas destinĂ©e Ă partager des fichiers entre des machines mais plus Ă dĂ©porter des disques (des partitions).
sshfs
Pour ssh et fs, ce qui veut dire « systÚme de fichier » (« File System ») sur ssh (« Secure Shell Protocol »).
Précision préalable
Ce billet ne prĂ©tend pas dire que sshfs est la solution ultime. Certaines fonctionnalitĂ©s peuvent aussi bien ĂȘtre vues comme un avantage que comme un inconvĂ©nient.
Ce billet suppose que vous sachiez configurer ssh, en particulier crĂ©er une paire de clĂ© dont la paire doit rester sur le client et la clĂ© publique ĂȘtre dĂ©finie dans le fichier ~/.ssh/authorized_keys
de lâordinateur serveur (le ~
indiquant le dossier personnel de lâutilisateur qui est Ă lâorigine du partage).
Pourquoi utiliser sshfs ?
- Parce que SAMBA demande lâinstallation dâun service dĂ©diĂ©, que la configuration et que le support des fonctionnalitĂ©s Unix est partiel,
- Parce que NFS câest contraignant et que la configuration se fait au niveau administrateur,
- Parce que sshfs ça doit sâutiliser dans un contexte utilisateur (pas en tant quâutilisateur root) et que la configuration se fait par lâutilisateur qui effectue le partage.
Il est possible dâaffiner la configuration en tant que root, en particulier durcir ("hardening") la sĂ©curitĂ© au niveau de FUSE.
PrĂ©cautions dâutilisation
Un utilisateur qui partage un accĂšs ssh Ă un tiers, dĂ©lĂšgue tous ces droits sur la machine, y compris celui dâexĂ©cuter des applications.
sshfs est basĂ© sur FUSE qui ne fait pas partie du noyau Linux, câest pourquoi vous devez proscrire dâutiliser sshfs en root, afin de protĂ©ger votre machine dâĂ©ventuelle attaques.
Installation sur le serveur
ssh est requis, mais il est probablement déjà présent.
Concernant la configuration, il nây a rien Ă faire pour sshfs proprement dit, mais ssh doit ĂȘtre fonctionnel.
Comme dis plus haut, lâobjet de ce billet nâest pas la configuration de ssh.
Installation sur le client
Il suffit dâinstaller le paquet sshfs
sudo apt install -y sshfs
- Vous devrez veiller Ă ce que les utilisateurs potentiels de sshfs fassent bien partie du groupe fuse.
- Il est probable, surtout si vous utilisez lâauthentification ssh par certificat (ce qui est le principal intĂ©rĂȘt de sshfs), que vous deviez redĂ©marrer la machineâŠ
Vous obtiendrez lâerreur « failed to open /dev/fuse: Permission denied » si les points prĂ©cĂ©dents ne sont pas vĂ©rifiĂ©s.
Monter un répertoire avec sshfs
En partant du principe que vous pouvez vous connecter en ssh sur la machine serveur, tout ce passe cÎté client.
Comme pour tous point de montage, vous devez avoir un répertoire vide qui « recevra » le dossier que vous souhaitez monter. Par exemple :
cd "$( xdg-user-dir DOCUMENTS )" # Version plus portable de : cd ~/Documents
mkdir mon_point_de_montage_sshfs
Vous pouvez alors utiliser les commandes suivantes :
sshfs [user@]host:[dir] mountpoint [options]
qui sâappuie directement sur FUSE,mount.sshfs [user@]host:[dir] mountpoint [options]
qui permet de retrouver la syntaxe demount
,- et enfin, la commande
mount
 :mount -v -t sshfs [user@]host:[dir] mountpoint [options]
La syntaxe utilisant sshfs est largement documentĂ©e, mais je prĂ©fĂšre rester sur la syntaxe de mount puisque lâidĂ©e est dâunifier la gestion des fichiers.
Quelques spécificités de sshfs
Avec sshfs on nâa pas la notion de crĂ©ation de partage, il est possible de monter nâimporte quel dossier accessible par lâutilisateur et se fait relativement Ă cet utilisateur.
ainsi :
mount -v -t sshfs pi@192.168.1.102: mon_point_de_montage_sshfs
Montera le dossier $HOME
de lâutilisateur pi
sur la machine 192.168.1.102
dans le dossier local mon_point_de_montage_sshfs
Pour démonter, utiliser simplement :
umount mon_point_de_montage_sshfs # Implique dâĂȘtre dans le mĂȘme dossier que pour la commande mount
Si câest lâĂ©criture minimale, je vous dĂ©courage, en dehors dâun usage trĂšs spĂ©cifique, lâutilisation relative aussi bien sur lâordinateur distant, mais plus encore sur lâordinateur local.
Voici dont écriture, permettant de mieux contrÎler ce que vous faites :
Sur la machine distante, on utilisera le chemin permettant dâaccĂ©der au dossier depuis la racine de la machine, on suppose quâil sâagit de /home/pi
.
Sur la machine locale, on utilisera le chemin complet vers le point de montage, vous pouvez résoudre ce chemin en utilisant :
realpath mon_point_de_montage_sshfs
ou dans le cas de notre exemple :
realpath "$( realpath "$( xdg-user-dir DOCUMENTS )/mon_point_de_montage_sshfs" )"
On aura alors quelque chose comme :
mount -v -t sshfs pi@192.168.1.102:/home/pi /home/user/Documents/mon_point_de_montage_sshfs
Le dĂ©montage se fera Ă lâaide de umount :
umount /home/user/Documents/mon_point_de_montage_sshfs
Notez que :
- Vous nâavez pas besoin (et que vous ne devez pas) utiliser sudo pour mount et umount dans ce cas,
- Aucun autre utilisateur (mĂȘme pas lâutilisateur root) nâa accĂšs au partage â Cette caractĂ©ristique est hĂ©ritĂ© de FUSE.
Options de sshhf
idmap=XXX
â Permet de gĂ©rer la transformation des UID/GID distants vers les valeurs locales.
Les valeurs possibles sont :
* `none` â pas de traduction de lâespace ID (par dĂ©faut).
* `user` â mapper lâUID/GID de lâutilisateur distant Ă lâUID/GID de lâutilisateur de montage.
* `file` â traduire les UID/GID en fonction du contenu de --uidfile et --gidfile.
En cas de doute, lâoption idmap=user
est probablement ce que vous souhaitez.
Options liĂ©es Ă lâoptimisation de sshhf
Attention :
Beaucoup de solutions proposĂ©es pour « optimiser » sshfs ont pour consĂ©quence directe de rĂ©duire sĂ©rieusement la sĂ©curitĂ©, si cela peut ĂȘtre acceptable (et encore) sur votre rĂ©seau local, câest Ă bannir si vous laisser un « port ssh » ouvert vers lâextĂ©rieur.
Je vous déconseille de jouer avec la sécurité de ssh si vous ne savez pas ce que vous faites.
Je trouve les performances de sshfs trĂšs correctes, j'ai testĂ© la configuration ci-dessus, pas assez finement cependant pour avoir un avis dĂ©finitif, mais je ne suis pas prĂšs ni Ă sacrifier la sĂ©curitĂ© de mes machines, ni utilisĂ© des options qui me semble ĂȘtre inadaptĂ©es (voire dangereuses ou contre-productives).
Jâai pris le temps de dĂ©tailler ce que font ces options (ce qui nâest gĂ©nĂ©ralement pas prĂ©sent dans les articles qui parlent dâoptimisation) afin de faire votre choix.
-
Conseils trouvĂ©s autour de lâoptimisation
De nombreuses couches sont impliquĂ©es dans sshfs, les options sâadressent donc Ă des couches diffĂ©rentes, je prĂ©cise les options prĂ©conisĂ©es pour lâoptimisation, ce quâelles font et Ă quelle couche elles sâadressent.
En fonction des machines concernĂ©es (disponibilitĂ© du CPU, RAMâŠ) vous pouvez envisager les optimisations suivantes :
 Option Traitée par Commentaire Ciphers=arcfour
ssh â Attention ce protocole est maintenant considĂ©rĂ© comme peu sur, les prĂ©conisations sont plutĂŽt de dĂ©sactiver cela vos machines. Compression=no
ssh đ Suivant le type de donnĂ©es transportĂ©es compresser peut ralentir plus que gagner du temps. ServerAliveCountMax=3
ssh â Pas dâavis, Ă creuser ServerAliveInterval=15
ssh â Pas dâavis, Ă creuser cache=yes
??? â Ă creuser kernel_cache
fuse đ Cette option dĂ©sactive le vidage du cache du contenu du fichier Ă chaque ouverture. Cela ne devrait ĂȘtre activĂ© que sur les systĂšmes de fichiers, oĂč les donnĂ©es du fichier ne sont jamais modifiĂ©es de maniĂšre externe (pas via le systĂšme de fichiers FUSE montĂ©). Ainsi, il n'est pas adaptĂ© aux systĂšmes de fichiers rĂ©seau et aux autres systĂšmes de fichiers "intermĂ©diaires". large_read
??? â Ă creuser reconnect
sshfs đ Relance la connexion au serveur si nĂ©cessaire. workaround=all
sshfs đ Voir ci-dessous, je suis trĂšs Ă©tonnĂ© de ce choix, cela ne concerne pas lâoptimisation Ă mon sens, et ne devrait pas ĂȘtre utilisĂ© sans de bonnes raisons. -o workaround=LIST
â liste de solutions de contournement sĂ©parĂ©es par deux-points :
*none
â đ Aucune solution de contournement activĂ©e
*[no]rename
â đ Ămulez lâĂ©crasement dâun fichier existant en le supprimant et en le renommant. (par dĂ©faut : dĂ©sactivĂ©)
*[no]renamexdev
â â Faire Ă©chouer le changement de nom avec EXDEV au lieu de l'EPERM par dĂ©faut pour permettre le dĂ©placement de fichiers sur des systĂšmes de fichiers distants. (par dĂ©faut : dĂ©sactivĂ©)
*[no]truncate
â đ Contournez les serveurs qui ne prennent pas en charge la troncation en copiant lâintĂ©gralitĂ© du fichier, en le tronquant localement et en le renvoyant. (par dĂ©faut : dĂ©sactivĂ©)
*[no]buflimit
â đ Corrige un bogue de remplissage de tampon (« buffer fillup ») dans le serveur. (par dĂ©faut : dĂ©sactivĂ©)
*[no]fstat
â đ Contournez les serveurs dĂ©fectueux qui ne prennent pas en charge fstat() en utilisant stat() Ă la place. (par dĂ©faut : dĂ©sactivĂ©)
*[no]createmode
â đ Contournez les serveurs cassĂ©s qui produisent une erreur lors du passage dâun mode non nul Ă crĂ©er, en passant toujours un mode de 0. (par dĂ©faut : dĂ©sactivĂ©)sshfs -o cache=yes -o large_read -o Compression=no -o ServerAliveCountMax=3 -o ServerAliveInterval=15 -o reconnect remoteuser@server:/remote/directory/ /media/mountpoint
les liens symboliques
Les liens symboliques ("symlink"), comme les liens durs ("hardlink") ne sont pas un problÚme pour sshfs, sauf dans un cas : si vous souhaitez monter dossier qui est en fait un lien symbolique.
Câest le cas des points de montage samba sur les NAS QNAP par exemple.
Pour Ă©viter dâavoir une erreur, vous devez aller au delĂ du lien et câest fort simple, il suffit dâajouter un /
final.
Au lieu dâutiliser :
mount -v -t sshfs admin@192.168.1.121:/share/photos /media/sshfs-username/photos
Utiliser :
mount -v -t sshfs admin@192.168.1.121:/share/photos/ /media/sshfs-username/photos
Astuce
Par convention les points de montage se font dessous le répertoire /media
cependant, en tant quâutilisateur, vous ne pouvez pas Ă©crire dans ce dossier.
Je vous propose donc de créer un dossier sous /media
que vous donnerez à votre utilisateur, comme suit :
sudo mkdir -vp "/media/sshfs-${USER}" # Création du répertoire en root
sudo chown "${USER}:${GROUP}" "/media/sshfs-${USER}" # Transfert des droits vers lâutilisateur
chmod 700 "/media/sshfs-${USER}" # On donne tous les droits Ă lâutilisateur, et on enlĂšve les droits aux autres.
Maintenant vous pouvez créer le dossier pour le point de montage sans les droits root.
mkdir -vp "/media/sshfs-${USER}/photos"
Que vous utiliser par exemple :
mount -v -t "sshfs admin@192.168.1.121:/share/photos/" "/media/sshfs-${USER}/photos"
La configuration de /etc/fstab
Si vous souhaitez mettre la configuration dans /etc/fstab
, voici la syntaxe à utiliser :
user@machine:/répertoire/dossier_distant/ /media/sshfs-username/dossier_local fuse.sshfs port=22,user,noauto,noatime 0 0
Liens
- sshfs breaks symlinks from SFTP server,
- Odds and Ends: Optimizing SSHFS, moving files into subdirectories, and getting placeholder images,
- NAS Performance: NFS vs. SMB vs. SSHFS,
- Enable arcfour and Other Fast Ciphers on Recent Versions of OpenSSH
- Mount remote directory using SSH,
- How To Use SSHFS to Mount Remote File Systems Over SSH,
- Documentation Ubuntu en français :
- Page Wikipédia de FUSE,
- Documentation ArchLinux :
኿