SSHFS

Uit LinuxMintNL WiKi
Ga naar: navigatie, zoeken

Mount netwerkmappen met SSHFS in je thuisnetwerk

SSHFS is een subsysteem van SSH. De functie van SSHFS is om mappen van een ssh server als netwerkmappen te mounten aan het filesysteem van een client computer. Dat kan via de opdrachtregel en via fstab.

Inleiding

Als je SSH heb geïnstalleerd op een computer in je thuisnetwerk en op de clients passwordless login hebt gerealiseerd is het nog maar een paar stapjes om mappen van de server op de client mounten. Het is minder werk dan NFS en je hebt een versleutelde verbinding in tegenstelling tot NFS wat niet versleuteld is. Door de encryptie is de overdrachtsnelheid wel wat lager. Op mijn eigen netwerk haal ik ongeveer 80-100MB/s met SFTP en met FTP om ik tot ruim 115MB/s, maar daar zit ik ook wel eens rond de 70 of 80MB/s.

Snelheid is belangrijk, maar gebruiksgemak in dagelijks gebruik is ook belangrijk. Als je de mappen van de server kunt benaderen alsof het een extra schijf is op je eigen computer is dat heel gemakkelijk. Maar als je regelmatig veel en grote bestanden overzet zoals foto's en video's wordt snelheid belangrijker. Dan kun je beter FTP gebruiken. Mobiele apparaten zoals smartphones hebben ook niet de mogelijkheid om mappen te mounten, maar verbinden via FTP of SFTP kunnen ze meestal wel. Daarom moet je eigenlijk meerdere verbindingen hebben tussen je apparatuur zodat je voor elke toepassing de beste verbinding kunt selecteren.

Installatie

Voor het mounten van mappen op een client hoef je op de server niets te doen. Op de client moet je SSHFS installeren en dat kun je gewoon via Programmabeheer doen. Als je persé via de terminal wil werken kun je het installeren met

sudo apt install sshfs

Daarna moet je op de client computer in het bestand /etc/ssh/ssh_config de volgende waarde toevoegen

ConnectTimeout 5

Hierdoor wordt maximaal 5 seconden geprobeerd verbinding te maken met de server. Dit voorkomt dat het client systeem blokkeert als de server offline is. Je hebt root bevoegdheden nodig om dit bestand te kunnen bewerken.

Vervolgens moet je een mount point op de client computer maken. Dat is de map waar de map van de server aan verbonden wordt. Als de ssh server bijvoorbeeld popeye heet kun je in de home directory een map popeye maken. Dat kun je in een terminal doen met

mkdir popeye

maar je kan ook gewoon in je bestandsbeheerder Nemo blijven en daar de map aanmaken. Let er op dat je zelf de eigenaar bent van die map en niet root. Anders kun je er straks niet bij.

Daarna kun je bijvoorbeeld de hele werkmap die je op de server hebt mounten op de client. En daar heb je wél de terminal voor nodig. Dat doe je met

sshfs mogenblue@popeye:/home/mogenblue /home/popeye

Voor mogenblue moet je dan je eigen username gebruiken.

Dat is em. Meer is het niet. Je kunt de verbinding in een terminal controleren met

findmnt /home/popeye

Maar het is natuurlijk logischer om in je bestandsbeheerder te kijken of er iets te vinden is.

findmnt hebben we toch wel nodig omdat je in een script moet kunnen controleren of de verbinding nog actief is. Anders moet die worden hersteld. SSH verbreekt namelijk na verloop van tijd de verbinding dus dan moet je die opnieuw tot stand brengen. Dat is natuurlijk niet iets wat je iedere keer met de hand wil doen. Daarom geef ik verderop een paar scripts waarmee dat automatisch wordt geregeld.

Permanente mount via fstab

Je kunt mappen van de ssh server ook via /etc/fstab mounten, dan heb je een permanente verbinding. Met de juiste opties hoef je dan niet de verbinding te herstellen als de computer ontwaakt uit de slaapstand.

Mounten via /etc/fstab gaat met de regel

