Gibt es eine Problemumgehung für den Debian-Fehler #838871?
Problem:Ich möchte eine Netzwerkkonfiguration auf Debian mit den folgenden Eigenschaften haben:
- Automatisches Öffnen der Netzwerkschnittstelle, wenn ein Kabel eingesteckt wird
- bootet längere Zeit ohne zu blockieren, wenn beim Booten kein Kabel angeschlossen ist
- ändere mein Init-System nicht
Der Standardweg dafür wäre das folgende Snippet in /etc/network/interfaces
:
allow-hotplug eth0
iface eth0 inet dhcp
Allerdings führt dies zu dem im verlinkten Fehlerbericht beschriebenen Problem:Der Bootvorgang blockiert für>1min wenn kein Netzwerkkabel eingesteckt ist mit folgender Meldung:
configuring network interfaces... ifup: waiting for lock on /run/network/ifstate.eth0
Eine in dieser Frage angegebene Problemumgehung scheint das Ändern von allow-hotplug
zu sein auf auto
:
auto eth0
iface eth0 inet dhcp
Dadurch verschwindet die Boot-Blocking-Nachricht effektiv, aber das System blockiert jetzt, bevor eine Anmeldeaufforderung bei tty1 angezeigt wird. Dieses Mal blockiert dhclient, weil es versucht, eine DHCP-Antwort auf eth0 zu erhalten, das nicht verbunden ist, und auf mehrere Timeout-Versuche wartet. Die Anmeldeaufforderung erscheint nur nach den dhclient-Timeouts.
Für Benutzer mit einem grafischen DE ist dies möglicherweise kein Problem, da sie sich nicht bei tty1 anmelden müssen, stattdessen startet ihr DE und sie sehen nie die dhclient-Nachricht.
Eine andere Problemumgehung wäre wahrscheinlich die Verwendung von network-manager
. Idealerweise würde ich es vorziehen, den Netzwerkmanager nicht zu verwenden, aber als letzten Ausweg habe ich das versucht. Unter Debian Buster steht die Abhängigkeitskette des Netzwerkmanagers jedoch in Konflikt mit sysvinit-core
, das ist mein Init-System.
Die letzte Alternative, die mir einfällt, ist, eth0 nicht in Interfaces (5) zu konfigurieren. Dadurch verschwinden alle Boot-Blöcke, aber ich muss manuell ifup eth0
ausführen nach dem Einstecken eines Ethernet-Kabels.
Irgendwelche besseren Ideen?
UPDATE:Um das Zitat von @sourcejedi zu adressieren, ist „allow-hotplug“ in den Debian-Dokumenten unter Debian-Netzwerk so angegeben, dass „Schnittstelle starten, wenn der Kernel ein Hotplug-Ereignis von der Schnittstelle erkennt“. Verwandte Fragen:Gute detaillierte Erklärung der /etc/network/interfaces-Syntax? und Was ist ein Hotplug-Ereignis von der Schnittstelle?
Akzeptierte Antwort:
Vor network-manager
, der bekannte Weg zum „automatischen ifup
die Netzwerkschnittstelle, wenn ein Kabel eingesteckt ist“ war ifplugd
. (Beachten Sie den ursprünglichen Autor :-P). ifplugd
ist noch in Debian verfügbar. Ich habe keine neueren Erfahrungen damit.
Zuerst würden Sie auto eth0
entfernen oder allow hotplug eth0
Zeile aus /etc/network/interfaces
. Sie bräuchten noch Ihre Zeile iface eth0 inet dhcp
. (Diese Zeile hängt vom Namen Ihrer Netzwerkschnittstelle ab und auch davon, ob Sie IPv6-Unterstützung usw. hinzufügen möchten).
Um ifplugd
zu konfigurieren Um die Schnittstelle aufzurufen, bearbeiten Sie /etc/default/ifplugd
um INTERFACES=
zu setzen um den Namen Ihrer Netzwerkschnittstelle einzufügen. Alternativ schlägt es vor, dass Sie den Wert auto
verwenden könnten . Ich weiß nicht, wie gut auto
funktioniert auf jedem neueren System :-).
https://manpages.debian.org/buster/ifplugd/ifplugd.conf.5.en.html
Diese Funktion wurde von allow-hotplug
nie bereitgestellt :
Beachten Sie, dass die Überprüfung des Verbindungsstatus nicht immer vorhanden war und in jedem Fall nur beim Booten durchgeführt wurde. Es wurde nie der Fall unterstützt, dass beim Booten kein Kabel angeschlossen war und Sie das Kabel zu einem späteren Zeitpunkt eingesteckt haben. — Nachricht Nr. 20
Die Quellen, die dem widersprechen, sind einfach falsch. Wenn Sie diese Funktion wünschen, müssen Sie einen Daemon ausführen, der auf „netlink“-Ereignisse wartet.[*] Der Debian ifupdown
Paket enthält keinen Daemon. allow-hotplug
stützt sich auf den udev-Daemon, der die notwendigen netlink-Ereignisse nicht liest.
Der udev-Daemon liest nur udev-„Hotplug“-Ereignisse („uevent“s). Es gibt kein „uevent“, wenn ein Ethernet-Gerät eine Änderung des Verbindungsstatus erkennt. Sie können dies mit udevadm monitor
überprüfen .
Die Linux-Kernel-Entwickler haben sich bewusst dafür entschieden, kein „uevent“ dafür bereitzustellen. Siehe:Re:F:netdev:kobject uevent auf Netzwerkereignissen generieren.
[*] Pedant:technisch gesehen ifplugd
funktioniert, indem es den Verbindungsstatus in regelmäßigen Abständen abfragt. Es ist also nicht unbedingt auf „netlink“-Ereignisse angewiesen. Auf diese Unterscheidung wird durch netplug
hingewiesen , was macht Verwenden Sie „netlink“-Ereignisse. netplug
hat nicht dieselben Funktionen wie ifplugd
.