ABSTRACT: umgang mit linux kernelmodulen wird erklaert. AUDIENCE: junior admin SYSTEM: linux SECTION: basic unix commands AUTHOR: mond COPYRIGHT: GNU Free Documentation Licence http://www.gnu.org/licenses/fdl.txt die kernel die mit einer modernen linux distribution mitgeliefert werden beinhalten die meisten sachen die man so braucht schon als modul. meist will man aber einen kernel der speziell fuer den eigenen rechner optimiert ist oder man muss den kernel upgraden weil es mit aelteren sicherheitsprobleme gibt etc.. was genau ist der kernel? der kenerl ist das herz jedes betriebsystems. es kuemmert sich um die vergabe aller resourcen (rechenzeit, speicher, netzwerkkarten, .. ) und stellt den user-space programmen eine abstrakte schnittstelle zur hardware zur verfuegung... (z.b. dass man seine daten in files speichern kann und nicht "haendisch" auf sektoren auf der harddisk zugreifen muss.. dass man daten einfach so nach /dev/audio schreiben kann und sie werden abgespielt was auch immer fuer eine tatsaechliche soundkarte dahinter steckt, etc..) viele funktionen die der kernel bieten kann koennen als "modul" uebersetzt werden. d.h. sie kennen bei bedarf geladen werden. die module werden uebliecherweise unter /lib/modules/2.x.x/ abgelegt (wobei 2.x.x ) durch die versionsnummer des aktuellen kernels zu ersetzten ist. d.h. wenn man irgend ein stueck exotischer hardware zum laufen bringen will muss man eventuell einen neuen kernel compilieren.. uname -a zeigt die aktuelle version des kernels der gerade laeuft. (funktioniert auch auf anderen unixen und ist so praktisch wenn man herausfinden will auf welchem system man gerade arbeitet..) mit dem befehl: insmod /lib/modules/2.x.x/bla/irgendeinmodul.o kann man dem kernel sagen dass es ein kernelmodul hinzufuegen soll (das muss natuerlich schon vorhanden sein..) praktischer als insmod ist jedoch "modprobe". modeprobe hat eine kleine datenbank die sagt wo welches modul liegt und welches modul welches andere voraussetzt und laed gleich alle module wenn man nur den namen angibt: modprobe irgendeinmodul manche module akzeptieren auch parameter. z.b. interrupt oder portaddressen bei aelteren ISA karten oder aehnliches. (ob und welche parameter ein modul akzeptiert kann man mit "modinfo -p" herausfinden. achtung: modinfo braucht wie insmod den genauen pfad auf das modul) (die datenbank wird mit dem befehl depmod -a aktualisiert) mit hilfe von lsmod kann man sich anzeigen lassen welche kernel module gerade im moment geladen sind. die ausgabe von lsmod koennte z.b. so aussehen: Module Size Used by via82cxxx_audio 16816 0 ac97_codec 9488 0 [via82cxxx_audio] 3c59x 24736 1 8139too 13216 1 das heisst wir haben eine via82cxxx_audio sound karte die zusaetzlich noch das modul ac97_codec benoetigt. weiters die module 3c59x und 8139too (zwei netzwerkarten) rmmod irgendeinmodul wuerde das modul wieder entfernen (falls es nicht noch von andeeren gerade geladenen modulen gebraucht wird) jede distribution hat auch ein file wo man konfigurieren kann welche module beim starten geladen werden sollen. zum teil koenenn module auch automatisch bei bedarf (d.h. bei zugirff auf ein geraet) geladen werden. (im debian z.b. /etc/modules ) falls die gewuenschte funktion nicht als kernel modul zur verfuegung steht muss man einen kernel selbst compilieren. wie man das macht lernen wir demnaechst. jetzt noch ein beispielt: angenommen wir bauen eine neztwerkkarte mit einem RTL8139 chip ein (sind meist die biligsten karten). damit wir die verwenden koennen schauen wir uns unterhalb von /lib/modules/2.x.x/ um ob wir ein modul mit passenden namen finden. falls wir z.b. "8139too" finden dann koennte das passen. wir versuchen das modul zu laden: modprobe 8139too falls das modprob ohne fehlermeldung ausgefuehrt wird war es erfolgereich. hatten wir bis jetzt eine neztwerkarte die eth0 geheissen hat dann gibt es mit dem insmod jetzt hoffentlich eine zweite namens eth1 und wir koennen diese mit ifconfig configurieren. dmesg wuerde uns zuaetzlich noch die lezten kernel meldungen zeigen. EXERCISES: * schau dir an welche module gerade auf deinem system geladen sind. * schau dir an welche module bei dir im /lib/modules/... vorhanden sind. * versuche ein modul mit insmod zu laden. schau dir mit modinfo an ob das modul parameter akzeptieren wuerde. * entferne das modul wieder. REFERENCES: man modprobe man depmod man modules man modules.conf man insmod man modinfo /usr/src/linux/Documentation/modules.txt