Manejar módulos del Kernel y compilar uno fresco de kernel.org

Los módulos del Kernel son piezas de código que pueden ser cargadas y descargadas en el kernel bajo demanda y sin la necesidad de reiniciar el sistema.

De esta forma la funcionalidad del Kernel Linux se extiende a través de módulos.

Esos módulos pueden funcionar como drivers (controladores de hardware) o simplemente sumar al kernel una nueva función como por ejemplo un protocolo de red nuevo o soporte para un sistema de ficheros de por ejemplo discos duros de ordenadores Amiga.

En este post vamos a ver como podemos compilar el kernel a nuestro gusto no sin antes ver como manejar los módulos del kernel en nuestro sistema.

# Herramientas para manejar los módulos

Estas herramientas es muy posible que ya las tengamos instalas en nuestro sistema ya que suelen venir en la mayoría de distros no obstante si no es así posiblemente las encontraremos en paquetes llamados: “module-init-tools” o “kmod”.

Estas herramientas son:

  • lsmod – Sirve para ver un listado de los módulos y el estado de estos en el Kernel.
  • insmod – Para insertar un módulo en el kernel. Si depende de otros se han de cargar antes.
  • modprobe – Sirve para cargar un módulo y los que dependan de él. Tiene más funciones, ver man modprobe.
  • modinfo – Información en detalle de un módulo. Podemos ver en que directorio se encuentra por ejemplo.
  • rmmod – Para eliminar un modulo incluso forzando su eliminación aunque esté en uso.
  • depmod – Este se ejecuta al inicio. Nos sirve para establecer las dependencias entre módulos. Si alteramos la configuración manualmente es interesante ejecutarlo y cambiará /lib/modules/laversióndelkernel/modules.dep

Sabremos que estamos ante un módulo del kernel posiblemente cuando vemos que un archivo tiene la extensión .ko

# Probando las herramientas con un ratón usb óptico

Si disponemos de un ratón USB podemos probar a enchufarlo y desenchufarlo y mirar con dmesg la información del kernel:

 

# dmesg

 

Con suerte veremos algo así como esto:

Por tanto podemos ver que el modulo hid depende de hid_generic y usbhid .
Podemos obtener información de estos módulos con modinfo así:

# modinfo usbhid

Podemos comprobar su estado con lsmod así:

# lsmod | grep usbhid

Podemos usar modprobe para descargar el modulo o cargarlo:

# modprobe -r usbhid
# modprobe usbhid

En el momento que descargamos el modulo (-r remove) dejará de funcionar el ratón USB. Si lo cargamos regresará a la vida.

Otra opción es usar rmmod .

Si quisiéramos añadir a una lista negra un módulo podemos ver esta entrada en la que se habla de eso:

https://mierda.tv/2018/01/30/desactivar-el-sonido-en-gnu-linux-u-otros-perifericos/

Si añadiésemos a la lista usbhid pues el modulo no se cargaría si por ejemplo reiniciamos el sistema.

Ahora vamos ya a la chicha. Vamos a cocinar un kernel.

# Compilar un kernel

Lo normal es compilar una nueva versión de un Kernel cuando necesitamos por algún motivo alguna de las mejoras que incorpore. Esto supone que por ejemplo queremos soporte para algún dispositivo más reciente que no tiene en la versión que utilizamos. Es posible también que simplemente nos de la gana tener un kernel más optimizado para nuestro hardware y que por eso queremos compilarlo en vez de bajar uno ya compilado de los repositorios de nuestra distro.

Vamos a ver nuestra versión de kernel:

# uname -r

En mi caso la 4.9.0-4-amd64 . Miramos en https://www.kernel.org/ la última stable, actualmente a día de hoy la 4.15

La descargamos así (unos 97Mb):

# wget "https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.15.tar.xz"

Como es un tar.xz lo descomprimiremos así:

# tar xvJf linux-4.15.tar.xz

Nos metemos en el directorio que se ha creado e instalaremos la dependencia libncurses ya que la requerimos para hacer uso de menuconfig (que es la opción que vamos a emplear para configurar las opciones del kernel).

En debian puede instalarse la dependencia así (y de paso otras que se requieren pero que es posible que tengas ya cumplidas):

# apt-get install libncurses5-dev fakeroot build-essential xz-utils libssl-dev bc
# cd linux-4.15

Una vez estamos en el directorio del kernel descomprimido vamos a realizar un limpiado con:

# make mrproper 

En realidad teóricamente tendría que venir limpio sin archivos de configuración pero mejor tomarlo como manía ya que si compilamos luego de nuevo tendríamos que limpiar antes.

Vamos a configurar:

# make menuconfig

Aquí navegaremos añadiendo que queremos que se cargue, lo que queremos cargar como modulo, etc…
En mi caso por ejemplo quiero soporte para sistemas de fichero de discos duro de Amiga pero lo mismo a ti eso no te interesa y podrías no cargarlo.

Cuando tengas tu configuración lista sal guardando cambios. Es el momento de compilar.

Voy a hacerlo a “la Debian way” ya que quiero tener el kernel compilado y las headers de este en paquetes deb. Esto es de tremenda utilidad para no andar compilando por ejemplo en otros ordenadores idénticos y para desinstalar de forma sencilla cuando tengamos otro kernel.

Es importante saber que en la versión estable quizás no encontremos kernel-package y por tanto no tendremos el comando make-kpkg pero puede usarse por ejemplo la versión de sid.

Es posible que necesitemos cumplir algunas dependencias que nos falten y es el momento de hacerlo claro.

# apt-get install libelf-dev
# make-kpkg clean
# make-kpkg --initrd kernel_image kernel_headers 

Vete un rato si quieres. Tardará un tiempo en cocinarse a fuego lento. El resultado han de ser 2 paquetes deb, uno con el kernel compilado y otro con las cabeceras.

Es interesante indicar con -j el número de cores con los que contamos para agilizar un poco la compilación: make-kpkg -j 2 –initrd kernel_image kernel_headers

Es importante disponer de bastantes gigas libres para compilar (lo menos 20Gb dependiendo de lo que activemos).

Finalmente cuando tengamos ya los paquetes deb los instalaremos con “dkpg -i nombrepaquete.deb”.
Si todo va bien al reiniciar vamos a poder optar por este kernel y probarlo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *