En el siguiente artículo veremos la totalidad de puntos necesarios para gestionar de forma adecuada los módulos del kernel de Linux. A continuación empezamos con la explicación.
¿QUÉ SON Y QUE FUNCIÓN TIENEN LOS MÓDULOS DEL KERNEL?
El kernel de Linux es modular porque permite insertar y eliminar código bajo demanda con el fin de añadir o quitar una funcionalidad.
Partiendo de esta base decimos que los módulos del kernel son fragmentos de código, abierto o cerrado, que nosotros podemos añadir o quitar del Kernel con el fin de añadir o quitar una funcionalidad.
Algunas de las funcionalidades que podemos añadir al núcleo mediante los módulos del kernel son las siguientes:
- Usar los drivers privativos de nuestra tarjeta gráfica.
- Registrar las temperaturas de componentes de nuestro ordenador.
- Que los ventiladores de nuestro ordenador sean gestionados por el software creado por el fabricante de nuestro ordenador.
- Hacer funcionar nuestro tarjeta de red wifi.
- etc.
Nota: Básicamente los módulos del kernel nos permiten hacer funcionar nuestro hardware, o en el caso que ya funcione podemos hacer que lo haga de forma más eficiente.
¿QUÉ MÓDULOS DEL KERNEL TENEMOS DISPONIBLES?
Los módulos del kernel son archivos terminados con la extensión .ko que se almacenan en la ubicación /lib/modules/versión_del_kernel.
Por lo tanto ejecutando el siguiente comando en la terminal podemos averiguar la totalidad de módulos que tenemos disponibles.
ls -R /lib/modules/$(uname -r)
Nota: el parámetro uname -r permite consultar los módulos de kernel para el kernel que estamos usando.
SABER LOS MÓDULOS DEL KERNEL QUE ESTAMOS USANDO
Para obtener una lista de la totalidad de módulos del kernel que estamos usando tenemos que ejecutar el siguiente comando en la terminal:
lsmod
Este comando nos mostrará la siguiente información:
Campo | Información mostrada |
Module | Los nombres de los módulos que están activos. |
Size | El tamaño que ocupa cada uno de los módulos cargados en la memoria. |
Used | Indica si un módulo está siendo usado por otros módulo. |
Otro comando alternativo que mostrará la misma información es el siguiente:
cat /proc/modules
CONOCER EL MÓDULO O DRIVER QUE ESTÁ USANDO UN DETERMINADO HARDWARE
En ocasiones nos puede interesar conocer el nombre del módulo que está usando un hardware determinado.
Si el hardware está integrado en nuestro ordenador
Si queremos conocer el nombre módulo que está usando mi tarjeta gráfica abro una terminal y ejecuto el siguiente comando:
lspci -v
Si analizamos los resultados obtenidos veremos lo siguiente:
02:00.0 VGA compatible controller: NVIDIA Corporation GT218 [GeForce 8400 GS Rev. 3] (rev a2) (prog-if 00 [VGA controller]) Subsystem: Device 196e:080b Flags: bus master, fast devsel, latency 0, IRQ 26 Memory at fd000000 (32-bit, non-prefetchable) [size=16M] Memory at d0000000 (64-bit, prefetchable) [size=256M] Memory at ce000000 (64-bit, prefetchable) [size=32M] I/O ports at ec00 [size=128] [virtual] Expansion ROM at 000c0000 [disabled] [size=128K] Capabilities: <access denied> Kernel driver in use: nvidia Kernel modules: nvidia
Si observamos el campo Kernel driver in use de nuestra tarjeta gráfica vemos que estamos usando el módulo nvidia. De esta forma puedo afirmar que estoy usando el driver privativo de nvidia.
Una vez conocemos el nombre del módulo podemos ver si está activado ejecutando el siguiente comando en la terminal:
joan@debian:~$ lsmod | grep nvidia nvidia 10563584 44 drm 360448 4 nvidia
Por o tanto está activado y funcionando juntamente con las dependencias de este módulo.
Si el hardware usado está conectado vía usb
Si queremos conocer el módulo que utiliza un dispositivo de hardware conectado vía usb, como por ejemplo el teclado del ordenador, abrimos una terminal y ejecutamos el comando:
usb-devices
Si analizamos los resultado obtenidos vemos lo siguiente:
T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=1.5 MxCh= 0 D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 P: Vendor=046d ProdID=c31c Rev=64.00 S: Manufacturer=Logitech S: Product=USB Keyboard C: #Ifs= 2 Cfg#= 1 Atr=a0 MxPwr=90mA I: If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=01 Driver=usbhid I: If#= 1 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=usbhid
Por lo tanto puedo concluir mi teclado está usando el módulo del kernel usbhid.
Nota: El comando usb-devices forma parte del paquete usbutils. Por lo tanto para poder utilizar el comando usb-devices hay que tener instalado el paquete usbutils.
OBTENER INFORMACIÓN DE LOS MÓDULOS DEL KERNEL
Si queremos obtener información de uno de los módulos del kernel tan solo tenemos que ejecutar el comando modinfo seguido del nombre del módulo o de la ruta del módulo.
Por lo tanto si queremos obtener información acerca del módulo de nvidia ejecutamos el siguiente comando en la terminal:
sudo modinfo /lib/modules/4.8.0-2-amd64/updates/dkms/nvidia-legacy-340xx.ko
Después de ejecutar el módulo obtendremos gran cantidad de información. Parte de la información que obtendremos es la siguiente:
Campo | Información mostrada |
filename | La ruta donde se almacena el módulo. |
alias | El tipo de licencia del módulo. |
licence | El alias que recibe el módulo que en mi caso es char-major-195-* |
version | La versión del driver de Nvidia. |
description | Una descripción de la funcionalidad del módulo. |
depends | Las dependencias que tiene el módulo nvidia. |
intree | Si el resultado es y entonces el driver que analizamos forma parte del propio kernel y no es un módulo del kernel. |
author | Nombre del autor del driver. |
parm | Se indican opciones de configuración que podemos aplicar a los módulos mientras se cargan. |
etc | etc. |
Para obtener más información de las posibilidades de modinfo abran una terminal y ejecuten el comando:
man modinfo
CONOCER LAS DEPENDENCIAS DE UN MÓDULO DEL KERNEL
Los módulos del kernel tienen dependencias. Esto quiere decir que para que un módulo funcione de forma adecuada necesita que otros módulos también estén activados.
Para conocer las dependencias de un módulo tan solo tienen que ejecutar el comando modprove –show-depends seguido del nombre del módulo.
De este modo, si quieren conocer las dependencias del driver realtek tan solo hay que ejecutar el siguiente comando:
joan@debian:~$ sudo modprobe --show-depends realtek insmod /lib/modules/4.8.0-2-amd64/kernel/drivers/net/phy/libphy.ko insmod /lib/modules/4.8.0-2-amd64/kernel/drivers/net/phy/realtek.ko
Por lo tanto tanto queda claro que en mi caso el módulo realtek tiene un módulo dependiente que es el libphy.
El archivo /lib/modules/version_kernel/modules.dep es generado automáticamente por la utilidad depmod y contiene todo el árbol de dependencias de los módulos.
MOSTRAR LA CONFIGURACIÓN DE UN MÓDULO DEL KERNEL
Para ver un listado de los parámetros de configuración de todos los módulos del kernel hay que ejecutar els siguiente en la terminal:
sudo modprobe -c | less
Si únicamente queremos conocer la configuración sobre un determinado módulo, como por ejemplo el nouveau, ejecutamos el siguiente comando en la terminal:
joan@debian:~$ sudo modprobe -c | grep nouveau blacklist nouveau alias pci:v000010DEd*sv*sd*bc03sc*i* nouveau alias pci:v000012D2d*sv*sd*bc03sc*i* nouveau
Viendo el texto podemos ver los alias del módulo nouveau y también podemos ver que esta completamente deshabilitado porque lo hemos introducido a la lista negra.
CARGAR UN MÓDULO AL KERNEL JUNTO CON SUS DEPENDENCIAS
Cargar un módulo en el kernel conjuntamente con sus dependencias es muy sencillo. Pongamos el caso que queremos cargar el módulo vfat.
El primer paso a realizar es comprobar si el módulo está cargado. Para ello ejecutamos el comando lsmod | grep seguido del nombre del módulo:
lsmod | grep vfat
Si el comando no nos proporciona ningún resultado quiere decir que el módulo no está cargado y por lo tanto lo podemos cargar sin problema alguno.
Seguidamente actualizamos la base de datos de dependencias de módulos ejecutando el siguiente comando en la terminal:
sudo depmod
Finalmente cargamos el módulo ejecutando el comando sudo modprobe seguido del nombre del módulo:
sudo modprobe -v vfat
Al ejecutar el comando se cargará el módulo vfat juntamente con todas sus dependencias en el kernel de nuestro equipo.
Como hemos visto anteriormente hay módulos que permiten introducir parámetros de configuración cuando los cargamos. Para conocer los parámetros que se pueden usar consulten el apartado obtener información de los módulos del kernel.
Modprobe tiene multitud de opciones para su ejecución. Para obtener información adicional sobre este comando abran una terminal y ejecuten el comando man modprobe.
DESHABILITAR UN MÓDULO DEL KERNEL JUNTO CON SUS DEPENDENCIAS
Si después de cargar el módulo vfat nos arrepentimos y queremos deshabilitarlo tenemos que seguir los siguientes pasos:
En la terminal ejecutamos el comando sudo modprobe -rv seguido del nombre del módulo que queremos descargar. Por lo tanto para descargar el módulo vfat ejecutamos el siguiente comando en la terminal:
sudo modprobe -rv vfat
Al ejecutar este comando se descargará el módulo vfat y todas sus dependencias del Kernel.
Nota: No apliquen el comando de este apartado a no ser que sea necesario. Si lo aplican y no lo vuelven a activar perderán la posibilidad de trabajar en sistemas de ficheros vfat.
PONER A LA LISTA NEGRA UN MÓDULO DEL KERNEL
Puede darse el caso que existan 2 módulos activos realizando la misma función y esto puede generar conflictos.
Un caso típico y conocido es tener activados los drivers privativos de nvidia conjuntamente con los libres.
Para solucionar este punto disponemos de 2 soluciones:
- Descargar uno de los 2 módulos. Para ello hay que seguir las instrucciones descritas en el apartado anterior.
- Poner a la lista negra uno de los 2 módulos. De esta forma el módulo que está en la lista negra no se cargará nunca.
Para aplicar la segunda solución abrimos una terminal y ejecutamos el siguiente comando:
sudo nano /etc/modprobe.d/blacklist.conf
Una vez se abra el editor de textos escribiremos el text blacklist seguido del nombre del módulo a bloquear. Por lo tanto para poner el módulo nouveau a la lista negra escribimos:
blacklist nouveau
A continuación guardamos los cambios y cerramos el fichero. Si ninguno de los módulos activos depende de nouveau, la próxima vez que arranquemos el ordenador no se cargará el módulo nouveau.
Si queremos bloquear de forma absoluta el módulo nouveau podemos sustituir el comando blacklist nouveau por:
install nouveau /bin/false
AVERIGUAR SI EL DRIVER DE UN HARDWARE ESTÁ INCLUIDO EN EL KERNEL O FORMA PARTE DE UN MÓDULO EXTERNO
En ocasiones puede resultar útil saber si un driver está incluido directamente en el Kernel o lo está a través de un módulo.
Para ello accedemos a la terminal y ejecutamos el siguiente comando:
cat /lib/modules/$(uname -r)/modules.builtin
La salida de este comando contendrá la totalidad de drivers que están incluidos directamente en el kernel.
Estos drivers estáticos en el kernel estarán siempre cargados en memoria listos para ser usados. Por lo tanto si tenemos cargados los drivers de un hardware que no usamos estamos desperdiciando recursos de nuestro ordenador. Por este motivo algunos usuarios de Linux configuran y compilan su propio Kernel. De este modo solo tienen cargado en memoria lo justo e imprescindible para que funcione su equipo.
Compilar un kernel no es tarea fácil. Hay usuarios que presumen de compilar su propio kernel, pero la gran mayoría de estos usuarios se dedican a compilar un kernel a partir del archivo de configuración del kernel de su distro. De esto modo no obtienen ningún beneficio de la compilación del kernel. Lo más difícil y el paso crucial para configurar un kernel es optimizar su archivo de configuración.
Ver los comentarios (11)
Impecable Mr Joan. Se agradece la entrada.
De nada Marcelo. Saludos
Gracias... justo tenia que hacer unos trabajos de la escuela con los módulos... me vino bien tu aporte
gracias por tomarte tu tiempo y compartir esto
Gracias a ti por comentar. Saludos
Excelente!
Muchas gracias! por la entrada! me ha servido de mucho...
Ahora como podríamos comprobar que la blacklist funcione?
:)
Hola Vicel
Pon en la lista negra algún módulo que no te haga falta y al reiniciar el ordenador podrás comprobar que las funcionalidades que da el módulo ya no estarán disponibles.
Saludos
Una consulta estoy tratando de instalar un modulo wifi con chipset rtl8192eu en kali linux, el directorio lo tengo en la carpeta /etc/src, pero al momento de adicionar el modulo en el kernel me indica que no encuentra modulo fuente en el directorio /etc/src.
Que me faltaría para adicionar rtl8192eu
De antemano quedo agradecido
Hola
Estás instalando el driver de forma manual y opuesta a la que detallo en el post. Por lo tanto no se responderte
En el sitio de donde te descargas el driver deberías encontrar las instrucciones de instalación. Las sigues y todo debería funcionar.
Saludos
Fantástico tu aporte, para cargar un módulo al inicio de Linux ¿Cómo lo podría solucionar ( necesito cargar el ax25)
Gracias
Hola
Si el módulo está presente en el kernel lo tendrás que cargar tal y como detallo en el post.
Si no está en el kernel lo tendrás que compilar e instalar. O mirar en tus repositorios si están los paquetes para instalar AX25. En Debian testing están los paquetes y por lo tanto no es suficiente compilar nada.
Saludos
Hola, al intentar cargar un modulo me sale el siguiente mensaje de error: Exec format error. Saben a que se puede deber?
Saludos