GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo cargar o descargar un módulo del kernel de Linux

Este artículo es un extracto del capítulo 15 de Linux en acción, publicado por Manning.

Linux administra los periféricos de hardware mediante módulos de kernel. Así es como funciona.

Un kernel de Linux en ejecución es una de esas cosas que no quieres molestar. Después de todo, el kernel es el software que controla todo lo que hace su computadora. Teniendo en cuenta la cantidad de detalles que deben administrarse simultáneamente en un sistema en vivo, es mejor dejar que el núcleo haga su trabajo con la menor cantidad de distracciones posible. Pero si es imposible realizar incluso pequeños cambios en el entorno informático sin reiniciar todo el sistema, conectar una nueva cámara web o impresora podría causar una interrupción dolorosa en su flujo de trabajo. Tener que reiniciar cada vez que agrega un dispositivo para que el sistema lo reconozca es poco eficiente.

Para crear un equilibrio efectivo entre las virtudes opuestas de estabilidad y facilidad de uso, Linux aísla el kernel, pero le permite agregar funcionalidades específicas sobre la marcha a través de módulos de kernel cargables (LKM). Como se muestra en la figura a continuación, puede pensar en un módulo como una pieza de software que le dice al kernel dónde encontrar un dispositivo y qué hacer con él. A su vez, el kernel pone el dispositivo a disposición de los usuarios y procesos y supervisa su funcionamiento.

No hay nada que le impida escribir su propio módulo para admitir un dispositivo exactamente como le gustaría, pero ¿por qué molestarse? La biblioteca de módulos de Linux ya es tan robusta que, por lo general, no es necesario crear la suya propia. Y la gran mayoría de las veces, Linux cargará automáticamente el módulo de un nuevo dispositivo sin que usted lo sepa.

Aún así, hay momentos en que, por alguna razón, no sucede por sí solo. (No querrá dejar que el gerente de contratación espere con impaciencia que su rostro sonriente se una a la entrevista de trabajo por videoconferencia durante demasiado tiempo). , cómo encontrar el módulo real que ejecutará su periférico y luego cómo activarlo manualmente.

Encontrar módulos del kernel

Por convención aceptada, los módulos son archivos con una extensión .ko (objeto kernel) que se encuentran debajo de /lib/modules/ directorio. Sin embargo, antes de navegar hasta esos archivos, probablemente tendrá que tomar una decisión. Debido a que tiene la opción en el momento del arranque de cargar uno de una lista de versiones, el software específico necesario para respaldar su elección (incluidos los módulos del kernel) debe existir en alguna parte. Bueno, /lib/modules / es uno de esos lugares. Y ahí es donde encontrará directorios llenos de módulos para cada versión disponible del kernel de Linux; por ejemplo:

$ ls /lib/modules
4.4.0-101-generic
4.4.0-103-generic
4.4.0-104-generic

En mi caso, el kernel activo es la versión con el número de versión más alto (4.4.0-104-generic), pero no hay garantía de que sea igual para usted (los kernels se actualizan con frecuencia). Si va a trabajar con módulos que le gustaría usar en un sistema en vivo, debe asegurarse de tener el árbol de directorios correcto.

Más recursos de Linux

  • Hoja de trucos de los comandos de Linux
  • Hoja de trucos de comandos avanzados de Linux
  • Curso en línea gratuito:Descripción general técnica de RHEL
  • Hoja de trucos de red de Linux
  • Hoja de trucos de SELinux
  • Hoja de trucos de los comandos comunes de Linux
  • ¿Qué son los contenedores de Linux?
  • Nuestros últimos artículos sobre Linux

Buenas noticias:hay un truco fiable. En lugar de identificar el directorio por su nombre y esperar que obtenga el correcto, use la variable del sistema que siempre apunta al nombre del kernel activo. Puede invocar esa variable usando uname -r (el -r especifica el número de versión del kernel dentro de la información del sistema que normalmente se mostraría):

