lunes, 25 de enero de 2021

Integración de módulos en el sistema Linux

Posted by q3it on lunes, enero 25, 2021 in ,

¿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:

  1. Usar los drivers privativos de nuestra tarjeta gráfica.
  2. Registrar las temperaturas de componentes de nuestro ordenador.
  3. Que los ventiladores de nuestro ordenador sean gestionados por el software creado por el fabricante de nuestro ordenador.
  4. Hacer funcionar nuestro tarjeta de red wifi.
  5. 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.