Hlavní navigace

Předvídatelné pojmenování síťových karet v Linuxu: kam se podělo eth0

Petr Krčmář

Proč už se vaše síťová karta nejmenuje eth0? Proč se teď jmenují eno, enp nebo jinak podivně? Vysvětlíme si, proč se v nových distribucích rozhraní jmenují jinak a jak jejich nové názvy chápat.

Doba čtení: 6 minut

Proč už eth0 nestačí?

Pokud používáte Linux už nějakou dobu, zřejmě jste si zvykli na to, že se drátová síťová rozhraní jmenují eth0, eth1 … a bezdrátová mají názvy jako wlan0, wlan1 … Tohle už ale v nových verzích distribucí neplatí a po čisté instalaci zjistíte, že se vám rozhraní pojmenovala úplně jinak. Na začátku je potřeba zdůraznit, že nejde o nějaký výmysl „aby se něco předělalo“, ale tahle změna dává smysl.

Klasický způsob pojmenování stavěl na tom, že rozhraní dostávala označení v tom pořadí, v jakém je detekoval některý z jaderných ovladačů. Potíž je v tom, že takové označení je značně nepředvídatelné. Zhoršilo se to ještě s příchodem paralelizace bootu, kterou přinesl systemd.

Může se vám tedy stát, že při příštím bootu se vaše původní karta eth0 bude jmenovat eth1 a obráceně. To může mít neblahé důsledky zejména u serverů a síťových prvků, kdy vám třeba na firewallu nebudou platit pravidla pro otočená rozhraní nebo vám přestane fungovat NAT a bude se překládat opačným směrem. Tohle opravdu nechcete.

Pojmenování podle MAC nefunguje

Postupně bylo navrženo a implementováno několik řešení. Tím prvním byla úprava udev, který přiděloval názvy rozhraní vždy ve stejném pořadí podle hodnoty MAC adresy. To je na první pohled velmi predikovatelná metoda a zdálo by se, že to bude stačit. Má to ale mnoho různých nevýhod.

Vyžaduje to zapisovatelný root, což je obecně v průběhu bootu problém. Navíc tím přicházíme o bezstavovost systému, protože se při bootu mění konfigurace. Na některých systémech není k dispozici statická MAC adresa, což se týká například různých embedded krabiček nebo třeba virtualizovaných prostředí.

Nejdůležitější problém ale vzniká tím, že utility v uživatelském prostoru závodí s jádrem v tom, kdo kdy přidělí rozhraní jméno. Tenhle závod o pořadí přináší klasické problémy souběhu (angl. race condition), což způsobuje řadu podivných problémů. Třeba to, že se někdy jméno nepodaří vůbec přidělit.

Tohle řešení tedy trpí opět stejným problémem – nepredikovatelností. Zase si nemůžete být jisti, že vám systém pokaždé nabootuje do stejně konzistentního stavu jako jindy. Proto bylo tohle řešení poměrně brzy z udev zase vyndáno.

Podle fyzického umístění to taky nejde

Druhým na pohled zajímavým řešením byla implementace biosdevname, což je mechanismus postavený na fixní topologii základních desek. Stejnojmenná utilita je schopna číst informace uložené v Biosu základních desek, zejména položky type 9 (System Slot) a type 41 (Onboard Devices Extended Information).

Postup je jednoduchý: zjistíme po domluvě se základní deskou, kam je která karta fyzicky připojená a podle toho ji pojmenujeme. Protože je zapojení karet s velkou jistotou stejné, bude stejné i pořadí, v jakém přidělíme jména rozhraním.

Zmíněná utilita převezme původní názvy rozhraní z jádra, řekne si o tabulku z Biosu a podle ní vrátí nové názvy, jaké by rozhraní „měla mít“ podle této metody. Nejprve jdou vestavěné síťovky, poté karty zasunuté do slotů a nakonec případně jednotlivá rozhraní na kartách. Opět to vypadá docela dobře.

Funguje to ale jen v případě, že Bios skutečně poskytuje relevantní data a že karty jsou ve svých pozicích zasunuty už během bootu. Ani jedno přitom není taková samozřejmost, jak by se mohlo zdát. Velmi často to způsobuje vymýšlení krkolomných pojmenovávacích schémat.

Jakmile do toho přidáme ještě odpojitelné karty (virtuální nebo hot-plugové), všechno se ještě zkomplikuje, protože do hry vstoupí více instancí udev, přičemž device tree už je naplněný a každý paralelní udev pak uvidí jiný PCI tree a opět tak není možné garantovat, že hádající se udevy budou přidělovat názvy ve stejném pořadí a rozsahu.

