Mount netwerkmappen met SSHFS in je thuisnetwerk

Dit is en alleen lezen onderdeel.
Gebruikersavatar
Mogenblue
Held
Held
Berichten: 351
Lid geworden op: Wo 18 Okt 2017, 08:27
Locatie: Amsterdam

Mount netwerkmappen met SSHFS in je thuisnetwerk

Berichtdoor Mogenblue » Vr 09 Apr 2021, 19:06

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. Ik snap eigenlijk niet goed waardoor FTP ook lager kan zijn.
Ik heb de snelheid van NFS nog niet geprobeerd omdat ik mounten via SSH eigenlijk prettiger vind.

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.
Als je echt 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.

-------------------------------------------------------------------------------------------------------------------------------------------

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. En voor popeye de naam van je eigen ssh server.

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.
Gebruikersavatar
Mogenblue
Held
Held
Berichten: 351
Lid geworden op: Wo 18 Okt 2017, 08:27
Locatie: Amsterdam

Re: Mount netwerkmappen met SSHFS in je thuisnetwerk

Berichtdoor Mogenblue » Vr 09 Apr 2021, 19:10

Permanente mount

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 mijn 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.


On demand mount

Het mounten vanuit de losse pols of via een script heet on demand mounten. Dat gaat met de regel
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 on demand of via fstab. Het verschil zit hem in de hostname of ip adres en de user en groep id. Bij on demand zijn die 1000, bij permanent zijn ze 0.
Bij on demand 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

Code: Selecteer alles

[b]
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
[/b]
Je ziet hier het ip adres en de user en group id zijn 0.


Als de netwerkmap on demand is gemount met sshfs ziet de uitvoer er zo uit

Code: Selecteer alles

[b]
TARGET.......SOURCE...........................FSTYPE.....OPTIONS
/home/popeye mogenblue@popeye:/home/mogenblue fuse.sshfs rw,nosuid,nodev,relatime,user_id=1000,group_id=1000
[/b]
Hier zie je de hostname en de user en group id zijn allebei 1000.
Gebruikersavatar
Mogenblue
Held
Held
Berichten: 351
Lid geworden op: Wo 18 Okt 2017, 08:27
Locatie: Amsterdam

Re: Mount netwerkmappen met SSHFS in je thuisnetwerk

Berichtdoor Mogenblue » Vr 09 Apr 2021, 19:12

Dan nu een paar scripts voor de automatisering van de on demand verbinding.

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.

Code: Selecteer alles

#!/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.

Code: Selecteer alles

#!/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.

Code: Selecteer alles

#!/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.
Gebruikersavatar
Mogenblue
Held
Held
Berichten: 351
Lid geworden op: Wo 18 Okt 2017, 08:27
Locatie: Amsterdam

Re: Mount netwerkmappen met SSHFS in je thuisnetwerk

Berichtdoor Mogenblue » Vr 09 Apr 2021, 19:15

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:

Code: Selecteer alles

#!/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.


Ik hoop dat je veel plezier zult hebben van deze uitleg en de bijgeleverde scripts.

-Frits
Gebruikersavatar
Mogenblue
Held
Held
Berichten: 351
Lid geworden op: Wo 18 Okt 2017, 08:27
Locatie: Amsterdam

Re: Mount netwerkmappen met SSHFS in je thuisnetwerk

Berichtdoor Mogenblue » Vr 09 Apr 2021, 19:37

Afbeelding
Gebruikersavatar
Mogenblue
Held
Held
Berichten: 351
Lid geworden op: Wo 18 Okt 2017, 08:27
Locatie: Amsterdam

Re: Mount netwerkmappen met SSHFS in je thuisnetwerk

Berichtdoor Mogenblue » Za 10 Apr 2021, 09:17

On demand mount

Het mounten vanuit de losse pols of via een script heet on demand mounten. Dat gaat met de regel
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

On demand mounten is toch iets anders. Dat werkt toch met fstab entries.
SSHFS - ArchWiki; On demand

Wat ik bedoel te zeggen is hoe je vanaf de commando regel, in een terminal, een verbinding tot stand brengt.
Dan ziet de regel er ook iets anders uit, namelijk:
sshfs USERNAME@HOSTNAME_OR_IP:/REMOTE/DIRECTORY /LOCAL/MOUNTPOINT
Precies zoals ik in de voorbeeld situatie heb aangegeven.

Zo kun je het ook in de scripts terugvinden.

Dat viel me pas op toen ik wat meer afstand had genomen.

Terug naar “Archief”

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers en 3 gasten