Administración de módulos de kernel de Linux

Administración de módulos de kernel de Linux

Comprender el núcleo de Linux

El kernel de Linux es el núcleo del sistema operativo Linux. Contiene los componentes principales para abordar el hardware y permite la comunicación e interacción entre el usuario y el hardware. El núcleo de Linux no es un sistema monolítico sino bastante flexible, y el núcleo se extiende por los llamados módulos del núcleo.

¿Qué es un módulo de núcleo??

En general, un módulo de núcleo es un "código que se puede cargar y descargar en el núcleo a demanda. Extienden la funcionalidad del núcleo sin la necesidad de reiniciar el sistema ”[1]. Esto lleva a una muy gran flexibilidad durante la operación.

Además, “un módulo de kernel se puede configurar como incorporado o cargado. Para cargar o eliminar dinámicamente un módulo, debe configurarse como un módulo cargable en la configuración del núcleo ”[1]. Esto se hace en el archivo de origen del kernel/usr/src/linux/.config [2]. Los módulos incorporados están marcados con "Y" y módulos cargables con "M". Como ejemplo, el Listado 1 demuestra esto para el módulo SCSI:

Listado 1: Declaración de uso del módulo SCSI

Config_scsi = y # módulo integrado
Config_scsi = m # módulo cargable
# Config_scsi # variable no está configurada

No recomendamos editar el archivo de configuración directamente, pero para usar el comando "hacer configuración", "hacer menuconfig" o "hacer xconfig" para definir el uso del módulo correspondiente en el kernel de Linux.

Comandos de módulo

El sistema Linux viene con varios comandos diferentes para manejar los módulos del núcleo. Esto incluye enumerar los módulos cargados actualmente en el núcleo de Linux, mostrando información del módulo, así como la carga y descarga de módulos del kernel. A continuación explicaremos estos comandos con más detalle.

Para los núcleos de Linux actuales, el paquete KMOD proporciona los siguientes comandos [3]. Todos los comandos son enlaces simbólicos a Kmod.

La lista actualmente módulos cargados con LSMOD

Comenzamos con el comando LSMOD. LSMOD abrevia "Módulos de lista" y muestra todos los módulos cargados actualmente en el núcleo de Linux formatando bien el contenido del archivo /proc /módulos. El listado 2 muestra su salida que consta de tres columnas: nombre del módulo, el tamaño utilizado en la memoria y otros módulos de núcleo que usan este específico.

Listado 2: Uso de LSMOD

$ lsmod
Tamaño del módulo utilizado por
CTR 12927 2
CCM 17534 2
snd_hrtimer 12604 1
snd_seq 57112 1
snd_seq_device 13132 1 snd_seq

ps

Encuentre módulos disponibles para su kernel actual

Puede haber módulos de núcleo disponibles que aún no tenga conocimiento. Se almacenan en el directorio /lib /módulos. Con la ayuda de Find, combinada con el comando Uname, puede imprimir una lista de estos módulos. "Uname -r" solo imprime la versión del kernel de Linux que se ejecuta actualmente. Listado 3 demuestra esto para un 3 más antiguo.dieciséis.0-7 Linux
núcleo, y muestra módulos para IPv6 e IRDA.

Listado 3: Mostrar módulos disponibles (selección)

$ Find/Lib/Modules/$ (uname -r) -name '*.ko '
/lib/módulos/3.dieciséis.0-7-amd64/kernel/net/ipv6/ip6_vti.KO
/lib/módulos/3.dieciséis.0-7-amd64/kernel/net/ipv6/xfrm6_tunnel.KO
/lib/módulos/3.dieciséis.0-7-amd64/kernel/net/ipv6/ip6_tunnel.KO
/lib/módulos/3.dieciséis.0-7-amd64/kernel/net/ipv6/ip6_gre.KO
/lib/módulos/3.dieciséis.0-7-amd64/kernel/net/irda/irnet/irnet.KO
/lib/módulos/3.dieciséis.0-7-amd64/kernel/net/irda/Irlan/Irlan.KO
/lib/módulos/3.dieciséis.0-7-amd64/kernel/net/irda/irda.KO
/lib/módulos/3.dieciséis.0-7-amd64/kernel/net/irda/ircomm/ircomm.KO
/lib/módulos/3.dieciséis.0-7-amd64/kernel/net/irda/ircomm/ircomm-tty.KO