$ uname -r
4.4.0-104-generic

Con esa información, puedes incorporar uname en las referencias de su sistema de archivos usando un proceso conocido como sustitución de comandos . Para navegar al directorio correcto, por ejemplo, lo agregaría a /lib/modules . Para decirle a Linux que "uname" no es una ubicación del sistema de archivos, incluya el uname parte en acentos graves, así:

$ ls /lib/modules/`uname -r`
build   modules.alias        modules.dep      modules.softdep
initrd  modules.alias.bin    modules.dep.bin  modules.symbols
kernel  modules.builtin      modules.devname  modules.symbols.bin
misc    modules.builtin.bin  modules.order    vdso

Encontrará la mayoría de los módulos organizados dentro de sus subdirectorios debajo del kernel/ directorio. Tómese unos minutos para navegar a través de esos directorios para tener una idea de cómo están organizados los elementos y qué hay disponible. Los nombres de los archivos suelen darte una buena idea de lo que estás viendo.

$ ls /lib/modules/`uname -r`/kernel
arch  crypto  drivers  fs  kernel  lib  mm
net  sound  ubuntu  virt  zfs

Esa es una forma de ubicar los módulos del kernel; en realidad, es la forma rápida y sucia de hacerlo. Pero no es la única manera. Si desea obtener el conjunto completo, puede enumerar todos los módulos cargados actualmente, junto con alguna información básica, usando lsmod . La primera columna de este resultado truncado (habría demasiados para enumerarlos aquí) es el nombre del módulo, seguido del tamaño y el número del archivo, y luego los nombres de otros módulos de los que depende cada uno:

$ lsmod
[...]
vboxdrv          454656  3 vboxnetadp,vboxnetflt,vboxpci
rt2x00usb        24576  1 rt2800usb
rt2800lib        94208  1 rt2800usb
[...]

¿Cuántos son demasiados? Bien, ejecutemos lsmod una vez más, pero esta vez canalizando la salida a wc -l para obtener un recuento de las líneas:

$ lsmod | wc -l
113

Esos son los módulos cargados. Cuantas hay disponibles en total? Ejecutando modprobe -c y contando las líneas nos dará ese número:

$ modprobe -c | wc -l
33350

Hay 33,350 módulos disponibles!?! Parece que alguien ha estado trabajando duro a lo largo de los años para proporcionarnos el software para ejecutar nuestros dispositivos físicos.

Más recursos de Linux

  • Hoja de trucos de los comandos de Linux
  • Hoja de trucos de comandos avanzados de Linux
  • Curso en línea gratuito:Descripción general técnica de RHEL
  • Hoja de trucos de red de Linux
  • Hoja de trucos de SELinux
  • Hoja de trucos de los comandos comunes de Linux
  • ¿Qué son los contenedores de Linux?
  • Nuestros últimos artículos sobre Linux

Nota:En algunos sistemas, es posible que encuentre módulos personalizados a los que se hace referencia con sus entradas únicas en /etc/modules o como un archivo de configuración guardado en /etc/modules-load.d/ . Lo más probable es que tales módulos sean el producto de proyectos de desarrollo local, quizás involucrando experimentos de vanguardia. De cualquier manera, es bueno tener una idea de lo que estás viendo.

Así es como encuentras los módulos. Su próximo trabajo es descubrir cómo cargar manualmente un módulo inactivo si, por alguna razón, no sucedió por sí solo.

Cargar manualmente los módulos del kernel

Antes de que pueda cargar un módulo del núcleo, la lógica dicta que tendrá que confirmar que existe. Y antes de que puedas hacer eso, necesitarás saber cómo se llama. Obtener esa parte a veces requiere partes iguales de magia y suerte y algo de ayuda del arduo trabajo de los autores de documentación en línea.

