Hlavní navigace

Restart sítě v Debianu: jak správně na to

19. 11. 2012 22:27 | Petr Krčmář

Restartovat síť v Debianu není taková sranda, jak by se mohlo zdát. Když to uděláte špatně, odříznete se třeba od serveru.

Před čtrnácti dny jsem na Strahově v rámci Střediska unixových technologií (SUT) přednášel o Debianu. Na konci hodinu a půl trvajícího povídání a ukazování přišly na řadu dotazy. I přišel jeden nevinně vypadající: „Jak se v Debianu restartuje síť?“ Vypadá to triviálně – stačí restartovat init skript. Ale ona to taková legrace není, protože to je zastaralý a poměrně nebezpečný způsob. On ten init skript taky varuje:

# /etc/init.d/networking restart

Running /etc/init.d/networking restart is deprecated
because it may not enable again some interfaces ... (warning).

Vznikla kolem toho diskuse, ve které mimo jiné zaznělo: „Tohle jsem nedávno zkusil a skončil jsem bez připojení na server. Naštěstí mašina leží ve vedlejší místnosti.“ Rozhodl jsem se o tom později zjistit víc a ukázalo se, že to trápí opravdu hodně uživatelů a skutečně může nastat nepříjemný problém.

Výše uvedený způsob restartování nám byl dobrý v době, kdy byla konfigurace sítě přísně statická. Síťová rozhraní se nahodila při zapnutí stroje a při vypnutí se zase shodila. Jenže! Mezi tím přišla doba hotplugová, kdy jsme zvyklí připojovat a odpojovat za jízdy haldu různých udělátek, včetně síťových karet, ethernetových kablíků, USB Wi-Fi donglů a jiných krabiček. Systém tedy generuje myriády událostí a reaguje na ně. To se týká i sítí. Před několika lety o tom psal Adam Přibyl v článku Jak události mění Linux.

Pokud restartneme „celou síť“ (čti: všechna rozhraní naráz) pomocí init skriptu, systém nejprve rozhraní shodí a poté je začne nahazovat podle konfigurace v /etc/network/interfaces. Ta může vypadat třeba následovně:

auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet dhcp

V takové situaci se nahodí loopback, protože má příznak auto. Ovšem pak nastane problém – eth0 se vám nezapne, protože ten reaguje až na hotplug událost – v tomto případě zasunutí kabelu. A jste bez konektivity a běžíte do serverovny, či v lepším případě hledáte heslo k managementu. Proto je tento způsob považován za neaktuální, nebezpečný a tudíž nedoporučovaný.

Otázka dne ale zní: jak to tedy uděláme správně?

Potíž je, že ani sami vývojáři na to nemají odpověď. Správná cesta totiž vlastně neexistuje. Někdo radí volat to přes příkaz service nebo invoke-rc.d, ale to jen opět spustí původní init skript, takže si nepomůžeme. Pokud si přečtete mailing listy Debianu (jeden za všechny), zjistíte, že „oficiální přístup“ k věci by se dal shrnout jako: „Restartovat síť jako celek nepotřebujete, restartujte jednotlivá zařízení.“

Doporučuje se proto shodit a nahodit jen konkrétní rozhraní. Přibližně takovým způsobem:

# ifdown eth0 ; ifup eth0

Nedoporučuje se používat parametr -a (jako all, všechna), protože ten vyústí ve stejný problém jako u init skriptu. Pozor taky na radu nejdřív zavolat na init skriptu stop a pak start. Init skript v takovém případě opět jen zavolá  ifup -a.

Příjemné to není, protože (kromě zmíněných problémů) to zmate spoustu uživatelů, kteří jsou na tenhle postup prostě zvyklí (jako já). Zdá se mi ale, že rada restartovat jen konkrétní rozhraní, je poměrně logická. Píše o ní nakonec i dokumentace k Debianu. Hlavní problém tak nakonec vidím v tom, že vám tyhle obecné informace nepodá samotný init skript. Stačilo by připsat informaci: „Správný postup je ifdown eth0; ifup eth0“.