USERNAME@HOSTNAME_OR_IP:/REMOTE/DIRECTORY  /LOCAL/MOUNTPOINT  fuse.sshfs _netdev,user,idmap=user,transform_symlinks,identityfile=/home/USERNAME/.ssh/id_rsa,allow_other,reconnect,default_permissions,uid=USER_ID_N,gid=USER_GID_N 0 0

Bij de hoofdletters moet je je eigen gegevens gebruiken. Voor hostname kun je niet zomaar de naam van de host gebruiken (popeye) omdat bij het opstarten van de computer in het known_hosts bestand van root wordt gekeken welk ip-adres daar bij hoort. Dan zou je eerst als root met de ssh server verbinding moeten hebben gemaakt.
Ik raad je af om je eigen known_hosts bestand over dat van root heen te kopiëren want dat is typisch een actie van de categorie hoe-help-ik-mijn-systeem-om-zeep. Je weet niet wat voor een kettingreactie dat veroorzaakt en voor je het weet kan je je hele systeem opnieuw installeren als je geen TimeShift gebruikt.

In de voorbeeld situatie ziet de fstab entry er zo uit:

mogenblue@192.168.1.17:/home/mogenblue /home/popeye  fuse.sshfs _netdev,user,idmap=user,transform_symlinks,identityfile=/home/mogenblue/.ssh/id_rsa,allow_other,reconnect,default_permissions,uid=1000,gid=1000 0 0

Je gebruikt dus het ip-adres van de host en door de identityfile te specificeren, met het volledige pad naar het id_rsa bestand, kun je het systeem zonder password de map laten mounten.
De optie _netdev zorgt ervoor dat gewacht wordt met verbinden totdat het netwerk actief is.
De optie ConnectTimeout=5 zorgt dat het systeem stopt met verbinding maken als de server na 5 seconden geen antwoord heeft gegeven.
Door de optie reconnect wordt de verbinding automatisch hersteld bij ontwaken uit de slaapstand.
Voor uid en gid moet je je eigen id's gebruiken, maar als je de enige gebruiker bent op je computer is dat meestal hetzelfde.

Mounten via de opdrachtregel

Het mounten via de opdrachtregel gaat met de opdracht

sshfs USERNAME@HOSTNAME_OR_IP:/REMOTE/DIRECTORY  /LOCAL/MOUNTPOINT

Bij de hoofdletters gebruik je je eigen gegevens. Met deze methode kun je wel de naam van de host gebruiken omdat je zelf de verbinding tot stand brengt. Het systeem zal in je known_hosts bestand kijken welk ip-adres bij de hostnaam hoort.

In de voorbeeld situatie kan je verbinding maken met de volgende regel

sshfs mogenblue@popeye:/home/mogenblue /home/popeye

Met findmnt kun je zien of de map gemount via de opdrachtregel of via fstab. Het verschil zit hem in de hostname of ip adres en de user en groep id. Bij de opdrachtregel zijn die 1000, bij permanent zijn ze 0.
Bij de opdrachtregel zie je de hostname, bij fstab zie je het ip adres.

Met de opdracht

findmnt /home/popeye

ziet de uitvoer er ongeveer zo uit als de map via fstab is gemount

TARGET       SOURCE                                 FSTYPE     OPTIONS
/home/popeye mogenblue@192.168.1.17:/home/mogenblue fuse.sshfs rw,nosuid,nodev,noexec,relatime,user_id=0,group_id=0,default_permissions,allow_other

Je ziet hier het ip adres van de host en de user en group id zijn 0.

Als de netwerkmap via de opdrachtregel is gemount met sshfs ziet de uitvoer er zo uit

TARGET       SOURCE                           FSTYPE     OPTIONS
/home/popeye mogenblue@popeye:/home/mogenblue fuse.sshfs rw,nosuid,nodev,relatime,user_id=1000,group_id=1000

Hier zie je de hostname van de host en de user en group id zijn allebei 1000.

Scripts voor SSHFS

Dan nu een paar scripts voor de automatisering van de verbinding via de opdrachtregel.

Je moet dus eenmaal handmatig de mount directory op je computer aanmaken. Daarna kun je de verbinding automatisch via deze scripts tot stand brengen en in stand houden.