ps

Mostrar información del módulo utilizando Modinfo

El comando modinfo le indica más sobre el módulo de kernel solicitado ("Información del módulo"). Como parámetro, ModInfo requiere la ruta del módulo completo o simplemente el nombre del módulo. Listado 4 demuestra esto para el módulo del núcleo IRDA que se ocupa de la pila de protocolo de acceso directo infrarroja.

Listado 4: Mostrar información del módulo

$ /sbin /modinfo irda
nombre de archivo:/lib/módulos/3.dieciséis.0-7-amd64/kernel/net/irda/irda.KO
Alias: Net-PF-23
Licencia: GPL
Descripción: La pila de protocolo de Linux IRDA
Autor: Dag Brattli & Jean Tourrilhes
Depende: CRC-CCITT
Vermágico: 3.dieciséis.0-7-AMD64 SMP MOD_UNLOAD MODVERSIONS
ps

La salida contiene diferentes campos de información, como la ruta completa para el módulo del núcleo, su nombre de alias, licencia de software, descripción del módulo, autores, así como kernel internals. El campo "depende" muestra de qué otros módulos de núcleo depende.

Los campos de información difieren de módulo en módulo. Para limitar la salida a un campo de información específico, ModInfo acepta el parámetro "-f" (abreviatura de "-field") seguido del nombre del campo. En el Listado 5, la salida se limita a la información de la licencia disponible utilizando el campo de la licencia.

Listado 5: Muestre solo un campo específico.

$ /sbin /modinfo -f licencia irda
GPL
ps

En los nuevos núcleos de Linux, hay una función de seguridad útil disponible. Esto cubre módulos de núcleo firmados criptográficamente. Como se explica en el sitio web del Proyecto del Kernel Linux [4], “Esto permite una mayor seguridad del núcleo al no permitir la carga de módulos o módulos sin firmar
firmado con una clave inválida. La firma del módulo aumenta la seguridad al hacer que sea más difícil cargar un módulo malicioso en el núcleo. La verificación de la firma del módulo lo realiza el núcleo para que no sea necesario tener "bits de espacio de usuario de confianza."La siguiente figura muestra esto para el
módulo de parport_pc.

Mostrar la configuración del módulo usando modprobe

Cada módulo de núcleo viene con una configuración específica. El comando modprobe seguido de la opción "-c" (abreviatura de "-showconfig") enumera la configuración del módulo. En combinación con GREP, esta salida se limita a un símbolo específico. Listado 6 demuestra esto para las opciones de IPv6.

Listado 6: Mostrar configuración del módulo

$ /sbin /modprobe -c | GREP IPv6
alias net_pf_10_proto_0_type_6 dccp_ipv6
alias net_pf_10_proto_33_type_6 dccp_ipv6
alias nf_conntrack_10 nf_conntrack_ipv6
alias NF_NAT_10 NF_NAT_IPV6
alias nft_afinfo_10 nf_tables_ipv6
alias nft_chain_10_nat nft_chain_nat_ipv6
alias nft_chain_10_route nft_chain_route_ipv6
alias nft_expr_10_reject nft_reject_ipv6
Símbolo de alias: NF_DEFRAG_IPV6_ENABLE NF_DEFRAG_IPV6
Símbolo de alias: NF_NAT_ICMPV6_REPLY_TRANSLATION NF_NAT_IPV6
Símbolo de alias: nft_af_ipv6 nf_tables_ipv6
Símbolo de alias: nft_reject_ipv6_eval nft_reject_ipv6
ps

Mostrar dependencias del módulo

