Kernel de Linux

Administrar módulos del kernel de Linux

Administrar módulos del kernel de Linux

Entendiendo el kernel de Linux

El kernel de Linux es el núcleo del sistema operativo Linux. Contiene los componentes principales para abordar el hardware y permite tanto la comunicación como la interacción entre el usuario y el hardware. El kernel de Linux no es un sistema monolítico, pero sí bastante flexible, y el kernel se amplía mediante los denominados módulos del kernel.

¿Qué es un módulo de kernel??

En general, un módulo del kernel es un "fragmento de código que se puede cargar y descargar en el kernel a pedido. Extienden la funcionalidad del kernel sin necesidad de reiniciar el sistema ”[1]. Esto conduce a una gran flexibilidad durante el funcionamiento.

Además, “un módulo del kernel se puede configurar como integrado o cargable. Para cargar o quitar dinámicamente un módulo, debe configurarse como un módulo cargable en la configuración del kernel ”[1]. Esto se hace en el archivo fuente del kernel / usr / src / linux /.config [2]. Los módulos incorporados están marcados con "y" y los 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 incorporado
CONFIG_SCSI = m # módulo cargable
La variable # CONFIG_SCSI # no está configurada

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

Comandos del módulo

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

Para los kernels de Linux actuales, el paquete kmod proporciona los siguientes comandos [3]. Todos los comandos son enlaces simbólicos a kmod.

La lista de módulos cargados actualmente con lsmod

Empezamos con el comando lsmod. lsmod abrevia "listar módulos" y muestra todos los módulos cargados actualmente en el kernel de Linux formateando muy bien el contenido del archivo / proc / modules. El Listado 2 muestra su salida que consta de tres columnas: nombre del módulo, el tamaño usado en la memoria y otros módulos del kernel que usan este específico.

Listado 2: Usando 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

Es posible que haya módulos del kernel disponibles que aún no conoce. Se almacenan en el directorio / lib / modules. Con la ayuda de buscar, combinado con el comando uname, puede imprimir una lista de estos módulos. "Uname -r" simplemente imprime la versión del kernel de Linux que se está ejecutando actualmente. El Listado 3 demuestra esto para un 3 más antiguo.dieciséis.0-7 Linux
kernel y muestra módulos para IPv6 e IRDA.

Listado 3: Visualización de módulos disponibles (selección)

$ buscar / lib / modules / $ (uname -r) -name '*.ko '
/ lib / modules / 3.dieciséis.0-7-amd64 / kernel / net / ipv6 / ip6_vti.ko
/ lib / modules / 3.dieciséis.0-7-amd64 / kernel / net / ipv6 / xfrm6_tunnel.ko
/ lib / modules / 3.dieciséis.0-7-amd64 / kernel / net / ipv6 / ip6_tunnel.ko
/ lib / modules / 3.dieciséis.0-7-amd64 / kernel / net / ipv6 / ip6_gre.ko
/ lib / modules / 3.dieciséis.0-7-amd64 / kernel / net / irda / irnet / irnet.ko
/ lib / modules / 3.dieciséis.0-7-amd64 / kernel / net / irda / irlan / irlan.ko
/ lib / modules / 3.dieciséis.0-7-amd64 / kernel / net / irda / irda.ko
/ lib / modules / 3.dieciséis.0-7-amd64 / kernel / net / irda / ircomm / ircomm.ko
/ lib / modules / 3.dieciséis.0-7-amd64 / kernel / net / irda / ircomm / ircomm-tty.ko
..
PS

Mostrar información del módulo usando modinfo

El comando modinfo le brinda más información sobre el módulo del kernel solicitado ("información del módulo"). Como parámetro, modinfo requiere la ruta completa del módulo o simplemente el nombre del módulo. El Listado 4 demuestra esto para el módulo del kernel IrDA que se ocupa de la pila de protocolos de acceso directo por infrarrojos.

Listado 4: Mostrar información del módulo

$ / sbin / modinfo irda
nombre de archivo: / lib / modules / 3.dieciséis.0-7-amd64 / kernel / net / irda / irda.ko
alias: net-pf-23
licencia: GPL
descripción: La pila de protocolos IrDA de Linux
autor: Dag Brattli Y Jean Tourrilhes
depende: crc-ccitt
vermagic: 3.dieciséis.0-7-amd64 SMP mod_unload modversiones
PS

La salida contiene diferentes campos de información, como la ruta completa del módulo del kernel, su nombre de alias, la licencia del software, la descripción del módulo, los autores y las partes internas del kernel. El campo "depende" muestra de qué otros módulos del kernel depende.

Los campos de información difieren de un módulo a otro. 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 licencia disponible mediante el campo de licencia.

Listado 5: mostrar solo un campo específico.

$ / sbin / modinfo -F licencia irda
GPL
PS