Předvídatelné názvy

Protože žádná z těchto metod nedává uspokojivé výsledky, bylo potřeba vymyslet jinou metodu. Přidělovat statické názvy podle fyzického umístění karet je stále považováno za dobrou metodu. Karty jsou při každém startu pojmenovány stejně a názvy jsou konzistentní i při odebrání či přidání rozhraní – nedojde tedy k nechtěnému přečíslování ostatních názvů. Znamená to také například, že je možné poškozený hardware vyměnit kus za kus bez dalších zásahů do konfigurace.

Nové pojmenování přišlo společně s vydáním systemd verze 197 a přineslo nová schémata pojmenování, jejichž kombinací dnes obvykle nové verze distribucí používají:

  1. integrované síťové karty jsou pojmenovány eno0eno1
  2. karty ve slotech PCI Express jsou pojmenovány ens0ens1
  3. karty s více konektory přidávají k názvům ještě pozici:  enp1s0
  4. (volitelné) název odvozený z MAC adresy: enx78e7d1ea46da
  5. klasické nepředvídatelné pojmenování podle jádra jako  eth0

Ve výchozím stavu se při bootu postupuje od prvního bodu, přičemž čtvrtá varianta je obvykle vypnutá. Pokud není možné kartě přidělit jméno podle hardwarové topologie a všechna vyšší schémata tedy selžou, zůstane se u tradiční metody pojmenování.

Pokud máte problém si písmenka zapamatovat, tak vězte, že klíčová slova jsou: 

  • en — ethernet
  • sl — serial line
  • wl — wlan
  • ww — wwan
  • o – onboard
  • s – slot
  • p – port

Zároveň je celá tato metoda použita jen v případě, že není uživatelem vynuceno jiné schéma pojmenování – tedy už zmíněnou utilitou biosdevname, pojmenováním pomocí udev nebo třeba ruční volbou názvu v dané distribuci. Jinými slovy: pokud neuděláte nic, platí výše zmíněná schémata.

Co mi to přináší?

Především je toto pojmenování stále stejné. Přežije rebooty, výměnu hardware, odebrání/přidání zařízení, aktualizaci ovladačů i jádra a vy se můžete spolehnout na to, že vnější síťové rozhraní k vašemu poskytovateli je vždy  eno0.

Podívejte se ve svém systému do adresáře /sys/class/net. V něm naleznete názvy síťových rozhraní. Jsou to symbolické odkazy na skutečné cesty odkazující na umístění jednotlivých karet. Podstatné je, že názvy jsou neměnné a budou vždy stejné.

Další výhodou je, že se o pojmenování už nemusíte starat. Tohle prostě funguje „samo od sebe“, není potřeba manuálně volit, jak se která karta bude jmenovat a při změnách v hardware zasahovat do konfigurace. Navíc tohle schéma docela dobře připomíná třeba pojmenování diskových oddílů v /dev. První oddíl na prvním disku je sda1, první port na první kartě je  enp0s0.

Systém tak zůstává bezestavový, není potřeba při startu zasahovat do /etc, takže si systém se stejným pojmenováním karet poradí, i když ještě nemá zapisovatelný root. Funguje to tedy stejně napříč distribucemi i různými hardwarovými platformami.

Samozřejmě je tohle věc, která potěší především správce serverů, routerů, firewallů a obecně zařízení, která mají více síťových karet. Pokud máte notebook, prostě se vám jen rozhraní přejmenovala podle nových pravidel.

Když to nechci

Nespornou výhodou je i to, že když se vám tenhle způsob nelíbí, můžete se snadno vrátit k tomu starému. Máte dokonce tři možnosti, jak to udělat:

Zaprvé můžete přepsat výchozí politiku, která se o pojmenování stará. Stačí k tomu vytvořit symbolický link:

# ln -s /dev/null /etc/udev/rules.d/80-net-name-slot.rules

Můžete si také vytvořit vlastní politiku, která vám pojmenuje rozhraní podle vašich voleb. Můžou se pak jmenovat internet0, dmz0 nebo lan0. Budete k tomu muset vytvořit nový soubor .rule a vybrat si názvy ve volbě NAME. Detaily naleznete v manuálové stránce k systemd.link.

Asi nejjednodušší je pak přidání parametru jádra, který zajistí vypnutí nového schématu a přechod na klasické pojmenování. Do souboru /etc/default/grub přidejte do volby GRUB_CMDLINE_LINUX parametr net.ifnames=0. Poté nezapomeňte zavolat update-grub a rebootovat.

Odkazy k dalšímu čtení

Našli jste v článku chybu?