Tento článek je výňatek z kapitoly 15 Linuxu v akci, vydaného nakladatelstvím Manning.
Linux spravuje hardwarové periferie pomocí modulů jádra. Funguje to takto.
Běžící linuxové jádro je jedna z věcí, kterou nechcete naštvat. Koneckonců, jádro je software, který řídí vše, co váš počítač dělá. Vzhledem k tomu, kolik detailů musí být současně spravováno na živém systému, je lepší ponechat jádro, aby svou práci dělalo s co nejmenším množstvím rozptylování. Pokud je však nemožné provést i malé změny ve výpočetním prostředí bez restartování celého systému, pak připojení nové webové kamery nebo tiskárny může způsobit bolestivé narušení vašeho pracovního postupu. Nutnost restartovat pokaždé, když přidáte zařízení, aby jej systém rozpoznal, je stěží efektivní.
Aby se vytvořila účinná rovnováha mezi protichůdnými přednostmi stability a použitelnosti, Linux izoluje jádro, ale umožňuje vám přidávat konkrétní funkce za běhu prostřednictvím zaváděcích modulů jádra (LKM). Jak je znázorněno na obrázku níže, modul si můžete představit jako část softwaru, která jádru říká, kde najde zařízení a co s ním má dělat. Jádro zase zpřístupňuje zařízení uživatelům a procesům a dohlíží na jeho provoz.
Nic vám nebrání napsat si vlastní modul pro podporu zařízení přesně tak, jak byste si přáli, ale proč se obtěžovat? Knihovna modulů pro Linux je již tak robustní, že obvykle není potřeba vytvářet vlastní. A drtivou většinu času Linux automaticky načte modul nového zařízení, aniž byste o tom věděli.
Přesto jsou chvíle, kdy se to z nějakého důvodu nestane samo od sebe. (Nechcete nechat toho náborového manažera netrpělivě čekat, až se váš usměvavý obličej připojí k pracovnímu pohovoru na videokonferenci, příliš dlouho.) Abyste tomu pomohli, budete chtít porozumět trochu více o modulech jádra a zejména , jak najít skutečný modul, který poběží vaše periferie, a jak jej ručně aktivovat.
Hledání modulů jádra
Podle přijaté konvence jsou moduly soubory s příponou .ko (objekt jádra), které se nacházejí pod /lib/modules/
adresář. Než však přejdete úplně dolů k těmto souborům, pravděpodobně si budete muset vybrat. Protože máte při spouštění možnost načíst si jednu ze seznamu verzí, musí někde existovat konkrétní software potřebný k podpoře vaší volby (včetně modulů jádra). No, /lib/modules
/ je jedním z těch míst. A to je místo, kde najdete adresáře plné modulů pro každé dostupné vydání linuxového jádra; například:
$ ls /lib/modules
4.4.0-101-generic
4.4.0-103-generic
4.4.0-104-generic
V mém případě je aktivní jádro verze s nejvyšším číslem vydání (4.4.0-104-generic), ale není zaručeno, že to bude stejné i pro vás (jádra jsou často aktualizována). Pokud budete dělat nějakou práci s moduly, které byste chtěli použít na živém systému, musíte si být jisti, že máte správný adresářový strom.
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
Dobrá zpráva:existuje spolehlivý trik. Spíše než identifikovat adresář podle názvu a doufat, že získáte ten správný, použijte systémovou proměnnou, která vždy ukazuje na název aktivního jádra. Tuto proměnnou můžete vyvolat pomocí uname -r
(-r
určuje číslo vydání jádra ze systémových informací, které by se normálně zobrazovaly):
$ uname -r
4.4.0-104-generic
S těmito informacemi můžete začlenit uname
do odkazů na váš souborový systém pomocí procesu známého jako náhrada příkazů . Chcete-li přejít do správného adresáře, například byste jej přidali do /lib/modules
. Chcete-li Linuxu říci, že "uname" není umístění souborového systému, uzavřete uname
část v backticks, takhle:
$ ls /lib/modules/`uname -r`
build modules.alias modules.dep modules.softdep
initrd modules.alias.bin modules.dep.bin modules.symbols
kernel modules.builtin modules.devname modules.symbols.bin
misc modules.builtin.bin modules.order vdso
Většinu modulů najdete uspořádaných v jejich podadresářích pod kernel/
adresář. Věnujte několik minut procházení těmito adresáři, abyste získali představu o tom, jak jsou věci uspořádány a co je k dispozici. Názvy souborů vám obvykle poskytují dobrou představu o tom, na co se díváte.
$ ls /lib/modules/`uname -r`/kernel
arch crypto drivers fs kernel lib mm
net sound ubuntu virt zfs
To je jeden způsob, jak najít moduly jádra; ve skutečnosti je to rychlý a špinavý způsob, jak toho dosáhnout. Ale není to jediný způsob. Pokud chcete získat kompletní sadu, můžete pomocí lsmod
vypsat všechny aktuálně načtené moduly spolu s některými základními informacemi. . První sloupec tohoto zkráceného výstupu (tady by jich bylo příliš mnoho) je název modulu, následovaný velikostí a číslem souboru a poté názvy ostatních modulů, na kterých je každý závislý:
$ lsmod
[...]
vboxdrv 454656 3 vboxnetadp,vboxnetflt,vboxpci
rt2x00usb 24576 1 rt2800usb
rt2800lib 94208 1 rt2800usb
[...]
Kolik je příliš mnoho? No, spusťte lsmod
ještě jednou, ale tentokrát nasměrováním výstupu na wc -l
získat počet řádků:
$ lsmod | wc -l
113
To jsou načtené moduly. Kolik je celkem k dispozici? Spuštění modprobe -c
a počítání řádků nám dá toto číslo:
$ modprobe -c | wc -l
33350
K dispozici je 33 350 dostupných modulů!?! Vypadá to, že někdo v průběhu let tvrdě pracoval, aby nám poskytl software pro provoz našich fyzických zařízení.
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
Poznámka:Na některých systémech se můžete setkat s přizpůsobenými moduly, na které se odkazuje buď s jejich jedinečnými položkami v /etc/modules
soubor nebo jako konfigurační soubor uložený do /etc/modules-load.d/
. Je pravděpodobné, že takové moduly jsou produktem místních rozvojových projektů, které možná zahrnují špičkové experimenty. Ať tak či onak, je dobré mít určitou představu o tom, na co se díváte.
Tak najdete moduly. Vaším dalším úkolem je přijít na to, jak ručně načíst neaktivní modul, pokud se to z nějakého důvodu nestalo samo o sobě.
Ruční načítání modulů jádra
Než budete moci načíst modul jádra, logika velí, že budete muset potvrdit, že existuje. A než to uděláte, musíte vědět, jak se tomu říká. Získání této části někdy vyžaduje stejným dílem magii a štěstí a určitou pomoc od tvrdé práce autorů online dokumentace.
Proces ilustruji popisem problému, na který jsem před časem narazil. Jednoho krásného dne mi z důvodu, který mi stále uniká, přestalo fungovat WiFi rozhraní na notebooku. Přesně takhle. Možná to vyřadila aktualizace softwaru. Kdo ví? Spustil jsem lshw -c network
a dostal se k této velmi podivné informaci:
network UNCLAIMED
AR9485 Wireless Network Adapter
Linux rozpoznal rozhraní (Atheros AR9485), ale uvedl jej jako nenárokované. No, jak se říká:"Když jde do tuhého, tvrďák hledá na internetu." Spustil jsem vyhledávání atheros ar9 linux module a poté, co jsem procházel stránkami a stránkami pět a dokonce i 10 let starých výsledků, které mi doporučovaly, abych si napsal svůj vlastní modul, nebo se prostě vzdal, jsem nakonec zjistil, že (alespoň s Ubuntu 16.04) funkční modul existuje. Jeho název je ath9k.
Ano! Bitva je jako vyhraná! Přidání modulu do jádra je mnohem jednodušší, než se zdá. Chcete-li znovu zkontrolovat, zda je k dispozici, můžete spustit příkaz find
oproti stromu adresářů modulu zadejte -type f
říct Linuxu, že hledáte soubor, a pak přidat řetězec ath9k
spolu s hvězdičkou glob pro zahrnutí všech názvů souborů, které začínají vaším řetězcem:
$ find /lib/modules/$(uname -r) -type f -name ath9k*
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_common.ko
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k.ko
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_htc.ko
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_hw.ko
Ještě jeden krok, načtěte modul:
# modprobe ath9k
A je to. Žádné restarty. Žádný povyk.
Zde je ještě jeden příklad, který vám ukáže, jak pracovat s aktivními moduly, které se poškodily. Bývaly doby, kdy používání mé webové kamery Logitech s konkrétním softwarem způsobilo, že fotoaparát byl až do příštího spuštění systému nedostupný pro jiné programy. Někdy jsem potřeboval otevřít fotoaparát v jiné aplikaci, ale neměl jsem čas vypnout a znovu spustit. (Spouštím spoustu aplikací a dostat je všechny na místo po spuštění nějakou dobu trvá.)
Protože tento modul je pravděpodobně aktivní pomocí lsmod
k vyhledání slova video by mi měl dát nápovědu ohledně názvu příslušného modulu. Ve skutečnosti je to lepší než nápověda:Jediný modul popsaný slovem video je uvcvideo (jak můžete vidět v následujícím textu):
$ lsmod | grep video
uvcvideo 90112 0
videobuf2_vmalloc 16384 1 uvcvideo
videobuf2_v4l2 28672 1 uvcvideo
videobuf2_core 36864 2 uvcvideo,videobuf2_v4l2
videodev 176128 4 uvcvideo,v4l2_common,videobuf2_core,videobuf2_v4l2
media 24576 2 uvcvideo,videodev
Pravděpodobně tu bylo něco, co jsem mohl ovládat, aby to způsobilo havárii, a myslím, že jsem mohl sáhnout trochu hlouběji, abych zjistil, jestli dokážu věci opravit správným způsobem. Ale víte, jak to je; někdy vás nezajímá teorie a chcete, aby vaše zařízení fungovalo. Použil jsem tedy rmmod
zabít modul uvcvideo a modprobe
abych to znovu rozjel, vše pěkně a svěže:
# rmmod uvcvideo
# modprobe uvcvideo
Opět:žádné restarty. Žádné odolné skvrny od krve.