Linux odvádí skvělou práci při automatickém rozpoznávání, načítání a odhalování připojených hardwarových zařízení od bezpočtu dodavatelů. Ve skutečnosti to byla tato funkce, která mě před mnoha lety přesvědčila, abych trval na tom, aby můj zaměstnavatel převedl celou infrastrukturu na Linux. Problémem byl způsob, jakým jistá společnost v Redmondu nemohla načíst ovladače pro integrovanou síťovou kartu na našich počítačích Compaq, zatímco Linux to bez námahy dokázal.
Během let od té doby se linuxová knihovna uznávaných zařízení nesmírně rozrostla spolu se sofistikovaností procesu. A hvězdou této show je udev. Úkolem Udeva je naslouchat událostem z linuxového jádra, které zahrnují změny stavu zařízení. Může to být nové zařízení USB, které je zapojeno nebo vytaženo, nebo to může být bezdrátová myš, která se přepne do režimu offline, když se utopí v rozlité kávě.
Úkolem Udev je zpracovávat všechny změny stavu, například přidělováním jmen nebo oprávnění, přes která se k zařízením přistupuje. Záznam o těchto změnách je přístupný přes dmesg. Protože dmesg obvykle chrlí tisíce záznamů, je chytré výsledky filtrovat. Níže uvedený příklad ukazuje, jak Linux identifikuje mé WiFi rozhraní. Zobrazuje čipovou sadu, kterou používá moje bezdrátové zařízení (ath9k ), původní název, který mu byl přidělen na začátku procesu (wlan0 ) a velké, ošklivé trvalé jméno, které aktuálně používá (wlxec086b1ef0b3 ):
$ dmesg | grep wlan
[ 5.396874] ath9k_htc 1-3:1.0 wlxec086b1ef0b3:přejmenováno z wlan0
V tomto článku budu diskutovat o tom, proč by někdo mohl chtít používat takové jméno. Po cestě prozkoumám anatomii konfiguračních souborů udev a pak ukážu, jak provést změny v nastavení udev, včetně toho, jak upravit způsob, jakým systém pojmenovává zařízení. Tento článek je založen na modulu z mého nového kurzu, Linux System Optimization.
Porozumění konfiguračnímu systému udev
Na počítačích systemd jsou operace udev spravovány pomocí systemd-udevd démon. Stav démona udev můžete zkontrolovat běžným způsobem systemd pomocí systemctl status systemd-udevd .
Další zdroje pro Linux
- Cheat pro příkazy Linuxu
- Cheat sheet pro pokročilé příkazy systému Linux
- Bezplatný online kurz:Technický přehled RHEL
- Síťový cheat pro Linux
- Cheat sheet SELinux
- Cheat pro běžné příkazy pro Linux
- Co jsou kontejnery systému Linux?
- Naše nejnovější články o Linuxu
Technicky udev funguje tak, že se snaží porovnat každou systémovou událost, kterou obdrží, se sadou pravidel nalezených v /lib/udev/rules.d/ nebo /etc/udev/rules.d/ adresáře. Soubory pravidel zahrnují klíče shody a klíče přiřazení. Sada dostupných klíčů pro shodu zahrnuje akci , jméno a subsystém . To znamená, že pokud je detekováno zařízení se zadaným názvem, které je součástí zadaného subsystému, bude mu přiřazena přednastavená konfigurace.
Poté se k použití požadované konfigurace použijí dvojice klíč/hodnota „přiřazení“. Můžete například zařízení přiřadit nový název, přiřadit jej k symbolickému odkazu souborového systému nebo omezit přístup na konkrétního vlastníka nebo skupinu. Zde je výňatek z takového pravidla z mé pracovní stanice:
$ cat /lib/udev/rules.d/73-usb-net-by-mac.rules
# Používejte názvy založené na MAC pro síťová rozhraní, která jsou přímo nebo nepřímo
# na USB a mít univerzálně spravovanou (stabilní) MAC adresu (druhý bit
# je 0). Nedělejte to, když je ifnames zakázáno pomocí příkazového řádku jádra nebo
# přizpůsobením/vypnutím 99-default.link (nebo dříve 80-net-setup-link.rules).
IMPORTOVAT {cmdline}="net.ifnames"
ENV{net.ifnames}=="0", GOTO="usb_net_by_mac_end"
ACTION=="add", SUBSYSTEM=="net ", SUBSYSTEMS=="usb", NAME=="", \
ATTR{address}=="?[014589cd]:*", \
TEST!="/etc/udev/rules .d/80-net-setup-link.rules", \
TEST!="/etc/systemd/network/99-default.link", \
IMPORT{builtin}="net_id" , NAME="$env{ID_NET_NAME_MAC}"
Přidat akce říká udev, aby se spustil vždy, když je připojeno nové zařízení, které je součástí síťového subsystému a je zařízení USB. Pokud tomu dobře rozumím, pravidlo se navíc uplatní pouze tehdy, když má zařízení MAC adresu složenou ze znaků v určitém rozsahu a navíc pouze v případě, že 80-net-setup-link.rules a 99-default.link soubory ne existovat.
Za předpokladu splnění všech těchto podmínek se ID rozhraní změní tak, aby odpovídalo MAC adrese zařízení. Zapamatujte si předchozí záznam dmesg ukazující, jak se změnil název mého rozhraní z wlan0 k tomu ošklivému wlxec086b1ef0b3 název? To byl výsledek provádění tohoto pravidla. Jak to mám vědět? Protože ec:08:6b:1e:f0:b3 je MAC adresa zařízení (bez dvojteček):
$ ifconfig -a
wlxec086b1ef0b3:flags=4163mtu 1500
inet 192.168.0.103 26 inet 8 /0.5 2005 2000 maska sítě 2.5. :7484:3120:c6a3:e3d1 prefixlen 64 scopeid 0x20
ether ec:08:6b:1e:f0:b3 txqueuelen 1000 (Ethernet)
5 R17 7 bajtů
5 R 8 8 bajtů
5 R 8 br /> Chyby RX 0 zahozeno 0 překročení 0 snímek 0
TX pakety 472448 bajtů 201773965 (201,7 MB)
TX 00 překročení chyb 00> 0Toto pravidlo udev existuje standardně v Linuxu. Nemusel jsem to psát sám. Ale proč se obtěžovat – zvláště když vidíme, jak obtížné je pracovat s takovým označením rozhraní? Podívejte se znovu na komentáře zahrnuté v pravidle:
# Názvy založené na MAC používejte pro síťová rozhraní, která jsou přímo nebo nepřímo
# na USB a mají univerzálně spravovanou (stabilní) MAC adresu (druhý bit
# je 0). Nedělejte to, když je ifnames zakázáno pomocí příkazového řádku jádra nebo
# přizpůsobením/vypnutím 99-default.link (nebo dříve 80-net-setup-link.rules).Všimněte si, jak je toto pravidlo navrženo speciálně pro síťová rozhraní založená na USB. Na rozdíl od karet síťového rozhraní PCI (NIC) budou zařízení USB pravděpodobně čas od času odstraněna a nahrazena. To znamená, že neexistuje žádná záruka, že se jejich ID nezmění. Mohou to být wlan0 jeden den a wlan3 další. Abyste se vyhnuli zmatení aplikací, přiřaďte zařízením absolutní ID – jako ta, která je přidělena mému rozhraní USB.
Manipulace s nastavením udev
Pro svůj další trik vezmu MAC adresu a aktuální ID pro síťové rozhraní Ethernet na virtuálním počítači VirtualBox a poté použiji tyto informace k vytvoření nového pravidla udev, které změní ID rozhraní. Proč? No, možná plánuji pracovat se zařízením z příkazové řádky a psaní tohoto dlouhého názvu může být nepříjemné. Zde je návod, jak to bude fungovat.
Než budu moci změnit své ID, budu muset deaktivovat aktuální konfiguraci sítě Netplan. To donutí Linux věnovat pozornost nové konfiguraci. Zde je můj aktuální konfigurační soubor síťového rozhraní v /etc/netplan/ adresář:
$ méně /etc/netplan/50-cloud-init.yaml
# Tento soubor je generován z informací poskytnutých
# zdrojem dat. Změny v něm nebudou přetrvávat v rámci instance.
# Chcete-li deaktivovat možnosti konfigurace sítě cloud-init, zapište soubor
# /etc/cloud/cloud.cfg.d/99-disable-network-config .cfg s následujícím:
# network:{config:disabled}
network:
ethernets:
enp0s3:
adresy:[]
dhcp4:true
verze:2Soubor 50-cloud-init.yaml obsahuje velmi základní definici rozhraní. Obsahuje ale také některé důležité informace o deaktivaci konfigurace v komentářích. Za tímto účelem přejdu na /etc/cloud/cloud.cfg.d adresář a vytvořte nový soubor s názvem 99-disable-network-config.cfg a přidejte síť:{config:disabled} řetězec.
I když jsem tuto metodu netestoval na jiných distroch než Ubuntu, měla by fungovat na jakékoli variantě Linuxu se systemd (což jsou téměř všechny). Ať už používáte cokoli, budete mít dobrý přehled o psaní konfiguračních souborů udev a jejich testování.
Dále musím shromáždit nějaké systémové informace. Spuštění ip příkaz hlásí, že mé rozhraní Ethernet se nazývá enp0s3 a jeho MAC adresa je 08:00:27:1d:28:10 :
$ ip a
2:enp0s3:mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:1d:28:10 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.115/24 brd 192.168.0.255 rozsah globální dynamické enp0s3Nyní vytvořím nový soubor s názvem peristent-net.rules v /etc/udev/rules.d adresář. Pojmenuji soubor, který začíná nízkým číslem, 10:
$ cat /etc/udev/rules.d/10-persistent-network.rules
ACTION=="add", SUBSYSTEM=="net",ATTR{address}=="08:00:27:1d:28:10",NAME="eth3"Čím nižší číslo, tím dříve Linux soubor spustí, a já chci, aby tento byl spuštěn dříve. Soubor obsahuje kód, který bude mít název eth3 do síťového zařízení, když je přidáno – pokud jeho adresa odpovídá 08:00:27:1d:28:10 , což je MAC adresa mého rozhraní.
Jakmile uložím soubor a restartuji počítač, měl by být ve hře můj nový název rozhraní. Možná se budu muset přihlásit přímo ke svému virtuálnímu počítači a použít dhclient ručně přimět Linux, aby požadoval IP adresu v této nově pojmenované síti. Otevření relací SSH může být nemožné, aniž byste to nejprve udělali:
$ sudo dhclient eth3
Hotovo. Nyní tedy můžete přinutit udev, aby váš počítač odkazoval na NIC tak, jak chcete. Ale co je důležitější, máte nástroje, abyste zjistili, jak spravovat jakékoli špatně se chovající zařízení.
Linux