GNU/Linux >> Znalost Linux >  >> Linux

Jak načíst nebo uvolnit modul jádra Linuxu

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.


Linux
  1. Linux – Jak zjistit, který modul poškozuje jádro?

  2. Jak napsat svůj vlastní modul linuxového jádra s jednoduchým příkladem

  3. Jak předat hodnotu vestavěnému modulu jádra Linuxu při spouštění?

  1. Jak upgradovat jádro na ploše Linuxu

  2. Jak zkontrolovat verzi jádra v Linuxu

  3. Co je to poskvrněné jádro v Linuxu?

  1. Linux – poskvrněné jádro v Linuxu?

  2. Linux – Jak správně znovu načíst modul jádra?

  3. Jak vytvořit, zkompilovat, načíst moduly jádra Linuxu LKM