¿QUÉ SON Y QUÉ 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/5.3.0-46-generic.
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.
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. |
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:
Intel Corporation Atom Processor Z36xxx/Z37xxx Series Graphics & Display
(rev 0e) (prog-if 00 [VGA controller])
Subsystem: Hewlett-Packard Company Atom Processor
Z36xxx/Z37xxx Series Graphics & Display
Flags: bus master, fast devsel, latency 0, IRQ 97
Memory at 90000000 (32-bit, non-prefetchable) [size=4M]
Memory at 80000000 (32-bit, prefetchable) [size=256M]
I/O ports at 3050 [size=8]
[virtual] Expansion ROM at 000c0000 [disabled]
[size=128K]
Capabilities: <access denied>
Kernel driver in use: i915 “Intel”
Kernel modules: i915 “Intel”
Si observamos el campo
Kernel driver in use de nuestra tarjeta gráfica vemos que estamos usando el
módulo Intel. De esta forma puedo afirmar que estoy usando el driver privativo
de INTEL.
Una vez conocemos el nombre del módulo podemos ver si está activado ejecutando
el siguiente comando en la terminal:
lsmod |
grep intel
Por 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=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 6
D: Ver=
2.00 Cls=09(hub ) Sub=00 Prot=01 MxPS=64
#Cfgs= 1
P:
Vendor=1d6b ProdID=0002 Rev=05.03
S:
Manufacturer=Linux 5.3.0-46-generic xhci-hcd
S:
Product=xHCI Host Controller
S:
SerialNumber=0000:00:14.0
C:
#Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=0mA
I: If#=
0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00
Prot=00 Driver=hub
T:
Bus=01 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 2 Spd=480 MxCh= 0
D: Ver=
2.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P:
Vendor=0781 ProdID=5591 Rev=01.00
S:
Manufacturer=SanDisk
S:
Product=Ultra USB 3.0
S:
SerialNumber=0501f9a4061f8c0f62838d26ff24653c0f6b2d3fbe2
C:
#Ifs= 1 Cfg#= 1 Atr=80 MxPwr=224mA
I: If#=
0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
Por lo tanto puedo concluir que mi Sistema Operativo está funcionando desde una USB y está fabricado por SanDisk.
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/5.3.0-46-generic/kernel/drivers/powercap/intel_rapl_msr.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. |
modinfo ejecuatarlo con el comando man:
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:
sudo modprobe --show-depends realtek
Por lo tanto tanto como se ve en la anterior figura, que el módulo realtek no tiene módulos dependientes de él.
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 la siguiente instrucción 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:
sudo
modprobe -c | grep nouveau
Podemos ver los alias del módulo nouveau y también que está completamente habilitado porque no está en 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. Y lo primero que
tendríamos que tener en cuenta es saber si el módulo es privativo o libre, y
para saberlo hacemos un escáner de los módulos.
Teniendo en cuenta que los dispositivos de nuestra computadora manejan
controladores privativos filtramos ese escaneo con la siguiente instrucción.
cat
devices | awk '{print $18}'
Esta instrucción
nos arroja de forma depurada los controladores usados en nuestro kernel y
como se ve en la
figura, el controlador VGA i915 de Intel lo tenemos habilitado. Sí!
quisiéramos instalar un módulo nuevo lo podríamos hacer con insmod o modprobe.
En este ejemplo voy a
cargar el módulo libre 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
¿ Que es VFAT ?
VFAT (Virtual File
Allocation Table) Es una extensión del sistema de archivos FAT y se introdujo
con Windows 95. VFAT mantiene la compatibilidad con FAT pero retrocede las
reglas. Por ejemplo, los nombres de archivo VFAT pueden contener hasta 255
caracteres, espacios y puntos múltiples. Aunque VFAT conserva el caso de los
nombres de archivo, no se considera sensible a mayúsculas y minúsculas.
Sabiendo que es Vfat
vamos ejecutaremos el comando y 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.
Modprobe tiene
multitud de opciones para su ejecución. Para obtener información adicional
sobre este comando se ejecuta man modprobe en la terminal.
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 eliminará el módulo vfat y todas sus dependencias del Kernel.
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.