Ilustraré el proceso describiendo un problema que encontré hace algún tiempo. Un buen día, por una razón que todavía se me escapa, la interfaz WiFi de un portátil dejó de funcionar. Así. Quizás una actualización de software lo eliminó. ¿Quién sabe? Ejecuté lshw -c network y recibió esta información muy extraña:

network UNCLAIMED
    AR9485 Wireless Network Adapter

Linux reconoció la interfaz (el Atheros AR9485) pero la enumeró como no reclamada. Bueno, como dicen, "cuando las cosas se ponen difíciles, los difíciles buscan en Internet". Realicé una búsqueda de módulo de linux atheros ar9 y, después de revisar páginas y páginas de resultados de cinco e incluso 10 años que me aconsejaban que escribiera mi propio módulo o simplemente me rindiera, finalmente descubrí que (al menos con Ubuntu 16.04) existía un módulo funcional. Su nombre es ath9k.

¡Sí! ¡La batalla es tan buena como ganada! Agregar un módulo al kernel es mucho más fácil de lo que parece. Para verificar que esté disponible, puede ejecutar find contra el árbol de directorios del módulo, especifique -type f para decirle a Linux que está buscando un archivo y luego agregue la cadena ath9k junto con un asterisco global para incluir todos los nombres de archivo que comienzan con su cadena:

$ find /lib/modules/$(uname -r) -type f -name ath9k*
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_common.ko
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k.ko
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_htc.ko
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_hw.ko

Solo un paso más, carga el módulo:

# modprobe ath9k

Eso es todo. Sin reinicios. Sin complicaciones.

Aquí hay un ejemplo más para mostrarle cómo trabajar con módulos activos que se han dañado. Hubo un tiempo en el que usar mi cámara web Logitech con un software en particular hacía que la cámara fuera inaccesible para cualquier otro programa hasta el próximo arranque del sistema. A veces necesitaba abrir la cámara en una aplicación diferente pero no tenía tiempo para apagarla y volver a encenderla. (Ejecuto muchas aplicaciones y ponerlas todas en su lugar después de arrancar lleva algo de tiempo).

Debido a que este módulo presumiblemente está activo, usando lsmod para buscar la palabra video debería darme una pista sobre el nombre del módulo relevante. De hecho, es mejor que una pista:el único módulo descrito con la palabra video es uvcvideo (como se puede ver a continuación):

$ lsmod | grep video
uvcvideo               90112  0
videobuf2_vmalloc      16384  1 uvcvideo
videobuf2_v4l2         28672  1 uvcvideo
videobuf2_core         36864  2 uvcvideo,videobuf2_v4l2
videodev              176128  4 uvcvideo,v4l2_common,videobuf2_core,videobuf2_v4l2
media                  24576  2 uvcvideo,videodev

Probablemente había algo que podría haber controlado que estaba causando el bloqueo, y creo que podría haber investigado un poco más para ver si podía arreglar las cosas de la manera correcta. Pero ya sabes cómo es; a veces no te importa la teoría y solo quieres que tu dispositivo funcione. Así que usé rmmod para eliminar el módulo uvcvideo y modprobe para empezar de nuevo todo agradable y fresco:

# rmmod uvcvideo
# modprobe uvcvideo

De nuevo:sin reinicios. Sin manchas de sangre rebeldes.


Linux
  1. Cómo verificar la versión del Kernel en Linux

  2. Cómo cargar el módulo SELinux para Oracleasm

  3. ¿Cómo cargar módulos del kernel de Linux desde el código C?

  4. ¿Cómo codificar un módulo del kernel de Linux?

  5. ¿Cómo pasar un valor a un módulo kernel de Linux incorporado en el momento del arranque?

Cómo verificar la versión del kernel en Linux

Comando Modprobe en Linux

Cómo verificar la carga de su servidor en Linux

Cómo instalar el módulo 'Python-Pexpect' en Linux

Cómo construir el kernel de Linux desde cero

¿Cómo carga Linux la imagen 'initrd'?