Esiste una soluzione per Debian Bug #838871?
Problema:voglio avere una configurazione di rete su Debian con le seguenti proprietà:
- Aggiorna automaticamente l'interfaccia di rete quando viene collegato un cavo
- si avvia senza bloccarsi per molto tempo quando nessun cavo è collegato all'avvio
- non cambio il mio sistema di inizializzazione
Il modo standard per farlo sarebbe il seguente snippet in /etc/network/interfaces
:
allow-hotplug eth0
iface eth0 inet dhcp
Tuttavia, questo porta al problema descritto nella segnalazione di bug collegata:il processo di avvio si blocca per>1 minuto quando nessun cavo di rete è collegato con il seguente messaggio:
configuring network interfaces... ifup: waiting for lock on /run/network/ifstate.eth0
Una soluzione fornita in questa domanda sembra cambiare allow-hotplug
su auto
:
auto eth0
iface eth0 inet dhcp
Ciò fa effettivamente scomparire il messaggio di blocco dell'avvio, tuttavia, il sistema ora si blocca subito prima che venga visualizzata una richiesta di accesso in tty1. Questa volta dhclient si blocca perché tenta di ottenere una risposta dhcp su eth0, che non è connesso, e attende diversi tentativi di timeout. La richiesta di accesso viene visualizzata solo dopo il timeout di dhclient.
Per gli utenti con una DE grafica, questo potrebbe non essere un problema, in quanto non hanno bisogno di accedere su tty1, invece la loro DE si avvia e non vedono mai il messaggio dhclient.
Un'altra soluzione sarebbe probabilmente usare network-manager
. Idealmente, preferirei non usare networkmanager, ma come ultima risorsa, l'ho provato. Tuttavia, su Debian Buster, la catena delle dipendenze del gestore di rete è in conflitto con sysvinit-core
, che è il mio sistema di inizializzazione.
L'ultima alternativa che mi viene in mente è di non configurare eth0 in interfaces(5). Questo fa sparire tutti i blocchi di avvio, tuttavia, ho bisogno di ifup eth0
manualmente dopo aver collegato un cavo ethernet.
Qualche idea migliore?
AGGIORNAMENTO:per affrontare la citazione di @sourcejedi, "allow-hotplug" è specificato per "avviare l'interfaccia quando il kernel rileva un evento hotplug dall'interfaccia" nei documenti Debian sotto Debian networking. Domande correlate:buona spiegazione dettagliata della sintassi /etc/network/interfaces? e Che cos'è un evento hotplug dall'interfaccia?
Risposta accettata:
Prima di network-manager
, il noto metodo per "ifup
automaticamente l'interfaccia di rete quando un cavo è collegato” era ifplugd
. (Nota l'autore originale :-P). ifplugd
è ancora disponibile in Debian. Non ho alcuna esperienza recente in merito.
In primo luogo, rimuoveresti auto eth0
o allow hotplug eth0
riga da /etc/network/interfaces
. Avresti comunque bisogno della tua linea iface eth0 inet dhcp
. (Questa riga dipende dal nome della tua interfaccia di rete e anche se desideri aggiungere il supporto ipv6, ecc.).
Per configurare ifplugd
per visualizzare l'interfaccia, modifica /etc/default/ifplugd
per impostare INTERFACES=
per includere il nome della tua interfaccia di rete. In alternativa, suggerisce di utilizzare il valore auto
. Non so quanto bene auto
funziona su qualsiasi sistema recente :-).
https://manpages.debian.org/buster/ifplugd/ifplugd.conf.5.en.html
Questa funzione non è mai stata fornita da allow-hotplug
:
Si noti che il controllo dello stato del collegamento non è sempre stato presente e in ogni caso è stato eseguito solo all'avvio. Non ha mai supportato il caso in cui non fosse collegato alcun cavo all'avvio e in cui il cavo è stato collegato in un secondo momento. — Messaggio n. 20
Le fonti che contraddicono questo sono semplicemente sbagliate. Se vuoi questa funzione, devi eseguire un demone che attenda gli eventi "netlink".[*] La Debian ifupdown
il pacchetto non include alcun demone. allow-hotplug
si basa sul demone udev, che non legge gli eventi netlink necessari.
Il demone udev legge solo gli eventi udev "hotplug" ("uevent"). Non vi è alcun "uevento" quando un dispositivo Ethernet rileva una modifica dello stato del collegamento. Puoi verificarlo usando udevadm monitor
.
Gli sviluppatori del kernel Linux hanno deciso deliberatamente di non fornire un "evento" per questo. Vedi:Re:Q:netdev:genera kobject uevent su eventi di rete.
[*] Pedante:tecnicamente ifplugd
funziona interrogando lo stato del collegamento a intervalli regolari. Quindi non si basa necessariamente su eventi "netlink". Questa distinzione è evidenziata da netplug
, che fa utilizzare eventi "netlink". netplug
non ha tutte le stesse funzionalità di ifplugd
.