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.