[TOC]
NFS shares
First NFS needs to be activated (client and server), then we can start with the configuration files.
Configuration files
The exported shares are listed in /etc/exports
/home/links/Musik/ 192.168.2.0/255.255.255.0(ro,root_squash,sync)
/home/links/Install/ 192.168.2.0/255.255.255.0(ro,root_squash,sync)
/home/matthias/ 192.168.2.0/255.255.255.0(rw,root_squash,sync)
/home/sarah/ 192.168.2.0/255.255.255.0(rw,root_squash,sync)
/var/lib/smart 192.168.2.0/255.255.255.0(rw,no_root_squash,sync) |
/home/links/Musik/ 192.168.2.0/255.255.255.0(ro,root_squash,sync)
/home/links/Install/ 192.168.2.0/255.255.255.0(ro,root_squash,sync)
/home/matthias/ 192.168.2.0/255.255.255.0(rw,root_squash,sync)
/home/sarah/ 192.168.2.0/255.255.255.0(rw,root_squash,sync)
/var/lib/smart 192.168.2.0/255.255.255.0(rw,no_root_squash,sync)
rw means Read and Write, root_squash that no the root rights are mapped to user nobody on the server with a client root accessing the server. This does not happen with no_root_squash.
The imported files systems are listed in /etc/fstab
## NFS Server Mounts
matthiasmobil:/home/matthias /home/Exchange/MatthiasMobil/matthias nfs rw,soft 0 0
matthiasmobil:/home/sarah /home/Exchange/MatthiasMobil/sarah nfs rw,soft 0 0
# matthias:/home/matthias /home/Exchange/Matthias/matthias nfs ro,soft 0 0
# matthias:/home/sarah /home/Exchange/Matthias/sarah nfs rw,soft 0 0
sarah:/home/matthias /home/Exchange/Sarah/matthias nfs rw,soft 0 0
sarah:/home/sarah /home/Exchange/Sarah/sarah nfs rw,soft 0 0 |
## NFS Server Mounts
matthiasmobil:/home/matthias /home/Exchange/MatthiasMobil/matthias nfs rw,soft 0 0
matthiasmobil:/home/sarah /home/Exchange/MatthiasMobil/sarah nfs rw,soft 0 0
# matthias:/home/matthias /home/Exchange/Matthias/matthias nfs ro,soft 0 0
# matthias:/home/sarah /home/Exchange/Matthias/sarah nfs rw,soft 0 0
sarah:/home/matthias /home/Exchange/Sarah/matthias nfs rw,soft 0 0
sarah:/home/sarah /home/Exchange/Sarah/sarah nfs rw,soft 0 0
The option soft has to be set, because we are not using a server but simple clients which can be up or down any time. If soft is not set the client will hang until the server is up again.
The directories listed in this fstab file have to exsist of course.
This should be enough for the configuration. The exports file is reread with “exportfs -a” and the nfs shares mounted with “mount -a”.
automount
There is however a severe problem. If one share goes down and up the nfs mount is lost. The problem is that NFS does not detect and handle that it goes down nor has it any capability of reconnecting. This feature is usually called automounting.
I once implemented a simple script which uses a regular cron job to mount or unmount if necessary.
automount.nfs
#!/bin/sh
# --------------------------------------------------------- #
function server_exists ()
{
# ping Optionen:
# -c : Anzahl von pings
# -n : nur numerisch, keine DNS Abfragen
TESTSERVER=$1
if (ping -c 1 -n -w 2 $TESTSERVER > /dev/null 2>&1) ; then
# echo "$TESTSEVER: ping ok"
return 0 # Success.
else
# echo "$TESTSEVER: ping nicht ok"
return 1 # Failed
fi
}
# --------------------------------------------------------- #
function is_mounted ()
{
# 1. mount aufrufen.
# 2. Mit grep Zeile mit $MOUNTDIR ausfiltern.
# 3. Anzahl der Zeilen zaehlen.
# 4. Alle Leerzeichen entfernen.
# Wenn eine Zeile vorhanden war, ist der Wert von RETURN 1
MOUNTDIR=$1
TESTVALUE=$(mount | grep $MOUNTDIR | wc -l | tr -d " ")
if [ $TESTVALUE -eq 0 ]
then
return 1 # not
else
return 0 # is mounted
fi
}
# --------------------------------------------------------- #
function do_mount ()
{
MOUNTDIR=$1
mount $MOUNTDIR
}
# --------------------------------------------------------- #
function force_unmount ()
{
MOUNTDIR=$1
umount -l $MOUNTDIR
}
# --------------------------------------------------------- #
function dir_exists()
{
TESTDIR=$1
if [ -d "$TESTDIR" ] # Test if target directory exists.
then
return=0
else
return=1
fi
}
# MAIN ---------------------------------------------------- #
# if host exists then
# if not mounted do mount
# if mounted do nothing
# if host does not exist then
# if not mounted do nothing
# if mounted force unmount
echo ">>" `date -R`
MOUNTBASEDIR=/home/Exchange
HOSTS=(Matthias MatthiasMobil Sarah)
USERS=(matthias sarah Musik Install)
for SERVER in "${HOSTS[@]}"
do
if (dir_exists "$MOUNTBASEDIR/$SERVER"); then
echo ">>> teste Server: '$SERVER'"
if (server_exists $SERVER); then
echo "> Rechner '$SERVER' existiert"
for REMOTEUSER in "${USERS[@]}"
do
#echo "> teste '$REMOTEUSER'"
MOUNTDIR="$MOUNTBASEDIR/$SERVER/$REMOTEUSER"
if [ -d $MOUNTDIR ]
then
if is_mounted $MOUNTDIR; then
echo "> '$REMOTEUSER' von Server '$SERVER' schon gemountet"
else
do_mount $MOUNTDIR
echo "> gemountet: Benutzer '$REMOTEUSER' von Server '$SERVER'"
echo "[automount.nfs] mountet '$REMOTEUSER' from server '$SERVER' to $MOUNTDIR" >> $LOGFILE
fi
else
echo "> Fehler: Verzeichnis $MOUNTDIR existiert nicht"
fi
done
else
echo "> Rechner '$SERVER' existiert NICHT"
for REMOTEUSER in "${USERS[@]}"
do
#echo "> teste '$REMOTEUSER'"
MOUNTDIR="$MOUNTBASEDIR/$SERVER/$REMOTEUSER"
if [ -d $MOUNTDIR ]
then
if is_mounted $MOUNTDIR; then
echo "> erzwinge umount von '$REMOTEUSER' von Server '$SERVER'"
echo "[automount.nfs] forced umount of '$MOUNTDIR' since nfsserver '$SERVER' down " >> $LOGFILE
force_unmount $MOUNTDIR
else
echo "> '$REMOTEUSER' von Server '$SERVER' nicht gemountet"
fi
else
echo "> Fehler: Verzeichnis $MOUNTDIR existiert nicht"
fi
done
fi
echo ""
else
echo "> Fehler: Verzeichnis $MOUNTBASEDIR/$SERVER existiert nicht"
fi
done |
#!/bin/sh
# --------------------------------------------------------- #
function server_exists ()
{
# ping Optionen:
# -c : Anzahl von pings
# -n : nur numerisch, keine DNS Abfragen
TESTSERVER=$1
if (ping -c 1 -n -w 2 $TESTSERVER > /dev/null 2>&1) ; then
# echo "$TESTSEVER: ping ok"
return 0 # Success.
else
# echo "$TESTSEVER: ping nicht ok"
return 1 # Failed
fi
}
# --------------------------------------------------------- #
function is_mounted ()
{
# 1. mount aufrufen.
# 2. Mit grep Zeile mit $MOUNTDIR ausfiltern.
# 3. Anzahl der Zeilen zaehlen.
# 4. Alle Leerzeichen entfernen.
# Wenn eine Zeile vorhanden war, ist der Wert von RETURN 1
MOUNTDIR=$1
TESTVALUE=$(mount | grep $MOUNTDIR | wc -l | tr -d " ")
if [ $TESTVALUE -eq 0 ]
then
return 1 # not
else
return 0 # is mounted
fi
}
# --------------------------------------------------------- #
function do_mount ()
{
MOUNTDIR=$1
mount $MOUNTDIR
}
# --------------------------------------------------------- #
function force_unmount ()
{
MOUNTDIR=$1
umount -l $MOUNTDIR
}
# --------------------------------------------------------- #
function dir_exists()
{
TESTDIR=$1
if [ -d "$TESTDIR" ] # Test if target directory exists.
then
return=0
else
return=1
fi
}
# MAIN ---------------------------------------------------- #
# if host exists then
# if not mounted do mount
# if mounted do nothing
# if host does not exist then
# if not mounted do nothing
# if mounted force unmount
echo ">>" `date -R`
MOUNTBASEDIR=/home/Exchange
HOSTS=(Matthias MatthiasMobil Sarah)
USERS=(matthias sarah Musik Install)
for SERVER in "${HOSTS[@]}"
do
if (dir_exists "$MOUNTBASEDIR/$SERVER"); then
echo ">>> teste Server: '$SERVER'"
if (server_exists $SERVER); then
echo "> Rechner '$SERVER' existiert"
for REMOTEUSER in "${USERS[@]}"
do
#echo "> teste '$REMOTEUSER'"
MOUNTDIR="$MOUNTBASEDIR/$SERVER/$REMOTEUSER"
if [ -d $MOUNTDIR ]
then
if is_mounted $MOUNTDIR; then
echo "> '$REMOTEUSER' von Server '$SERVER' schon gemountet"
else
do_mount $MOUNTDIR
echo "> gemountet: Benutzer '$REMOTEUSER' von Server '$SERVER'"
echo "[automount.nfs] mountet '$REMOTEUSER' from server '$SERVER' to $MOUNTDIR" >> $LOGFILE
fi
else
echo "> Fehler: Verzeichnis $MOUNTDIR existiert nicht"
fi
done
else
echo "> Rechner '$SERVER' existiert NICHT"
for REMOTEUSER in "${USERS[@]}"
do
#echo "> teste '$REMOTEUSER'"
MOUNTDIR="$MOUNTBASEDIR/$SERVER/$REMOTEUSER"
if [ -d $MOUNTDIR ]
then
if is_mounted $MOUNTDIR; then
echo "> erzwinge umount von '$REMOTEUSER' von Server '$SERVER'"
echo "[automount.nfs] forced umount of '$MOUNTDIR' since nfsserver '$SERVER' down " >> $LOGFILE
force_unmount $MOUNTDIR
else
echo "> '$REMOTEUSER' von Server '$SERVER' nicht gemountet"
fi
else
echo "> Fehler: Verzeichnis $MOUNTDIR existiert nicht"
fi
done
fi
echo ""
else
echo "> Fehler: Verzeichnis $MOUNTBASEDIR/$SERVER existiert nicht"
fi
done
setup cron job
A good tutorial for cron can found at
Cron – Die Zeitschaltuhr für Linux.
The crontab shall be for user root, so we get user rights with “su”. The current crontab list can be retrieved with “crontab -l”. It can be edited with “crontab -e” which simply open vi. We then insert the line
*/10 * * * * /home/Exchange/automount.nfs >> /home/Exchange/automount.log |
*/10 * * * * /home/Exchange/automount.nfs >> /home/Exchange/automount.log
This should start the automount.nfs script every 10 minutes.
Ähnliche Beiträge