Het eerste script heet sshfs-mount.sh en hiermee maak je de mount en herstel je die als de mount verbroken is.

#!/bin/bash

# username op de ssh server
User='mogenblue'
# naam van de ssh server in het .ssh/config bestand
Host='popeye'

echo .
echo .
echo .
echo .

# te mounten map op de ssh server
RemoteMap='/home/mogenblue'
# lokale map op de client computer waar de remote map aan verbonden wordt
LocalMap='/home/popeye'

# test of de remote map is gemount
MapMounted="$( findmnt $LocalMap )"
if [ -z "$MapMounted" ]
then
    echo "$LocalMap wordt gemount"
    # mount netwerk map via sshfs
    sshfs $User@$Host:$RemoteMap $LocalMap -o reconnect
    echo .
    echo "Output findmnt $LocalMap:"
else
    echo "$LocalMap is gemount"
fi
findmnt $LocalMap

Je hoeft alleen in de variabelen je eigen gegevens in te vullen.

Het volgende script test of de map gemount is. Dit script heet testmount.sh. Je kunt een snelstarter op je buroblad zetten naar dit script om het binnen handbereik te hebben.

#!/bin/bash

echo .
echo .
echo .
echo .

# lokale map op de client computer waar de remote map aan verbonden wordt
LocalMap='/home/popeye'

echo "Output findmnt $LocalMap:"
findmnt $LocalMap
echo .

Dit script moet je in een terminal laten uitvoeren. Als de map niet gemount is geeft findmnt geen output. Als de map wel gemount is ziet het eruit zoals hierboven al getoond is.

Het volgende script kun je gebruiken om een netwerkmap te unmounten. Het heet sshfs-unmount.sh.

#!/bin/bash

echo .
echo .
echo .
echo .

# lokale map op de client computer waar de remote map aan verbonden wordt
LocalMap='/home/popeye'

MapMounted="$( findmnt $LocalMap )"
if [ -z "$MapMounted" ]
then
    echo "$LocalMap is niet gemount"
else
    echo "mount $LocalMap wordt verbroken"
    # unmount netwerk mappen via sshfs
    sudo umount $LocalMap
    echo .
    MapMounted="$( findmnt $LocalMap )"
    echo "Output findmnt $LocalMap:"
    echo $MapMounted
fi

De essentiële regel in dit script is

sudo umount $LocalMap

Je moet het dus in een terminal laten uitvoeren omdat je voor unmounten je wachtwoord moet invoeren. Als je een mount aanmaakt hoeft dat niet, maar bij het verbreken wel.

Automatisch verbinden met scripts

We gaan nog een stapje verder om te zorgen dat de map automatisch gemount wordt zodra de computer uit de slaapstand komt of wordt opgestart. De netwerkmap kan pas gemount worden zodra het netwerk up is. Daarom zetten we een simpel script in de map /etc/network/if-up.d.
Dit script heet computer-network-up-run en er staat maar één opdracht in:

#!/bin/sh

# dit bestand hoort in de map
# /etc/network/if-up.d
# van de ssh client
# het wordt uitgevoerd zodra het netwerk up is

# mount remote map via ssh
sudo -u mogenblue /home/mogenblue/Scripts/sshfs-mount.sh

De eigenaar van dit script is root. Controleer dit en pas dit zonodig aan. Dit script roept het mount script aan zodra het netwerk up is. Dat moet worden uitgevoerd als user mogenblue omdat het systeem dan het .ssh/config bestand van mogenblue zal raadplegen voor het ip adres dat hoort bij host popeye.

Alle scripts moeten uitvoerbaar zijn. Voor mogenblue en popeye moet je je eigen gegevens invullen. Je kunt je scripts organiseren in een scripts map in je werkmap, bijvoorbeeld /home/mogenblue/scripts.

Externe Links

How to use SSHFS to Mount Remote Directories over SSH
SSHFS
Automount sshfs using fstab without mount -a
timeout when initiating a sshfs connection
What is a better way to deal with server disconnects of sshfs mounts?
Sshfs as regular user through fstab