SSHFS
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.
Inhoud
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 computers 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
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.
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 id 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 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 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.