- depmod analyseert de kernelmodules en genereert modules.dep met hun afhankelijkheden, zodat het systeem elke module in de juiste volgorde laadt.
- Opties zoals -a, -A, -b, -F of -e stellen u in staat de reikwijdte van de analyse aan te passen, stagingdirectory's te gebruiken en onopgeloste symbolen te detecteren.
- De configuratie in depmod.d, met behulp van de commando's search en override, bepaalt de prioriteit van mappen en moduleversies.
- Het handmatig uitvoeren van depmod is essentieel voor het oplossen van fouten bij het laden van modules, met name na het bijwerken of hercompileren van de kernel.

Als je met Linux werkt en de kernel aanpast, kom je vroeg of laat `depmod` en het `modules.dep`-bestand tegen . Je hebt het misschien gezien bij het bijwerken van het systeem , het installeren van externe stuurprogramma's, of, zoals veel mensen overkomt, wanneer een programma zoals VirtualBox stopt met het laden van modules en de klassieke foutmelding "module niet gevonden" verschijnt.
In dit artikel gaan we dieper in op wat het `depmod`-commando precies doet in Linux, hoe het intern werkt , de rol van de `depmod.d`-configuratiebestanden en hoe je het in je dagelijkse werk kunt gebruiken om problemen met kernelmodules te voorkomen. Alles wordt uitgelegd in standaard Spaans (uit Spanje), met duidelijke voorbeelden en zonder dat je iets hoeft te veronderstellen behalve dat je weet hoe je een terminal opent.
Wat is depmod en waarvoor wordt het gebruikt in Linux?
Het commando depmod is een gebruikersruimtetool. Dit proces analyseert alle modules van een bepaalde kernel en identificeert welke symbolen ze exporteren en welke ze vereisen. Op basis van deze analyse genereert het een afhankelijkheidsbestand, meestal genaamd . modules.dep, die het systeem gebruikt om te weten welke modules vóór andere geladen moeten worden.
In Linux kunnen kernelmodules diensten aan andere modules aanbieden via symbolen, die in de code zijn gemarkeerd met macro's als EXPORT_SYMBOLWanneer een tweede module een van deze symbolen gebruikt, wordt deze afhankelijk van de eerste. In installaties met veel laadbare modules kan dit afhankelijkheidsnetwerk behoorlijk complex worden als het niet goed beheerd wordt.
De missie van Depmod is eenvoudig te omschrijven, maar uiterst belangrijk: Doorloop de modulestructuur in /lib/modules/Het analyseert welke symbolen elke module exporteert en welke symbolen deze vereist, en stelt op basis daarvan de afhankelijkheidslijst samen. Op deze manier kan een ander hulpmiddel zoals modprobe Als je een specifieke module wilt laden, weet je van tevoren welke andere modules eerst geladen moeten worden.
Naast modules.dep genereert depmod ook verschillende "map"-bestanden in dezelfde map. Deze worden gebruikt door de hotplug-infrastructuur en kmod-tools om het dynamisch laden van modules te beheren (bijvoorbeeld wanneer je een USB-apparaat aansluit en het systeem bepaalt welke driver moet worden geladen ).
Basissyntaxis van het depmod-commando
De eenvoudigste manier om de tool te gebruiken is door deze zonder opties aan te roepen, waardoor het het modules.dep-bestand voor de draaiende kernel genereert . De algemene syntaxis is volgens de manpagina als volgt:
depmod
Het kan ook worden aangeroepen door specifieke modules als argumenten op te geven, in welk geval `depmod` alleen die modules onderzoekt . Dit gebruik is minder gebruikelijk, omdat het meestal wenselijk is om de afhankelijkheden van de gehele modulestructuur up-to-date te houden, en niet slechts die van een enkele module.
Formeel gezien ziet de handleiding er ongeveer zo uit:
depmod
depmod
In deze varianten is de versie verwijst naar de kernelversie (bijvoorbeeld 5.4.0-81-generic) waarvan de moduledirectory geanalyseerd moet worden. Als er niets is opgegeven, gebruikt depmod de versie die wordt geretourneerd door uname -r, oftewel de kernel die op dat moment draait.
Belangrijkste parameters en opties van depmod
Het commando heeft verschillende opties waarmee je het gedrag ervan kunt aanpassen. Veel van deze opties zijn essentieel bij het werken met buildomgevingen, aangepaste kernels of staging-gebieden . De meest gebruikte opties worden hieronder samengevat:
| Optie / Parameter | Beschrijving |
|---|---|
kernel_version |
Optionele parameter die aangeeft kernelversie waarvoor afhankelijkheden worden gegenereerdIndien dit wordt weggelaten, wordt de actieve kernel gebruikt. |
-a, --all |
Hierdoor genereert depmod afhankelijkheidsinformatie. voor alle geïnstalleerde kernelversiesAls er geen bestandsnamen worden doorgegeven via de commandoregel, is deze modus standaard ingeschakeld. |
-A, --quick |
Snelle modus: depmod Controleer of er modules zijn die nieuwer zijn dan modules.dep. En als er geen zijn, wordt het programma afgesloten zonder iets opnieuw te genereren. Dit bespaart tijd op systemen met veel modules. |
-b <basedir>, --basedir <basedir> |
Hiermee kunt u een specificatie geven alternatieve basisdirectory waar de modules zich bevindenDit is erg handig als je in een staging-directory werkt, in tegenstelling tot /lib/modules/<versión>. De basedir Het wordt verwijderd uit de paden die zijn geschreven in modules.depwaardoor het bestand klaar is om naar de uiteindelijke locatie te worden verplaatst. |
-C <archivo o directorio>, --config |
Met deze optie kunt u vervang het standaard configuratiebestand (meestal /etc/depmod.conf of de map /etc/depmod.d/ (als de eerste niet bestaat). |
-e, --errsyms |
Cuando se combina con -F, maakt depmod Rapport van de symbolen die een module nodig heeft, maar die niet worden meegeleverd. noch door andere modules, noch door de kernel zelf. |
-F <System.map>, --filesyms |
Hiermee kunt u het bestand specificeren. System.map gegenereerd tijdens het compileren van de kernelzodat depmod weet welke symbolen al binnen de kernel zelf zijn opgelost en de ontbrekende symbolen correct kan rapporteren. |
-h, --help |
Geeft een kort helpbericht weer over het gebruik van de opdracht. De executie is voltooid.. |
-n, --dry-run |
Het voert alle berekeningen uit, maar Schrijf de uitvoer naar de console. (stdout) in plaats van de bestanden in de modulesmap te genereren. Erg handig om te controleren wat depmod zou doen zonder iets te wijzigen. |
-v, --verbose |
Gedetailleerde modus: depmod wordt op het scherm weergegeven. alle symbolen waarvan elke module afhankelijk is en de naam van de module die ze levert. |
-V, --version |
Toont de depmod programmaversie En het werkt. Bij zeer oude kernels kunnen er aanvullende aandachtspunten zijn, zoals de documentatie zelf al aangeeft. |
Naast de opties is het belangrijk om te onthouden dat als je modulebestandsnamen als argumenten doorgeeft, depmod alleen deze bestanden zal onderzoeken in plaats van de volledige inhoud van de moduledirectory die overeenkomt met de geselecteerde kernelversie te verwerken.
Praktisch voorbeeld: hoe depmod problemen met modules kan oplossen (voorbeeld met VirtualBox)
Een zeer representatief voorbeeld van het nut van depmod is het geval van VirtualBox werkt niet meer omdat er kernelmodules "ontbreken".Stel je een realistische situatie voor: na een kernelupdate of hercompilatie, wanneer je probeert een systeem op te starten... virtual machineVirtualBox geeft een waarschuwing dat de module niet geladen kan worden. vboxdrv of andere bijbehorende modules.
In een dergelijk geval is het gebruikelijk om foutmeldingen tegen te komen die verband houden met System.map en met de afwezigheid van bepaalde modules in de verwachte paden. Het kan bijvoorbeeld voorkomen dat het bestand System.map bevindt zich niet op de locatie waar depmod of systeemtools het verwachten (bijvoorbeeld in /usr/src/linux), hoewel het wel bestaat in /boot.
Een oplossing die veelvuldig wordt besproken op technische fora (zoals een Arch-forum of een Gentoo-omgeving) houdt meestal in dat er een eenvoudige opdracht wordt uitgevoerd. sudo depmod -a om regeneratie af te dwingen uit het bestand modules.dep van de kernelversie die u gebruikt. Probeer daarna de module handmatig te laden met modprobe vboxdrv En als alles in orde is, verdwijnt de foutmelding.
Wat dat commando feitelijk doet, is alle modules die beschikbaar zijn voor die kernel opnieuw doorlopen. De kaart van geëxporteerde en vereiste symbolen opnieuw berekenen. en de afhankelijkheids- en kaartbestanden bijwerken die door andere tools worden gebruikt, waaronder modprobe. Als er inconsistenties waren tussen de aanwezige modules en wat er werd weergegeven in modules.depworden gecorrigeerd.
In de praktijk betekent dit dat als je modules hebt geïnstalleerd, opnieuw gecompileerd of verplaatst (zoals modules van VirtualBox) zonder de afhankelijkheden opnieuw te genereren, depmod "de zaken op orde brengt" zodat het systeem weer weet wie van wie afhankelijk is en wat vóór wat geladen moet worden.
Hoe depmod modules.dep en andere mapbestanden genereert
Om het iets gedetailleerder uit te leggen: depmod werkt door alle modules te analyseren die zich onder bevinden. /lib/modules/<versión> of de map die is geconfigureerdVoor elke module wordt gecontroleerd welke symbolen deze exporteert (d.w.z. welke functies of variabelen deze aan andere modules aanbiedt) en welke symbolen deze nodig heeft om te functioneren.
Met deze informatie bouwt depmod een lijst met afhankelijkheden in het modules.dep-bestandbevinden zich in dezelfde modulesmap. Elke regel van het bestand geeft een module aan en de modules waarvan deze afhankelijk is, wat dient als basis voor tools zoals modprobe bij het laden van modules in de juiste volgorde.
De tool genereert ook andere kaartbestanden voor de hotplug-infrastructuur en het modulebeheersysteem in het algemeen. Hoewel u als gewone gebruiker deze bestanden doorgaans niet direct bewerkt, zijn ze essentieel voor het automatisch laden van modules wanneer nieuwe hardware wordt gedetecteerd.
Als a is gespecificeerd in de depmod-aanroep specifieke kernelversieDe map die overeenkomt met die versie wordt gebruikt in plaats van de huidige versie die wordt gerapporteerd door uname -rDit is handig bij het voorbereiden van modules voor een kernel die je nog niet draait, bijvoorbeeld in cross-compilatie- of chroot-omgevingen.
In meer geavanceerde scenario's wordt deze optie ook gebruikt. -F System.map om de kernel-symboolkaart te leveren die tijdens de compilatie is gegenereerd. Dankzij dit kan depmod onderscheid maken tussen symbolen die door de kernel zelf worden opgelost en symbolen die door externe modules moeten worden aangeleverd, en zo nauwkeurigere waarschuwingen geven met de optie -e.
depmod.dy configuratiemap, prioriteitsinstelling
Naast het commando zelf beschikt depmod over een flexibel configuratiesysteem gebaseerd op de map depmod.d en eventuele depmod.conf-bestanden . Met deze configuratie kunt u de volgorde wijzigen waarin modules worden verwerkt en bepalen welke versie van een module prioriteit moet krijgen wanneer er meerdere beschikbaar zijn.
Volgens de documentatie leest depmod de configuraties uit de volgende paden:
- /usr/lib/depmod.d/*.conf
- /etc/depmod.d/*.conf
- /run/depmod.d/*.conf
De bestanden onder deze paden gebruiken een eenvoudige tekstindeling, met één instructie per regelBlanco regels zijn toegestaan, en regels die beginnen met # Ze worden behandeld als opmerkingen. Als een regel eindigt met \De instructie loopt door op de volgende regel, wat handig is om lange configuraties overzichtelijker te houden.
Binnen deze bestanden kunnen twee hoofdtypen commando's worden gebruikt: search y overrideBeide dienen om te bepalen welke modules vóór of na elkaar worden verwerkt, en welke versie voorrang moet krijgen in geval van een conflict.
Zoekopdracht in depmod.d: verwerkingsvolgorde van modules
Het commando search Binnen depmod.d wordt het gebruikt om te definiëren In welke volgorde worden de subdirectories van /lib/modules verwerkt? (of een andere geconfigureerde modulelocatie) wanneer depmod het systeem analyseert.
De algemene syntaxis ziet er ongeveer zo uit:
search subdirectorio1 subdirectorio2 ...
De mappen worden weergegeven van hoogste naar laagste prioriteit: De eerste heeft de hoogste prioriteit en de laatste de laagste.Daarnaast is er een speciaal trefwoord, built-inDit verwijst naar de standaard moduledirectory's die door de kernel zijn geïnstalleerd.
Standaard geeft depmod meer prioriteit aan een subdirectory genaamd updates met betrekking tot de geïntegreerde modulesintern gebruikmakend van de zoekreeks "updates built-in"Hiermee kunt u bijgewerkte versies van modules installeren in updates, worden bij voorkeur gebruikt in plaats van de standaardversies die met de kernel zijn meegeleverd.
Met complexere configuraties gebaseerd op search Gemeenschappelijke lay-outs kunnen in veel distributies worden ingesteld, waar Aangepaste modules of modules van derden worden op specifieke locaties geplaatst. zodat ze voorrang hebben boven de door de kernel geleverde gegevens, zonder de kernel zelf aan te raken.
Override-opdracht in depmod.d: Een specifieke versie van een module selecteren
De andere belangrijke opdracht in depmod.d is override, dacht aan kiezen welke versie van een module te gebruiken wanneer er meerdere versies met dezelfde naam bestaanDit gebeurt vaak wanneer je de module hebt die standaard bij de kernel wordt geleverd, en daarnaast ook een aangepaste of experimentele versie.
De algemene syntaxis is:
override modulename kernelversion modulesubdirectory
In deze instructie is de parameter modulename Identificeer de module waaraan we prioriteit willen geven. kernelversion Het kan een specifieke versie zijn of het jokerteken *. (om het op alle kernels toe te passen), en modulesubdirectory is de subdirectory binnen /lib/modules (of een ander modulepad) waar de "winnende" versie zich bevindt.
Een typisch voorbeeld is zoiets als:
override kmod * extra
Deze regel zorgt ervoor dat, voor elke kernelversie, als er een module met de naam kmod in de extra subdirectory aanwezig is , die versie voorrang krijgt boven een andere versie met dezelfde naam die bij de kernel wordt geleverd of zich in andere standaarddirectory's bevindt.
Dit soort regels is vooral handig als je iets wilt testen. aangepaste stuurprogramma's of proefversies zonder de oorspronkelijke versie van het systeem te verwijderen, waardoor de mogelijkheid behouden blijft om terug te keren naar de oorspronkelijke versie door simpelweg de configuratie aan te passen of te verwijderen. override.
Interne werking en relatie met andere tools (modprobe, kmod, hotplug)
depmod werkt niet op zichzelf, maar maakt deel uit van het ecosysteem van Linux-modulebeheertools (kmod)Zijn werk wordt direct weerspiegeld in de manier waarop commando's worden uitgevoerd, zoals modprobe of hoe het systeem automatisch modules laadt wanneer het nieuwe hardware detecteert.
Als je rent modprobe nombre_moduloDeze tool raadpleegt de inhoud van modules.dep en andere bestanden die door depmod worden gegenereerd Om te bepalen welke modules vooraf geladen moeten worden om aan de afhankelijkheden te voldoen. Als die bestanden verouderd of beschadigd zijn, kan modprobe vastlopen met fouten over onopgeloste symbolen of niet-gevonden modules.
De hotplug-infrastructuur is ook afhankelijk van deze afhankelijkheden. Wanneer je een apparaat aansluit of de kernel een nieuwe component detecteert, vragen het udev-systeem en de bijbehorende tools welke module geladen moet worden . Het antwoord hangt grotendeels af van de tabellen die zijn opgebouwd door depmod.
Bovendien is dit alles geïntegreerd in het kmod-project, dat de gebruikersruimtetools levert voor het beheren van modules. De handleiding van depmod.d geeft aan dat dit deel van de documentatie onderdeel is van het kmod-project en dat eventuele bugs of verbeteringen kunnen worden gemeld via de daarvoor bestemde mailinglijsten voor Linux-modules.
Dankzij deze integratie wordt depmod in veel gevallen automatisch uitgevoerd, bijvoorbeeld na het installeren van een nieuwe kernel of bij het installeren van pakketten die modules toevoegen . Zoals je echter hebt gezien, is het nog steeds erg handig om het handmatig uit te voeren wanneer er problemen of wijzigingen zijn die buiten de normale pakketcyclus vallen.
Praktische voorbeelden van het gebruik van depmod
Om de theorie verder te verduidelijken, is het de moeite waard om naar enkele voorbeelden te kijken van hoe depmod in de praktijk wordt gebruikt, van de eenvoudigste tot die in iets complexere omgevingen.
Genereer afhankelijkheden voor de draaiende kernel.
De meest voorkomende methode is om de huidige kernelafhankelijkheden geforceerd bij te werken met:
sudo depmod
Aangezien er geen versie wordt doorgegeven, gebruikt depmod de geretourneerde versie. uname -r en werkt modules.dep en de maps bij. voor die kernel. Je kunt het ook expliciet gebruiken:
sudo depmod -a
De keuze -a Het geeft aan "verwerk alle modules", en dit is het gedrag dat depmod aanneemt. wanneer er geen specifieke bestandsnamen zijn opgegevenIn veel handleidingen wordt dit commando vaak gezien als een oplossing voor problemen met modules die niet laden.
Genereer afhankelijkheden voor een specifieke kernelversie.
Als je meer dan één kernel hebt geïnstalleerd, of modules voorbereidt voor een kernel die nog niet is opgestart , kun je depmod laten weten welke versie je wilt gebruiken:
sudo depmod 5.4.0-81-generic
Hiermee werkt het commando op /lib/modules/5.4.0-81-generic en zal daar het bestand modules.dep genereren. en andere kaarten, zonder de kaarten van de kernel die op dat moment draait aan te raken.
Genereer de afhankelijkheden opnieuw voor alle geïnstalleerde kernels.
In systemen waar meerdere kernels naast elkaar bestaan, zoals servers die om veiligheidsredenen oudere versies bewaren, kan het handig zijn om met één commando de afhankelijkheden voor alle versies opnieuw te genereren :
sudo depmod -a
In deze context doorloopt depmod de verschillende versies onder /lib/modules en updates modules.dep voor elk van henervoor zorgen dat alles consistent blijft na het bijwerken van modules of het aanbrengen van wijzigingen.
Gebruik dit in combinatie met staging-directory's en de optie –basedir.
Bij het werken met aangepaste kernels of buildomgevingen is het gebruikelijk om de volgende functionaliteit te hebben: modules in een tijdelijke map anders dan /lib/modulesIn die situatie kan de optie worden gebruikt. -b o --basedir:
depmod -b /ruta/al/staging 5.4.0-81-generic
Hiermee probeert depmod /ruta/al/staging/lib/modules/5.4.0-81-generic net als de werkmap, maar bij het genereren modules.dep verwijdert het basedir-gedeelte van de paden. Het bestand is dus klaar om later naar het standaardpad te worden verplaatst zonder dat het opnieuw hoeft te worden gegenereerd.
Controleren op onopgeloste symbolen met System.map
In ontwikkelomgevingen of voor het grondig debuggen van modules kan het gebruik van depmod erg nuttig zijn. onopgeloste symbolen detecteren de opties combineren -F y -e:
depmod -F /boot/System.map-5.4.0-81-generic -e 5.4.0-81-generic
In dit geval wordt het bestand verstrekt. System.map gegenereerd tijdens het compileren van de kernel, waardoor depmod mogelijk is Identificeer welke symbolen al in de kern gedefinieerd zouden moeten zijn.. Met optie -eHet commando geeft een overzicht van symbolen die een module nodig heeft, maar die niet aanwezig zijn in de kernel of een andere module. Dit duidt meestal op een compilatie-, versie- of configuratieprobleem.
Wanneer deze "wees"-symbolen worden gedetecteerd, is dat een duidelijke indicatie dat er iets mis is tussen de kernel, de geïnstalleerde modules en de headers die voor de compilatie worden gebruikt . In dergelijke situaties kan het controleren van System.map en de gedetailleerde uitvoer van depmod veel tijd besparen.
Over het algemeen is depmod een fundamenteel onderdeel van modulebeheer in Linux: zonder depmod zou het systeem het overzicht van moduleafhankelijkheden verliezen en zouden tools zoals modprobe of de hotplug-infrastructuur zelf niet correct functioneren. Inzicht in de werking ervan, hoe je het configureert met depmod.d en wanneer je het handmatig moet uitvoeren, geeft je een aanzienlijk voordeel bij het sneller en betrouwbaarder diagnosticeren en oplossen van problemen met stuurprogramma's en kernelmodules.
Gepassioneerd schrijver over de wereld van bytes en technologie in het algemeen. Ik deel mijn kennis graag door te schrijven, en dat is wat ik in deze blog ga doen: je de meest interessante dingen laten zien over gadgets, software, hardware, technologische trends en meer. Mijn doel is om u te helpen op een eenvoudige en onderhoudende manier door de digitale wereld te navigeren.
