# NFSv4 - Hilfe bei Initscript, Howto erwünscht?

## musv

Guten Abend, 

ich hatte jahrelang NFS (v3) im Einsatz. Seit ich dann diverse Partitionen von Reiser4 auf BTRFS umgerüstet hab, kam NFS damit irgendwie nicht mehr klar. Also hab ich mich mal hingesetzt und etwas mit NFSv4 beschäftigt. Ziele:

Sicherheitsstandard für ein lokales Heimnetz, d.h. ACL, Kerberos usw. wird nicht benötigt

etwas Performance-Tuning (Server-Parameter, Mountoptionen)

keine zusätzlicher Aufwand beim Starten gegenüber NFSv3. Gemeint ist damit das Mounten der freizugebenden Verzeichnisse ins virtuelle NFS-Root

Meine /etc/exports:

```
# /etc/exports: NFS file systems being exported.  See exports(5).

# Kommentar

/export                         192.168.109.0/24(rw,fsid=0,insecure,no_subtree_check,async)

# /var/portage/distfiles

/export/distfiles       192.168.109.0/24(rw,nohide,insecure,no_subtree_check,async,no_root_squash)

# /home/blubb

/export/home_blubb         192.168.109.0/24(rw,nohide,insecure,no_subtree_check,async,all_squash,anonuid=1000,anongid=100)
```

Dabei ist mir das manuelle Mounten der Verzeichnisse ins /export zu blöd. In die fstab will ich die Verzeichnisse jetzt auch nicht eintragen, da der NFS-Server nur bei Bedarf gestartet werden soll. Also dachte ich mir, ich schreib ein Init-Script, dass die Verzeichnisse der Kommentarzeilen in die dazugehörigen Verzeichnisse mounted und anschließend den NFS-Server startet. Das Mounten funktioniert. Nur weiß ich nicht, wie ich jetzt korrekterweise den NFS-Daemon über das Init-Script anstoß.

```
#!/sbin/runscript

# Copyright 1999-2012 Gentoo Foundation

# Distributed under the terms of the GNU General Public License v2

# $Header: $

#

# mounts the specified directories in /etc/exports

depend() {

    use net

    before nfs

}

is_mounted() {

    echo $(mount | grep "$1 on $2" | wc -l)

}

mount_export() {

    retval=$(is_mounted "$1" "$2")

    if [ "$retval" == 0 ]; then

        einfo "Mounting $1 on $2"

        mount -o bind "$1" "$2"

    fi

}

umount_export() {

    retval=$(is_mounted "$1" "$2")

    if [ "$retval" != 0 ]; then

        einfo "Unmounting $2"

        umount "$2"

    fi

}

scan_export() {

    unset DIR_SRC

    unset DIR_MNT

    while read x

    do

        case "${x:0:1}" in

            "#")    if [[ -z "$(echo "$x" | sed -n "/^#\s\([^/]\|\/etc\/\).*/p")" ]]; then

                        DIR_SRC="$(echo "$x" | sed "s/^#\s\([^\t\$ ]\+\).*/\1/")"

                    else

                        unset DIR_SRC

                        unset DIR_MNT

                    fi

                    ;;

            "/")    if [[ -n "$DIR_SRC" ]]; then

                        DIR_MNT="$(echo "$x" | sed "s/^\([^\t\$ ]\+\).*/\1/")"

                        $1 "$DIR_SRC" "$DIR_MNT"

                        unset DIR_SRC

                        unset DIR_MNT

                    fi

        esac

    done < /etc/exports

}

start() {

    einfo "Binding export directories"

    scan_export mount_export

    eend 0

}

stop() {

    einfo "Unmounting export directories"

    scan_export umount_export

    eend 0

}
```

Jetzt bräuchte ich mal ein paar Kommentare:

Wie starte ich den NFS-Service nach dem Mounten in start() bzw. beende ich den NFSD vor dem Umount in stop()?

Verbesserungen bezüglich der Coding-Standards und Codequalität / Robustheit

Sofern gewünscht, erstell ich auch vom Gesamtergebnis zur Konfiguration des Heimnetzwerks via NFSv4 eine Anleitung in der Dokumentation. Ich hab zumindest einige Zeit gebraucht, mich durch die ganzen Tutorials der anderen Distributionen zu wühlen, um die benötigten Teile rauszupicken.

----------

## musv

Falls es doch jemanden interessiert, ich hab jetzt eine Konfiguration, die ganz gut funktioniert.

nfs hab ich als Abhängigkeit in mein Script eingetragen (need nfs). Damit werden zwar die Verzeichnisse auf dem Server erst nach dem Start in /export/ gemountet, ist aber scheinbar kein Problem.

Ich hatte noch ein paar Probleme mit der Freigabe des Root-Verzeichnisses. Lösung: https://forums.gentoo.org/viewtopic-t-912836-highlight-.html

----------

## LinuxTom

Hallo musv,

kannst Du Dir mal bitte diesen Thread anschauen? Ich bekomme das einfach nicht ans Laufen.  :Sad: 

----------

## musv

Sorry, dass ich nicht eher dazu kam. 

Das Problem ist bei Dir das IDMapping. In den älteren NFS-Versionen hast du die ID in /etc/exports angegeben. Ab NFS4 kannst du das über /etc/idmapd.conf regeln, musst du aber nicht. Soweit ich das verstanden hab, wird beim Exportieren ein Anonymous-Nutzer verwendet, der eine zufällige ID bekommt (all_squash). Über anonuid und anongid kannst du festlegen, welche ID der Anonymous-Nutzer bekommt. 

In meinem Netzwerk ist das so konfiguriert, dass ich auf allen Rechnern meinen Standardnutzer mit der UID=1000 und der GID=100 hab. Alle weiteren Nutzer haben logischerweise eine höher UID und dürfen nur lesen. Ich brauch somit kein ID-Mapping, da die User-ID auf allen beteiligten Rechnern übereinstimmt. 

Soweit ich das überflogen hab, kannst du als Client-Nutzer mit der UID=117 schreiben, aber nicht als Nutzer vdr (410). In Deiner idmapd.conf hast du auch kein User-Mapping angegeben. In Deinem Fall kannst du entweder die UID auf allen beteiligten Rechnern angleichen, oder du konfigurierst die idmapd.conf so, dass der vdr-User auf dem Server auf den vdr-User auf den Client gemapped wird. Frag mich aber nicht nach der Syntax. Ich denk mal, du musst für nobody in der idmapd.conf irgendwie den vdr-User angeben.

----------

## LinuxTom

Es sollen eigentlich (zumindest nach Anleitung) alle User-ID automatisch gemappt werden. Aber es funktioniert nicht. Die Kernel-Upcall-Funktion wird nicht aufgerufen.

----------

## musv

Ich muss mal den Thread wieder hervorholen. Seit einem der letzteren Updates weigert sich der NFS-Server bei mir die angegebenen IDs in der /etc/exports zu verwenden und schreibt mir hin, dass er explizit den idmapper verwenden will. Tja und jetzt bin ich am Suchen, wie ich User + Group irgendwie in den Mapper reinkrieg. Tutorials, die diesen Inhalt abhandeln, sind irgendwie Mangelware.

----------

## LinuxTom

Ich habe es aufgegeben und bin wieder auf NFS3 zurück. Jetzt nach einem Update auf eine aktuelle Gentoo-Version (incl. Kernel) könnte ich es ja wieder probieren.

----------

## boospy

Ja, ich bin auch reumütig zu NFSv3 zurück gekrochen.

----------