En los kernels de Linux más nuevos, está disponible una función de seguridad útil. Esto cubre los módulos del kernel firmados criptográficamente. Como se explica en el sitio web del proyecto del kernel de Linux [4], “esto permite una mayor seguridad del kernel al no permitir la carga de módulos o módulos sin firmar
firmado con una clave inválida. La firma de módulos aumenta la seguridad al dificultar la carga de un módulo malicioso en el kernel. La verificación de la firma del módulo la realiza el kernel, por lo que no es necesario tener "bits de espacio de usuario confiables.”La siguiente figura muestra esto para
módulo parport_pc.

Mostrar la configuración del módulo usando modprobe

Cada módulo del kernel 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. El Listado 6 demuestra esto para las opciones de IPv6.

Listado 6: Mostrar la 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 de módulo

El kernel de Linux está diseñado para ser modular y la funcionalidad se distribuye en varios módulos. Esto conduce a varias dependencias del módulo que se pueden mostrar usando modprobe nuevamente. El Listado 7 usa la opción "-show-depende" para listar las dependencias para el módulo i915.

Listado 7: Mostrar dependencias de módulos

$ / sbin / modprobe --show-depende de i915
insmod / lib / modules / 3.dieciséis.0-7-amd64 / kernel / drivers / i2c / i2c-core.ko
insmod / lib / modules / 3.dieciséis.0-7-amd64 / kernel / drivers / i2c / algos / i2c-algo-bit.ko
insmod / lib / modules / 3.dieciséis.0-7-amd64 / kernel / drivers / Thermal / Thermal_sys.ko
insmod / lib / modules / 3.dieciséis.0-7-amd64 / kernel / drivers / gpu / drm / drm.ko
insmod / lib / modules / 3.dieciséis.0-7-amd64 / kernel / drivers / gpu / drm / drm_kms_helper.ko
insmod / lib / modules / 3.dieciséis.0-7-amd64 / kernel / drivers / acpi / video.ko
insmod / lib / modules / 3.dieciséis.0-7-amd64 / kernel / drivers / acpi / button.ko
insmod / lib / modules / 3.dieciséis.0-7-amd64 / kernel / drivers / gpu / drm / i915 / i915.ko
PS

Para mostrar las dependencias como un árbol similar al comando "tree" o "lsblk", el proyecto modtree [5] puede ayudar (vea 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 del software libre y convertirse en parte de una distribución de Linux como paquete.

Carga de módulos

La carga de un módulo en un kernel en ejecución se puede realizar mediante dos comandos: insmod ("insertar módulo") y modprobe. Tenga en cuenta que hay una pequeña pero importante diferencia entre estos dos: insmod no resuelve las dependencias del módulo, pero modprobe es más inteligente y lo hace.

El Listado 8 muestra cómo insertar el módulo del kernel IrDA. Tenga en cuenta que insmode funciona con la ruta completa del módulo, mientras que modprobe está satisfecho con el nombre del módulo y lo busca en el árbol de módulos del kernel de Linux actual.

Listado 8: Insertar un módulo de kernel

# insmod / lib / modules / 3.dieciséis.0-7-amd64 / kernel / net / irda / irda.ko
..
# modprobe irda

Descarga de módulos

El último paso trata sobre la descarga de módulos de un kernel en ejecución. Nuevamente, hay dos comandos disponibles para esta tarea: modprobe y rmmod ("eliminar 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 kernel de Linux en ejecución.

Listado 9: Eliminando un módulo del kernel

# rmmod irda
..
# modprobe -r irda
..

Conclusión

Manejar los módulos del kernel de Linux no es una gran magia. Solo unos pocos comandos para aprender, y 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 durante la preparación del artículo.

Enlaces y referencias

  • [1] Módulo de kernel, wiki de Arch Linux, https: // wiki.Archlinux.org / index.php / Kernel_module
  • [2] Configuración del kernel, https: // tldp.org / HOWTO / SCSI-2.4-CÓMO / kconfig.html
  • [3] kmod, https: // git.núcleo.org / pub / scm / utils / kernel / kmod / kmod.git
  • [4] Función de firma del módulo del kernel, https: // www.núcleo.org / doc / html / v4.15 / guía-de-administración / firma de módulos.html
  • [5] modtree, https: // github.com / falconindy / modtree
Cómo instalar y jugar a Doom en Linux
Introducción a Doom La serie Doom se originó en los años 90 después del lanzamiento del Doom original. Fue un éxito instantáneo y, desde ese momento e...
Vulkan para usuarios de Linux
Con cada nueva generación de tarjetas gráficas, vemos que los desarrolladores de juegos superan los límites de la fidelidad gráfica y se acercan un pa...
OpenTTD frente a Simutrans
Crear su propia simulación de transporte puede ser divertido, relajante y extremadamente atractivo. Es por eso que debes asegurarte de probar tantos j...