ich möchte wie hier beschrieben meine Soft-/Hardwarelandschaft etwas vereinheitlichen und einen zentralen NFS-Server als Speicherort verwenden.
Neben Clienten, die das LAN nie verlassen, habe ich auch Laptops, die ich unterwegs benutze und die in verschiedenen Netzwerken oder eben offline genutzt werden. Die Konfiguration soll wie folgt sein: Zuerst wird versucht über das lokale Netzwerk zu booten (der DHCP-Server übergibt dazu zusammen mit der IP-Adresse einen Pfad auf dem das Root-Filesystem liegt), schlägt dies fehl, soll von lokalem Speicher gebootet werden.
Ich versuche mich so nah wie möglich am Standard-Bootprozess von Debian zu orientieren, daher gebe ich beim Systemstart dem Kernel mit boot=fallback ein zusätzliches Bootscript mit auf den Weg. Das Skript sieht wie folgt aus:
Code: Alles auswählen
log_begin_msg "Starting Fallback-Script"
configure_networking #Autoconfig network interfaces
if [ -e /run/net-*.conf ];then
grep "/srv/nfs" /run/net-*.conf > /dev/null
if [ $? -eq 0 ];then
log_success_msg "NFS-Server found. Booting..."
. /scripts/nfs
fi
else
log_failure_msg "No NFS-Server found. Booting from local drive"
ROOT="LABEL=rootfs"
. /scripts/local
fi
- Aktiver DHCP-Server mit DHCP-Option Rootpath=/srv/nfs -> Skript wird korrekt abgearbeitet, es wird von NFS gebootet
- Aktiver DHCP-Server, ohne DHCP-Option Rootpath=/srv/nfs -> Skript wird korrekt abgearbeitet, es wird lokal gebootet
- Kein DHCP-Server -> Kernel-Panik
Das Skript wird korrekt gestartet, die Funktion configure_networking wird aufgerufen und abgearbeitet. Aber zu dem Punkt if [ -e /run ...] kommt das Skript wohl gar nicht, sonst würde die Meldung über den fehlenden NFS-Server ausgegeben werden.
Es muss also etwas mit der Funktion configure_networking zu tun haben, die ist bei einem Standard-Debian unter /usr/share/initramfs-tools/scripts/functions definiert und in jeder initrd enthalten: https://sources.debian.org/src/initramf ... #L236-L335
Die Ausgabe der VM deutet darauf hin, dass die Funktion auch bis zum Ende abgearbeitet wird. In der Funktion configure_networking ist aber kein Fall definiert, an dem es zu einer Kernel-Panik kommen sollte.
Ich bin etwas ratlos und weiß nicht, wo ich weiter suchen soll. Hat jemand von euch noch einen Rat?
//edit:
Es liegt tatsächlich an der Funktion configure_networking: Es gibt dazu einen Bugreport(911727), mit Lösungsvorschlag. Verursacher ist dieses Konstrukt am Ende der Funktion:
if [ -n "${DEVICE}" ]; then
# source specific bootdevice
. "/run/net-${DEVICE}.conf"
else
# source any interface...
# ipconfig should have quit after first response
. /run/net-*.conf
fi
Sofern keine IP-Adresse vergeben wird, liegt auch keine net-XYZ.conf unter /run bereit. Es wird also im else-Block mit source auf eine Datei zugegriffen, die nicht existiert. Das verursacht den Kernel-Panik. Ändert man die Funktion nun ab in:
if [ -n "${DEVICE}" ]; then
# source specific bootdevice
. "/run/net-${DEVICE}.conf"
elif [ -e /run/net-*.conf ]; then
# source any interface...
# ipconfig should have quit after first response
. /run/net-*.conf
else
log_failure_msg "Kein Netzwerk vorhanden"
fi
läuft das Skript ohne Fehler sauber durch.