Existuje řešení pro chybu Debianu #838871?
Problém:Chci mít v Debianu konfiguraci sítě s následujícími vlastnostmi:
- Automaticky připojí síťové rozhraní po připojení kabelu
- spouští se bez blokování po dlouhou dobu, když není připojen žádný kabel,
- Nepřepínám svůj init systém
Standardní způsob, jak to udělat, by byl následující fragment v /etc/network/interfaces
:
allow-hotplug eth0
iface eth0 inet dhcp
To však vede k problému popsanému v připojené zprávě o chybě:Proces spouštění se zablokuje na> 1 minutu, pokud není připojen žádný síťový kabel, s následující zprávou:
configuring network interfaces... ifup: waiting for lock on /run/network/ifstate.eth0
Zdá se, že řešení uvedené v této otázce mění allow-hotplug
na auto
:
auto eth0
iface eth0 inet dhcp
Tím účinně zmizí zpráva o blokování spouštění, ale systém se nyní zablokuje těsně předtím, než se na tty1 zobrazí výzva k přihlášení. Tentokrát dhclient blokuje, protože se pokouší získat odpověď dhcp na eth0, který není připojen, a čeká na několik pokusů, než vyprší časový limit. Výzva k přihlášení se objeví až po vypršení časového limitu dhclient.
Pro uživatele s grafickým DE to nemusí být problém, protože se nemusí přihlašovat na tty1, místo toho se spouští DE a nikdy neuvidí zprávu dhclient.
Dalším řešením by pravděpodobně bylo použití network-manager
. V ideálním případě bych raději nepoužíval správce sítě, ale jako poslední možnost jsem to zkusil. Na Debian busteru je však řetězec závislostí správce sítě v konfliktu s sysvinit-core
, což je můj init systém.
Poslední alternativou, která mě napadá, je nekonfigurovat eth0 v interfaces(5). Tím zmizí všechny zaváděcí bloky, ale musím ručně ifup eth0
po připojení ethernetového kabelu.
Nějaké lepší nápady?
AKTUALIZACE:Abychom reagovali na citaci z @sourcejedi, „allow-hotplug“ je specifikováno jako „spustit rozhraní, když jádro detekuje událost hotplug z rozhraní“ v dokumentaci k Debianu v části Debian networking. Související otázky:Dobré podrobné vysvětlení syntaxe /etc/network/interfaces? a Co je hotplug událost z rozhraní?
Přijatá odpověď:
Před network-manager
, dobře známý způsob, jak „automaticky ifup
síťové rozhraní po připojení kabelu“ bylo ifplugd
. (Všimněte si původního autora :-P). ifplugd
je stále k dispozici v Debianu. Nemám s tím žádné nedávné zkušenosti.
Nejprve byste odstranili auto eth0
nebo allow hotplug eth0
řádek z /etc/network/interfaces
. Stále byste potřebovali svůj řádek iface eth0 inet dhcp
. (Tento řádek závisí na názvu vašeho síťového rozhraní a také na tom, zda chcete přidat podporu ipv6 atd.).
Chcete-li nakonfigurovat ifplugd
pro zobrazení rozhraní upravte /etc/default/ifplugd
nastavte INTERFACES=
zadejte název vašeho síťového rozhraní. Případně navrhuje, abyste mohli použít hodnotu auto
. Nevím, jak dobře je auto
funguje na jakémkoli nejnovějším systému :-).
https://manpages.debian.org/buster/ifplugd/ifplugd.conf.5.en.html
Tato funkce nebyla nikdy poskytnuta allow-hotplug
:
Všimněte si, že kontrola stavu propojení tam nebyla vždy a v každém případě byla provedena pouze při bootování. Nikdy nepodporoval případ, kdy při spouštění nebyl připojen žádný kabel a kdy jste kabel zapojili později. — Zpráva #20
Zdroje, které tomu odporují, se prostě mýlí. Pokud chcete tuto funkci, musíte spustit démona, který čeká na události „netlink“.[*] The Debian ifupdown
balíček neobsahuje žádného démona. allow-hotplug
spoléhá na démona udev, který nečte nezbytné události netlink.
Démon udev čte pouze události udev „hotplug“ („uevent“). Neexistuje žádná „uevent“, když ethernetové zařízení detekuje změnu stavu připojení. Můžete to ověřit pomocí udevadm monitor
.
Vývojáři linuxového jádra se záměrně rozhodli neposkytovat k tomu „uevent“. Viz:Re:Otázka:netdev:generování události kobject u událostí v síti.
[*] Pedant:technicky ifplugd
funguje tak, že se v pravidelných intervalech dotazuje na stav spojení. Nemusí se tedy nutně spoléhat na události „netlink“. Na tento rozdíl poukazuje netplug
, což dělá použijte události „netlink“. netplug
nemá všechny stejné funkce jako ifplugd
.