- Příkaz depmod analyzuje moduly jádra a generuje soubor modules.dep s jejich závislostmi, aby systém načetl každý modul ve správném pořadí.
- Volby jako -a, -A, -b, -F nebo -e umožňují upravit rozsah analýzy, použít pracovní adresáře a detekovat nevyřešené symboly.
- Konfigurace v souboru depmod.d pomocí příkazů search a override řídí prioritu adresářů a verzí modulů.
- Ruční spuštění depmod je klíčem k řešení chyb při načítání modulů, zejména po aktualizaci nebo rekompilaci jádra.
Pokud pracujete s Linuxem a upravujete jádro, dříve či později narazíte na `depmod` a soubor `modules.dep` . Možná jste se s ním setkali při aktualizaci systému , instalaci externích ovladačů nebo, jak se stává mnoha lidem, když program jako VirtualBox přestane načítat své moduly a zobrazí se klasická zpráva „modul nenalezen“.
V tomto článku se ponoříme do toho, co přesně příkaz `depmod` v Linuxu dělá, jak interně funguje , jakou roli hrají konfigurační soubory `depmod.d` a jak jej můžete používat ve své každodenní práci, abyste se vyhnuli problémům s moduly jádra. Vše je vysvětleno ve spisovné španělštině (ze Španělska) s jasnými příklady a bez jakýchkoli předpokladů nad rámec znalosti otevírání terminálu.
Co je depmod a k čemu se v Linuxu používá?
Příkaz depmod je nástroj pro práci v uživatelském prostoru který analyzuje všechny moduly daného jádra a identifikuje, které symboly exportují a které vyžadují. Na základě této analýzy generuje soubor závislostí, obvykle nazývaný modules.dep, který systém používá k poznání, které moduly by měly být načteny před ostatními.
V Linuxu mohou moduly jádra nabízet služby ostatním modulům prostřednictvím symbolů, které jsou v kódu označeny makry jako EXPORT_SYMBOLKdyž druhý modul použije jeden z těchto symbolů, stane se závislým na prvním. V instalacích s mnoha načítatelnými moduly se tato síť závislostí může stát poměrně složitou, pokud není správně spravována.
Poslání Depmoda se dá jednoduše popsat, ale je velmi důležité: procházet strom modulů v /lib/modules/Zjišťuje, které symboly každý modul exportuje a které symboly vyžaduje, a na základě toho sestavuje seznam závislostí. Tímto způsobem, když jiný nástroj, jako například modprobe Pokud chcete načíst konkrétní modul, budete předem vědět, které další moduly by měly být načteny jako první.
Kromě souboru modules.dep generuje příkaz depmod ve stejném adresáři také několik souborů „map“, které používá infrastruktura hotplug a nástroje kmod ke správě dynamického načítání modulů (například když připojíte zařízení USB a systém rozhodne, který ovladač načíst ).
Základní syntaxe příkazu depmod
Nejjednodušší způsob, jak nástroj použít, je volat ho bez voleb, což způsobí, že se vygeneruje soubor modules.dep pro běžící jádro . Obecná syntaxe je podle manuálové stránky následující:
depmod
Lze jej také vyvolat zadáním konkrétních modulů jako argumentů, v takovém případě `depmod` prověří pouze tyto moduly . Toto použití je méně běžné, protože je obvykle žádoucí udržovat aktuální závislosti celého stromu modulů, nikoli pouze jednoho modulu.
Formálně řečeno, manuálová stránka představuje něco jako toto:
depmod
depmod
V těchto variantách, verze označuje verzi jádra (například 5.4.0-81-generic), jehož adresář modulů má být analyzován. Pokud není nic zadáno, depmod použije verzi vrácenou funkcí uname -r, tedy jádro, které běží v daném okamžiku.
Nejdůležitější parametry a možnosti depmodu
Příkaz má několik možností, které umožňují upravit jeho chování. Mnohé z nich jsou nezbytné při práci s prostředími pro sestavení, vlastními jádry nebo oblastmi pro přípravu . Nejčastěji používané možnosti jsou shrnuty níže:
| Možnost / Parametr | popis |
|---|---|
kernel_version |
Volitelný parametr, který udává verze jádra, pro kterou budou generovány závislostiPokud je vynechán, použije se běžící jádro. |
-a, --all |
To způsobí, že depmod generuje informace o závislostech. pro všechny nainstalované verze jádraPokud nejsou na příkazovém řádku předány žádné názvy souborů, je tento režim ve výchozím nastavení povolen. |
-A, --quick |
Rychlý režim: depmod Zkontrolujte, zda existují nějaké moduly novější než modules.dep A pokud žádné nejsou, ukončí se bez regenerace čehokoli. To šetří čas v systémech s mnoha moduly. |
-b <basedir>, --basedir <basedir> |
Umožňuje vám specifikovat alternativní základní adresář, kde se nacházejí modulyTo je velmi užitečné, pokud pracujete v pracovním adresáři, jiném než /lib/modules/<versión>. basedir Je odstraněn z cest, které jsou zapsány v modules.dep, čímž je soubor připraven k přesunutí do jeho konečného umístění. |
-C <archivo o directorio>, --config |
S touto možností můžete nahradit výchozí konfigurační soubor (obvykle /etc/depmod.conf nebo adresář /etc/depmod.d/ pokud ten první neexistuje). |
-e, --errsyms |
Když se to spojí s -F, provede depmod Zpráva o symbolech, které modul potřebuje, ale které nejsou k dispozici ani jinými moduly, ani samotným jádrem. |
-F <System.map>, --filesyms |
Umožňuje zadat soubor System.map generovaný při kompilaci jádraaby depmod věděl, které symboly jsou již v samotném jádře vyřešeny, a mohl správně nahlásit chybějící. |
-h, --help |
Zobrazí krátkou nápovědu k použití příkazu a Poprava končí.. |
-n, --dry-run |
Provádí všechny výpočty, ale zapište výstup do konzole (stdout) namísto generování souborů v adresáři modulů. Velmi užitečné pro kontrolu, co by depmod udělal, aniž by cokoli změnil. |
-v, --verbose |
Podrobný režim: depmod se zobrazí na obrazovce všechny symboly, na kterých každý modul závisí a název modulu, který je poskytuje. |
-V, --version |
Ukazuje verze programu depmod A funguje to. Ve velmi starých jádrech mohou být nutné další aspekty, jak varuje samotná dokumentace. |
Kromě voleb je dobré si uvědomit, že pokud jako argumenty předáte názvy souborů modulů, depmod je pouze prozkoumá, místo aby zpracoval celý obsah adresáře modulů odpovídajícího vybrané verzi jádra.
Praktický případ: jak depmod dokáže opravit problémy s moduly (příklad s VirtualBoxem)
Velmi reprezentativním příkladem užitečnosti depmodu je případ VirtualBox přestal fungovat, protože chybí moduly jádraPředstavte si reálnou situaci: po aktualizaci nebo rekompilaci jádra, při pokusu o spuštění virtuální strojVirtualBox varuje, že nemůže načíst modul. vboxdrv nebo jiné související moduly.
V takovém případě se běžné objevují chybové zprávy související s System.map a s absencí určitých modulů v očekávaných cestách. Může se například stát, že soubor System.map se nenachází tam, kde by ho depmod nebo systémové nástroje očekávaly (například v /usr/src/linux), ačkoli existuje v /boot.
Řešení široce diskutované na technických fórech (jako je fórum Arch nebo prostředí Gentoo) obvykle zahrnuje spuštění jednoduchého sudo depmod -a vynutit regeneraci ze souboru modules.dep verze jádra, kterou používáte. Po tomto kroku zkuste modul načíst ručně pomocí modprobe vboxdrv A pokud je vše v pořádku, chyba zmizí.
Co tento příkaz ve skutečnosti dělá, je, že znovu prochází všechny moduly dostupné pro dané jádro, přepočítat mapu exportovaných a požadovaných symbolů a aktualizovat soubory závislostí a map používané jinými nástroji, včetně modprobe. Pokud by se vyskytly nesrovnalosti mezi přítomnými moduly a tím, co se objevilo v modules.dep, jsou opraveny.
V praxi to znamená, že pokud jste nainstalovali, překompilovali nebo přesunuli moduly (například ty z VirtualBoxu) bez regenerace závislostí, příkaz depmod „uvede věci do pořádku“, takže systém opět ví, kdo na kom závisí a co by se mělo načíst před čím.
Jak depmod generuje modules.dep a další mapové soubory
Pokud se podíváme trochu podrobněji, depmod funguje tak, že analyzuje všechny moduly nalezené pod /lib/modules/<versión> nebo adresář, který byl nakonfigurovánU každého modulu kontroluje, které symboly exportuje (tj. které funkce nebo proměnné nabízí ostatním modulům) a které symboly potřebuje k fungování.
S těmito informacemi depmod sestaví seznam závislostí v souboru modules.depumístěné ve stejném adresáři modulů. Každý řádek souboru označuje modul a moduly, na kterých závisí, což slouží jako základ pro nástroje jako například modprobe při načítání modulů ve správném pořadí.
Nástroj také generuje další mapové soubory pro infrastrukturu hotplugů a systém správy modulů obecně. I když je jako běžný uživatel obvykle nemůžete přímo upravovat, jsou nezbytné pro automatické načítání modulů při detekci nového hardwaru.
Pokud je ve volání depmod zadáno a konkrétní verzi jádra, použije se adresář odpovídající dané verzi místo aktuální verze hlášené parametrem uname -rTo je užitečné při přípravě modulů pro jádro, které ještě neběží, například v prostředích cross-kompilace nebo chroot.
V pokročilejších scénářích se tato možnost používá také -F System.map poskytnout mapu symbolů jádra který byl vygenerován během kompilace. Díky tomu dokáže depmod rozlišovat mezi symboly řešenými samotným jádrem a symboly, které by měly být dodávány externími moduly, a proto s volbou vydává přesnější varování -e.
konfigurační adresář depmod.dy, nastavení priority
Kromě samotného příkazu má depmod flexibilní konfigurační systém založený na adresáři depmod.d a případných souborech depmod.conf . Tato konfigurace umožňuje změnit pořadí, ve kterém jsou moduly zpracovávány, a definovat, která verze modulu by měla mít prioritu, pokud je k dispozici více než jedna.
Podle dokumentace depmod čte konfigurace z těchto cest:
- /usr/lib/depmod.d/*.conf
- /etc/depmod.d/*.conf
- /run/depmod.d/*.conf
Soubory pod těmito cestami používají jednoduchý textový formát s jednou instrukcí na řádekPrázdné řádky jsou povoleny a řádky začínající na # Jsou považovány za komentáře. Pokud řádek končí na \Instrukce pokračuje na dalším řádku, což je užitečné pro lepší organizaci dlouhých konfigurací.
V těchto souborech lze použít dva hlavní typy příkazů: search y overrideOba slouží k řízení toho, které moduly jsou zpracovávány před a po a která verze by měla v případě konfliktu převážit.
Vyhledávací příkaz v depmod.d: pořadí zpracování modulů
Příkaz search v depmod.d se používá k definování V jakém pořadí jsou zpracovávány podadresáře /lib/modules? (nebo jiné nakonfigurované umístění modulu), když depmod analyzuje systém.
Obecná syntaxe je nějaká taková:
search subdirectorio1 subdirectorio2 ...
Adresáře jsou seřazeny od nejvyšší po nejnižší prioritu: První má nejvyšší prioritu a poslední má nejnižší prioritu.Kromě toho existuje speciální klíčové slovo, built-in, který odkazuje na standardní adresáře modulů instalovaných jádrem.
Ve výchozím nastavení přikládá příkaz depmod větší důležitost podadresáři s názvem updates ohledně integrovaných modulůinterně pomocí vyhledávacího řetězce "updates built-in"To vám umožní instalovat aktualizované verze modulů v updates, se používají s výhodou před těmi, které byly standardně dodány s jádrem.
S komplexnějšími konfiguracemi založenými na search běžné rozvržení lze nastavit v mnoha distribucích, kde Vlastní moduly nebo moduly třetích stran jsou umístěny do specifických cest takže mají přednost před těmi, které poskytuje jádro, aniž by se ho dotýkaly.
Příkaz Override v depmod.d: Výběr konkrétní verze modulu
Dalším důležitým příkazem v depmod.d je override, určený pro výběr verze modulu, která se má použít, pokud jich existuje několik se stejným názvemK tomu často dochází, když máte modul, který je součástí jádra, a navíc vlastní nebo experimentální verzi.
Obecná syntaxe je:
override modulename kernelversion modulesubdirectory
V této instrukci je parametr modulename Identifikujte modul, kterému chceme dát přednost, kernelversion Může se jednat o konkrétní verzi nebo zástupný znak * (aby se to aplikovalo na všechna jádra) a modulesubdirectory je podadresář uvnitř /lib/modules (nebo jiná cesta k modulu), kde se nachází „vítězná“ verze.
Typickým příkladem je něco jako:
override kmod * extra
Tento řádek zajišťuje, že pro jakoukoli verzi jádra, pokud se v podadresáři extra nachází modul s názvem kmod , má tato verze přednost před jinou verzí se stejným názvem, která je součástí jádra nebo se nachází v jiných standardních adresářích.
Tyto typy pravidel jsou obzvláště užitečné, když chcete testovat vlastní ovladače nebo zkušební verze bez nutnosti odstraňování původní verze systému, s možností návratu k předchozímu stavu pouhou úpravou nebo odebráním konfigurace override.
Vnitřní fungování a vztah s dalšími nástroji (modprobe, kmod, hotplug)
depmod nefunguje samostatně, ale je součástí ekosystému Nástroje pro správu modulů Linuxu (kmod)Jeho práce se přímo odráží v tom, jak příkazy jako modprobe nebo v tom, jak systém automaticky načítá moduly, když detekuje nový hardware.
Když běžíš modprobe nombre_moduloTento nástroj konzultuje obsah souboru modules.dep a dalších souborů generovaných příkazem depmod k určení, které moduly je třeba předem načíst, aby vyhověly závislostem. Pokud jsou tyto soubory zastaralé nebo poškozené, modprobe může selhat s nevyřešenými chybami symbolů nebo nenalezenými moduly.
Infrastruktura hotplug se také spoléhá na tyto závislosti. Když připojíte zařízení nebo jádro detekuje novou komponentu, systém udev a související nástroje se zeptají, který modul mají načíst , a odpověď do značné míry závisí na tabulkách vytvořených prací depmod.
Toto vše je navíc integrováno do projektu kmod, který poskytuje uživatelské nástroje pro správu modulů. Manuál k depmod.d uvádí, že tato část dokumentace je součástí projektu kmod a že jakékoli chyby nebo vylepšení lze hlásit na vyhrazené e-mailové konference pro Linuxové moduly.
Díky této integraci se depmod v mnoha případech spouští automaticky, například po instalaci nového jádra nebo při instalaci balíčků, které přidávají moduly . Jak jste však viděli, je stále velmi užitečné spustit ho ručně, když se vyskytnou problémy nebo změny mimo běžný cyklus balíčků.
Praktické příklady použití depmodu
Pro další objasnění teorie stojí za to podívat se na několik příkladů použití příkazu depmod v reálných situacích, od těch nejjednodušších až po ty, které zahrnují o něco pokročilejší prostředí.
Generování závislostí pro běžící jádro
Nejběžnějším případem je jednoduše vynutit aktualizaci aktuálních závislostí jádra pomocí:
sudo depmod
Protože se nepředává žádná verze, depmod vezme tu, která byla vrácena. uname -r a aktualizuje modules.dep a mapy pro dané jádro. Můžete to také použít explicitně:
sudo depmod -a
Volba -a Znamená to „zpracovat všechny moduly“ a toto chování používá příkaz depmod. pokud nejsou zadány žádné konkrétní názvy souborůV mnoha tutoriálech je tento příkaz často vnímán jako řešení problémů s moduly, které se nenačítají.
Generování závislostí pro konkrétní verzi jádra
Pokud máte nainstalováno více než jedno jádro nebo připravujete moduly pro jádro, které se ještě nenabootovalo , můžete příkazu depmod sdělit, kterou verzi má použít:
sudo depmod 5.4.0-81-generic
S tímto bude příkaz fungovat /lib/modules/5.4.0-81-generic a vygeneruje tam soubor modules.dep. a další mapy, aniž by se dotkl map jádra, které aktuálně běží.
Obnovte závislosti pro všechna nainstalovaná jádra
V systémech, kde koexistuje několik jader, například na serverech, které z bezpečnostních důvodů udržují starší verze, může být vhodné vynutit regeneraci závislostí pro všechny verze jediným příkazem:
sudo depmod -a
V této souvislosti depmod prochází různými verzemi pod /lib/modules a aktualizace modules.dep pro každý z nichzajištění konzistence všech modulů i po aktualizaci nebo provedení změn.
Používejte s pracovními adresáři a volbou –basedir
Při práci s vlastními jádry nebo prostředími pro sestavení je běžné, že moduly v dočasném adresáři jiné než /lib/modulesV takové situaci lze použít možnost -b o --basedir:
depmod -b /ruta/al/staging 5.4.0-81-generic
S tímto se depmod snaží /ruta/al/staging/lib/modules/5.4.0-81-generic jako jeho pracovní adresář, ale při generování Soubor modules.dep odstraní část basedir. cest. Soubor je tak připraven k pozdějšímu přesunutí do standardní cesty, aniž by bylo nutné jej znovu generovat.
Kontrola nevyřešených symbolů pomocí System.map
Ve vývojových prostředích nebo pro moduly pro hloubkové ladění může být použití příkazu depmod velmi užitečné pro detekovat nevyřešené symboly kombinování možností -F y -e:
depmod -F /boot/System.map-5.4.0-81-generic -e 5.4.0-81-generic
V tomto případě je soubor poskytnut. System.map generované při kompilaci jádra, což umožňuje depmod určit, které symboly by již měly být definovány v jádru. S možností -ePříkaz hlásí symboly, které modul potřebuje, ale které nejsou přítomny v jádře ani v žádném jiném modulu, což obvykle indikuje problém s kompilací, verzí nebo konfigurací.
Když jsou detekovány tyto „osiřelé“ symboly, je to jasná známka toho, že něco není v pořádku mezi jádrem, nainstalovanými moduly a hlavičkovými soubory použitými pro kompilaci . V takových situacích může kontrola souboru System.map a podrobného výstupu příkazu depmod ušetřit spoustu času.
Celkově se depmod stává základní součástí správy modulů v Linuxu: bez něj by systém ztratil celkový přehled o závislostech modulů a nástroje jako modprobe nebo samotná infrastruktura hotplug by nefungovaly správně. Pochopení toho, co dělá, jak jej konfigurovat pomocí depmod.d a kdy jej spustit ručně, vám dává značnou výhodu v rychlejší a spolehlivější diagnostice a řešení problémů s ovladači a moduly jádra.
Vášnivý spisovatel o světě bytů a technologií obecně. Rád sdílím své znalosti prostřednictvím psaní, a to je to, co budu dělat v tomto blogu, ukážu vám všechny nejzajímavější věci o gadgetech, softwaru, hardwaru, technologických trendech a dalších. Mým cílem je pomoci vám orientovat se v digitálním světě jednoduchým a zábavným způsobem.

