Alpine Linux 3.12.0 -> NFSMount schlägt fehl, da rpc.statd nicht startet

Alpine Linux 3.12.0 -> NFSMount schlägt fehl, da rpc.statd nicht startet

Ich habe ziemlich viel gesucht und ähnliche Probleme gefunden, aber keines mit Lösungen, die bei mir zu funktionieren scheinen.

Ich betreibe einen Alpine LXC auf Proxmox. Es handelt sich um einen privilegierten Container und NFS-Mounts sind aktiviert.

Ich kann meine NFS-Freigabe manuell über den Mount-Befehl mounten. Ich habe den Mount seitdem zu meiner /etc/fstab hinzugefügt und das funktioniert, außer bei Neustarts.

Ich habe gelesen, dass ich den NFSMount-Dienst starten/aktivieren muss, um das beim Booten zu erledigen. Beim Versuch, diesen Dienst zu aktivieren, tritt jedoch Folgendes auf.

 * Starting NFS statd ...
 * start-stop-daemon: failed to start `/usr/sbin/rpc.statd'                                                                                                         [ !! ]
 * ERROR: rpc.statd failed to start
 * ERROR: cannot start nfsmount as rpc.statd would not start

Beim Überprüfen des Verzeichnisses /usr/sbin wird angezeigt, dass rpc.statd nicht vorhanden ist. Das Repo für Alpine zeigt, dass es bei der Installation von nfs-utils eingebunden werden sollte, die anderen rpc-Verzeichnisse werden eingebunden.

Ich habe das Repo für eine frühere Alpine-Version hinzugefügt und ein zurückgesetztes NFS-Utility installiert. Dadurch erhalte ich erfolgreich die Datei rpc.statd in /usr/sbin, aber der Start schlägt immer noch fehl.

Antwort1

Ich habe das Grundproblem also nicht gelöst, nfsmount lässt sich immer noch nicht starten.

Für alle, die nach einer Möglichkeit suchen, NFS-Freigaben automatisch in einem LXC-Container zu mounten, habe ich jedoch eine Lösung.

Ich habe zunächst versucht, dem Speicherort „if-up.d“ ein Skript hinzuzufügen, aber es scheint, dass LXC-Container nicht alle Init-Abschnitte starten, die bei einer typischen Installation gestartet würden.

Meine Lösung bestand darin, den Dienst local.d mit rc-update add local default zu aktivieren

Dann habe ich eine Datei mit dem Namen „fstab.local“ in /etc/local.d/ als Bash-Skript platziert, das die Option „mount -a“ aufruft, nachdem überprüft wurde, ob die Netzwerkschnittstelle aktiv ist.

Antwort2

Die Antwort ist etwas veraltet, aber zutreffend.

Um NFS automatisch starten zu können, benötigt Alpine „Dateifunktionen“, die standardmäßig in der Datei /usr/share/lxc/config/alpine.common.conf abgelegt werden.

lxc.cap.drop = setpcap

Eine Erklärung der Capabilities-Bits finden Sie hier man capabilities. Es gibt mehrere Möglichkeiten, dies zu beheben: Sie können die Datei alpine.common.conf aktualisieren und die obige Zeile auskommentieren (meine Wahl, da die meisten meiner Alpine-Container NFS verwenden), aber beachten Sie, dass ein Update sie zurücksetzt, also müssen Sie daran denken, die Datei nach dem Update zu prüfen/ändern, oder Sie können die .conf-Datei der einzelnen Container ändern, die sich unter /etc/pve/lxc/####.conf befinden sollte, wobei #### die Container-ID ist. Sie müssen die Capabilities zurücksetzen und dann die Capabilities gemäß der allgemeinen und alpinen Konfigurationen erneut löschen. Ich habe Folgendes verwendet, um dies zu tun, als ich die einzelnen Dateien erstellt habe, es war auf meinem System als /usr/local/bin/alpine-enable-nfs.sh gespeichert, also konnte ich Folgendes eingeben alpine-enable-nsf.sh 1492und Container 1492 hatte die Capabilities so eingestellt, dass NFS zugelassen wurde:

#!/bin/bash
defdir=/usr/share/lxc/config
cfile=/etc/pve/lxc/${1}.conf
if [ ! -r ${cfile} ] ; then
  echo "usage: ${0##*/} IDNO"
  exit
fi
if grep -q "lxc.cap.drop" ${cfile} ; then
  echo "File has lxc.cap.drop configurations already"
  exit
fi
if ! grep -q "ostype: alpine" ${cfile} ; then
  echo "Container ID: ${1} is not alpine."
  exit
fi
echo "# Reset capabilities" >> ${cfile}
echo "lxc.cap.drop:" >> ${cfile}
grep cap ${defdir}/common.conf >> ${cfile}
sed -n "/cap/{/setpcap/s/^/#/;p}" ${defdir}/alpine.common.conf >> ${cfile}
grep cap ${cfile}
echo -e "\nNFS should now be available in container #${1}"

Zum Zeitpunkt des Schreibens sollte dies Ihrer Containerkonfiguration Folgendes hinzufügen:

# Reset capabilities
lxc.cap.drop:
# Drop some harmful capabilities
lxc.cap.drop = mac_admin mac_override sys_time sys_module sys_rawio
# Drop another (potentially) harmful capabilities.
lxc.cap.drop = audit_write
lxc.cap.drop = ipc_owner
lxc.cap.drop = mknod
#lxc.cap.drop = setpcap
lxc.cap.drop = sys_nice
lxc.cap.drop = sys_pacct
lxc.cap.drop = sys_rawio
lxc.cap.drop = sys_resource
lxc.cap.drop = sys_tty_config
lxc.cap.drop = syslog
lxc.cap.drop = wake_alarm

Beachten Sie, dass die Zeile „setpcap“ auskommentiert ist (# am Anfang).

Damit dies wirksam wird, müssen Sie Ihre Container STOPPEN und STARTEN (beim Neustart eines Containers wird die Änderung nicht übernommen, er muss gestoppt und dann erneut gestartet werden).

Manche Leute meinen, die „richtige“ Vorgehensweise sei, die NFS-Freigabe im Host zu mounten, aber für mich ist das problematisch, da ich ein paar Dutzend Alpine-Container habe, die alle unterschiedliche NFS-Freigaben von ein paar unterschiedlichen Servern für verschiedene Zwecke mounten, darunter auch einige, die nicht direkt auf dem Host verfügbar sind, daher dieser Ansatz.

verwandte Informationen