El núcleo de Linux está diseñado para ser modular, y la funcionalidad se distribuye en varios módulos. Esto lleva a varias dependencias de módulos que se pueden mostrar utilizando modprobe nuevamente. Listado 7 utiliza la opción "-show-depende" para enumerar las dependencias para el módulo i915.

Listado 7: Mostrar dependencias del módulo

$ /sbin /modprobe --show-depends i915
insmod/lib/módulos/3.dieciséis.0-7-amd64/kernel/controladores/i2c/i2c-core.KO
insmod/lib/módulos/3.dieciséis.0-7-amd64/kernel/controladores/i2c/algos/i2c-algo-bit.KO
insmod/lib/módulos/3.dieciséis.0-7-amd64/kernel/controladores/térmico/Thermal_sys.KO
insmod/lib/módulos/3.dieciséis.0-7-amd64/kernel/controladores/gpu/drm/drm.KO
insmod/lib/módulos/3.dieciséis.0-7-amd64/kernel/controladores/gpu/drm/drm_kms_helper.KO
insmod/lib/módulos/3.dieciséis.0-7-amd64/kernel/controladores/acpi/video.KO
insmod/lib/módulos/3.dieciséis.0-7-amd64/kernel/controladores/acpi/botón.KO
insmod/lib/módulos/3.dieciséis.0-7-amd64/kernel/controladores/gpu/drm/i915/i915.KO
ps

Para mostrar las dependencias como un árbol similar al comando "Árbol" o "LSBLK", el proyecto Modtree [5] puede ayudar (consulte la figura a continuación para el árbol del módulo i915). Aunque está disponible gratuitamente en GitHub, requiere algunas adaptaciones para cumplir con las reglas de software libre y convertirse en parte de una distribución de Linux como paquete.

Módulos de carga

La carga de un módulo a un núcleo en ejecución se puede hacer mediante dos comandos: Insmod ("Insertar módulo") y modprobe. Tenga en cuenta que hay una ligera pero importante diferencia entre estos dos: Insmod no resuelve las dependencias del módulo, pero ModProbe es más inteligente y lo hace.

Listado 8 muestra cómo insertar el módulo del núcleo IRDA. Tenga en cuenta que INSMODE funciona con la ruta del módulo completo, mientras que ModProbe está contento con el nombre del módulo y lo busca en el árbol del módulo para el núcleo de Linux actual.

Listado 8: Insertar un módulo de kernel

# insmod/lib/módulos/3.dieciséis.0-7-amd64/kernel/net/irda/irda.KO

# modprobe irda

Descarga de módulos

El último paso trata de descargar módulos de un núcleo en ejecución. Nuevamente, hay dos comandos disponibles para esta tarea: modprobe y rmmod ("eliminar el módulo"). Ambos comandos esperan el nombre del módulo como parámetro. El listado 9 muestra esto para eliminar el módulo IRDA del núcleo de Linux en ejecución.

Listado 9: Eliminar un módulo de núcleo

# rmmod irda

# modprobe -r irda

Conclusión

Manejo de módulos de núcleo de Linux no es una gran magia. Solo algunos comandos para aprender, y tú eres el maestro de la cocina.

Gracias

El autor desea agradecer a Axel Beckert (Eth Zürich) y Saif du Plessis (Hothead Studio Cape Town) por su ayuda mientras prepara el artículo.

Enlaces y referencias

  • [1] Módulo del núcleo, Arch Linux Wiki, https: // wiki.archinux.org/índice.php/kernel_module
  • [2] Configuración del núcleo, https: // tldp.org/Howto/SCSI-2.4-HOWTO/KCONFIG.html
  • [3] Kmod, https: // git.núcleo.org/pub/scm/utils/kernel/kmod/kmod.git
  • [4] Instalación de firma del módulo del núcleo, https: // www.núcleo.org/doc/html/v4.15/Admin-Guide/Signing de módulos.html
  • [5] Modtree, https: // github.com/Falconindy/Modtree