El maquinari és gestionat pels drivers. Els drivers són utilitzats pel kernel (kernel drivers) per comunicar-se amb els dispositius de maquinari. La majoria de drivers són mòduls del kernel.
Normalment s'emmagatzemen a:
/ lib/modules
i es programari que pot ser carregat o descarregat pel kernel per tal d'accedir al maquinari.
A Ubuntu i altres sistemes Debian, les comandes de gestió de mòduls del kernel les proporciona el paquet module-init-tools.Els fitxers instal·lats per aquest paquet són:
$ dpkg -L module-init-tools | more /. /bin /bin/lsmod /sbin /sbin/insmod /sbin/modprobe /sbin/rmmod /sbin/depmod /sbin/modinfo /sbin/update-modules /etc /etc/modprobe.d /etc/modprobe.d/arch /etc/modprobe.d/arch/x86_64 /etc/modprobe.d/blacklist-watchdog /etc/modprobe.d/blacklist-framebuffer /etc/modprobe.d/blacklist-amd76-edac /etc/modprobe.d/options /etc/modprobe.d/aliases /etc/modprobe.d/isapnp /etc/modprobe.d/blacklist-firewire /etc/modprobe.d/blacklist /etc/depmod.d /etc/depmod.d/ubuntu.conf /etc/init.d /etc/init.d/module-init-tools /lib /lib/modules /usr /usr/share /usr/share/doc /usr/share/doc/module-init-tools /usr/share/doc/module-init-tools/changelog.gz /usr/share/doc/module-init-tools/copyright /usr/share/doc/module-init-tools/changelog.Debian.gz /usr/share/man /usr/share/man/man5 /usr/share/man/man5/modprobe.conf.5.gz /usr/share/man/man5/modules.dep.5.gz /usr/share/man/man5/modules.5.gz /usr/share/man/man5/depmod.conf.5.gz /usr/share/man/fr /usr/share/man/fr/man5 /usr/share/man/fr/man5/modules.5.gz /usr/share/man/man8 /usr/share/man/man8/depmod.8.gz /usr/share/man/man8/insmod.8.gz /usr/share/man/man8/modinfo.8.gz /usr/share/man/man8/modprobe.8.gz /usr/share/man/man8/rmmod.8.gz /usr/share/man/man8/update-modules.8.gz /usr/share/man/man8/lsmod.8.gz /sbin/lsmod
Fitxers de configuració:
$ dpkg -L module-init-tools | grep etc /etc /etc/depmod.d /etc/depmod.d/ubuntu.conf /etc/modprobe.d /etc/modprobe.d/blacklist-ath_pci.conf /etc/modprobe.d/blacklist-firewire.conf /etc/modprobe.d/blacklist-framebuffer.conf /etc/modprobe.d/blacklist-watchdog.conf /etc/modprobe.d/blacklist.conf /etc/init.d /etc/init.d/module-init-tools
Comandes:
$ dpkg -L module-init-tools | grep bin /bin /bin/lsmod /sbin /sbin/insmod /sbin/rmmod /sbin/depmod /sbin/modprobe /sbin/modinfo /sbin/lsmod
Es poden consultar els mòduls actualment carregats amb la comanda lsmod:
$ lsmod Module Size Used by nls_iso8859_1 12032 0 nls_cp437 13696 0 vfat 18816 0 fat 58272 1 vfat usb_storage 99648 0 binfmt_misc 16776 1 i915 67844 2 drm 96424 3 i915 bridge 56212 0 stp 10500 1 bridge bnep 20224 2 vboxnetflt 92200 0 vboxdrv 121512 1 vboxnetflt ...
La primera columna és el nom del mòdul i la segona columna mostra la mida del mòdul. La tercera columna mostra quins mòduls utilitzant el mòdul. Per exemple el mòdul fat és utilitzat pel mòdul vfat. El número indica el nombre de mòduls o processos que utilitzin aquest mòdul. En el cas que un mòdul utilitzi un altre, el nom apareix al final de la línia.
La comanda lsmod el que fa es mostrar informació dels mòduls a partir del fitxer:
/proc/modules
És una comanda molt simple, que tal com podeu veure al seu manual:
$ man lsmod
la comanda no té paràmetres.
NOTA: lsmod només mostra només informació dels mòduls del kernel i no mostra per exemple el drivers que ha estat compilats directament al nucli del sistema operatiu. Per aquesta raó un mòdul pot ser s'ha de carregar en un sistema però en un altre no.
Linux permet carregar mòduls del kernel amb dos comandes diferents:
IMPORTANT: Normalment no caldrà carregar un mòdul manualment gràcies a que el kernel de Linux és capaç de carregar-los automàticament (module auto-loader feature). Aquesta característica ha d'estar activada al compilar el nucli de Linux (fet força habitual en kernels moderns).
Un exemple de com utilitzar insmod
$ sudo insmod /lib/modules/2.6.26/kernel/drivers/gpio/max7301.ko
Els mòduls del kernel solen tenir la extensió .ko.
NOTA: Cal indicar el camí complet al inserir un mòdul.
Modprobe funciona de forma similar:
$ sudo modprobe floppy
Com veieu s'indica el nom del mòdul en comptes del path complet. Amb insmod hagués estat:
$ sudo insmod /lib/modules/2.6.28-11-generic/kernel/drivers/block/floppy.ko
Tant al final de la comanda insmod com a la comanda modprobe es poden passar opcions del mòdul que estem carregant.
Modprobe utilitza per defecte el fitxer de configuració
/etc/modprobe.conf
o si no existeix els fitxers de la carpeta:
/etc/modprobe.d
Consulteu l'apartat Fitxer /etc/modprobe.conf o carpeta /etc/modprobe.d/.
Modprobe també es pot utilitzar per tal d'eliminar mòduls amb la opció -r:
$ sudo modprobe -r floppy
Podeu trobar un exemple d'ús a:
Vegeu també la comanda rmmod.
Podeu consultar el manual amb:
$ man modprobe
O online a:
Mostrar el mòduls disponibles
$ modprobe -l
Es poden utilitzar wildcards:
$ modprobe -l f* kernel/fs/fat/fat.ko kernel/fs/freevxfs/freevxfs.ko kernel/crypto/fcrypt.ko ...
Mostrar les dependències d'un mòdul:
Es poden mostrar amb la opció --show-depends
$ sudo modprobe --show-depends nfsd insmod /lib/modules/2.6.28-15-generic/kernel/fs/exportfs/exportfs.ko insmod /lib/modules/2.6.28-15-generic/kernel/net/sunrpc/sunrpc.ko insmod /lib/modules/2.6.28-15-generic/kernel/net/sunrpc/auth_gss/auth_rpcgss.ko insmod /lib/modules/2.6.28-15-generic/kernel/fs/nfs_common/nfs_acl.ko insmod /lib/modules/2.6.28-15-generic/kernel/fs/lockd/lockd.ko insmod /lib/modules/2.6.28-15-generic/kernel/fs/nfsd/nfsd.ko
Com podeu veure us mostra el path complet dels mòduls que cal carregar abans de nfsd (que apareix al final). Fixeu-vos que la versió del mòdul coincideix amb la versió del kernel que esteu utiltizant:
$ uname -r 2.6.28-15-generic
Forçar la càrrega d'un mòdul
Si intentem carregar un mòdul que no es correspon amb la nostra versió del kernel, modprobe donarà un error. Podeu forçar la càrrega amb la opció -f o --force. Aquesta opció pot ser potencialment perillosa però a vegades necessària amb mòduls de terceres parts.
Verbose
La opció -v mostra els detalls de la carrega del mòdul.
Indicar el fitxer de configuració
Modprobe utilitza per defecte el fitxer de configuració
/etc/modprobe.conf
o si no existeix els fitxers de la carpeta:
/etc/modprobe.d
Es poden canviar aquests fitxers per defecte amb la opció -C
Mostrar la configuració:
Es pot consultar la configuració de modprobe amb
$ sudo modprobe -c
Fer una prova sense canvis
Aquesta opció normalment es coneix en angles com --dry-run (execució seca)
$ sudo modprobe -n floppy
També es pot utilitzar --dry-run o --show i normalment es combina amb el paràmetre verbose.
Aquesta comanda elimina mòduls (de forma similar al que fa modprobe -r). Un exemple:
$ sudo rmmod floppy
En cas que el mòdul no estigui carregat us donarà el següent error (torneu a repetir la comanda anterior):
$ sudo rmmod floppy ERROR: Module floppy does not exist in /proc/modules
També disposa de les opcions verbose (-v) i force (-f). Normalment els mòduls es poden tenir carregats encara que no s'utilitzin, l'únic que fan es consumir memòria. Però pot ser que vulguem eliminar un mòdul per que no és compatible amb un altre mòdul.
La opció -w (wait) s'espera a que un mòdul no estigui en ús abans d'eliminar-lo. De forma similar a insmod, rmmod no eliminarà un mòdul del qual depenen altres mòduls que estan en funcionament.
Aquesta comanda mostra informació sobre un mòdul concret:
$ modinfo floppy filename: /lib/modules/2.6.28-15-generic/kernel/drivers/block/floppy.ko alias: block-major-2-* license: GPL author: Alain L. Knaff srcversion: 264AF399EBCDF87F4520A29 alias: acpi*:PNP0700:* alias: pnp:dPNP0700* depends: vermagic: 2.6.28-15-generic SMP mod_unload modversions 586 parm: floppy:charp parm: FLOPPY_IRQ:int parm: FLOPPY_DMA:int
La comanda, en sistemes Debian la proporciona el paquet module-init-tools tal i com podeu observar a:
$ which modinfo /sbin/modinfo $ dpkg -S /sbin/modinfo module-init-tools: /sbin/modinfo
Podeu consultar altres opcions al manual:
$ man modinfo
O online a:
Genera els fitxers map i modules.dep. Per exemple per a un kernel 2.6.22-14-generic:
Un exemple dels continguts del fitxer:
$ cat /lib/modules/2.6.22-14-generic/modules.dep | more /lib/modules/2.6.22-14-generic/kernel/fs/autofs/autofs.ko: /lib/modules/2.6.22-14-generic/kernel/fs/befs/befs.ko: /lib/modules/2.6.22-14-generic/kernel/fs/gfs2/locking/dlm/lock_dlm.ko: /lib/modules/2.6.22-14-generic/kernel/fs/gfs2/gfs2.ko /lib/modules/2.6.22 -14-generic/kernel/fs/dlm/dlm.ko /lib/modules/2.6.22-14-generic/kernel/fs/configfs/configfs.ko /lib/modules/2.6.22-14-generic/kernel/fs/gfs2/locking/nolock/lock_nolock.ko: /lib/modules/2.6.22-14-generic/kernel/fs/gfs2/gfs2.ko ...
Els mòduls es poden oferir serveis entre ells (símbols) establint així una relació de dependència. Depmod crea una llista de dependències entre mòduls llegint els mòduls de la carpeta /lib/modules/`uname -r` i determinant quins símbols necessita cada mòduls i quins símbols ofereix. També es generen diversos fitxers de mapa a la carpeta /lib/modules/`uname -r`.
Normalment la comanda depmod s'executa durant l'engegada del sistema (mitjançant el fitxer rc) però si es modifica manualment el fitxer modules.conf aleshores cal tornar a executar la comanda depmod.
Les opcions de la comanda són:
(TODO) depmod Options Option Function Search for all modules in all directories specified by the -a, --all modules.conf file. Compare file time stamps and run a depmod -a if anything has -A changed. Show all of the unresolved symbols for each module. -e, --errsyms Output the module dependency information to the console instead of -n, --show the modules.dep file. Output all error information to syslog instead of the console. -s, --syslog Enable verbose mode, which lists the name of each module as it is -v, --verbose loaded. Do not display missing symbol errors. -q, --quiet Show the depmod version information. -V, --version Override the default security precaution that keeps module utilities -r, --root from loading modules owned by nonroot users.
Podeu trobar un exemple d'ús a:
Podeu consultar altres opcions al manual:
$ man depmod
O online a:
Els mòduls es troben a la carpeta /lib/modules. De fet aquí teniu tots els moduls de tots els kernels que us heu instal·lat fins al moment.
Per accedir als mòduls del kernel actual podeu utilitzar uname a:
$ cd /lib/modules/`uname -r`
A la carpeta /lib/modules/2.6.28-15-generic/kernel/drivers els modules estan organitzats per carpetes:
The block directory contains all of the modules for block devices. These include such things as tape drives, floppy drives, and RAID devices.
The cdrom directory holds all modules for CD-ROMs. These are proprietary CD-ROM controllers, such as the old Creative Labs and Mitsumi interfaces. These are not for current CD-ROMs, which are EIDE/ATAPI or SCSI.
The fs directory holds the file system modules. Almost all of the Linux sup- ported file systems can be supported via modules. You should always compile in the file system that the root volume needs.
The ipv4 directory holds the IP networking modules. It also includes IP Masq modules to be used when performing network address translation. The ipv6 directory holds the modules needed to support the new IP v6 specification.
The net directory holds all network interface driver modules. It also contains drivers for network protocols, such as PPP or SLIP. If you install a new net- work card and need to find the module to load, you should check this directory. The scsi directory holds all SCSI device drivers. Modules to enable SCSI emu- lation with IDE devices, used with CD-R/W drives, are also stored here. 483 Chapter 13 ✦ Working with the Kernel
✦ The video directory holds the drivers for video capture devices. This is still
in early development, so there are not many drivers yet.
✦ The misc directory holds everything else. All sound card drivers are kept
here, as are game devices such as joysticks. Peripheral interface drivers for things such as serial ports, parallel ports, and USB are stored here.
Aquest fitxer conté una llista dels mòduls que volem que s'executin durant l'arrancada del sistema.
$ cat /etc/modules # /etc/modules: kernel modules to load at boot time. # # This file contains the names of kernel modules that should be loaded # at boot time, one per line. Lines beginning with "#" are ignored. lp
L'script (en sistemes System V, tipus Debian) és /etc/init.d/module-init-tools.
Podeu consultar el manual amb:
$ man modules
Antic fitxer de configuració de mòduls en kernels 2.4 o anteriors. Vegeu el següent apartat. En algunes distribucions el fitxer és /etc/conf.modules.
El fitxer principal de configuració de modprobe és
/etc/modprobe.conf
O si no existeix els fitxers de la carpeta:
/etc/modprobe.d/
La sintaxi és una simplificació del fitxer /etc/modules.conf, utilitzat en versions 2.4 del kernel o anteriors. Segons el manual, cada línia del fitxer o fitxers pot ser una de les següents opcions:
alias wildcard modulename: permet assignar un nom alternatiu a un mòdul options modulename option : permet afegir opcions a un mòdul. install modulename command: executa l'ordre command en compte de inserir el mòdul
Podeu consultar el manual:
$ man modprobe.conf
O online a:
Són els fitxers de configuració de la comanda depmod.
/lib/modules/{kernel-version}/modules.dep.
Per exemple:
$ cat /lib/modules/2.6.28-15-generic/modules.dep
Fitxer que carrega els mòduls especificats al fitxer /etc/modules.
Cal consultar la configuració del kernel que teniu actualment instal·lat:
/boot/config-`uname -r`
Per exemple per conprovar el suport per a autofs:
$ grep AUTOFS /boot/config-`uname -r` CONFIG_AUTOFS_FS=m CONFIG_AUTOFS4_FS=m