¿Los módulos del controlador se cargan y descargan automáticamente?


15

En Ubuntu 14.04, descubrí que cuando no conecto mi adaptador inalámbrico externo, su módulo rt2800usbaún se muestra lsmod.

  1. ¿Cuándo se carga automáticamente un módulo de controlador? ¿Es cuando el dispositivo está conectado a la computadora o cuando se inicia el sistema operativo?

  2. ¿Cuándo ocurre la descarga automática de un módulo controlador? ¿Es cuando el dispositivo está desconectado de la computadora o cuando el sistema operativo se apaga?

Respuestas:


13

Cuando el núcleo detecta un nuevo dispositivo, ejecuta el programa modprobey le pasa un nombre que identifica el dispositivo. La mayoría de los dispositivos se identifican a través de números registrados para un proveedor y modelo, por ejemplo, identificadores PCI o USB . El modprobeprograma consulta la tabla de alias del módulo para encontrar el nombre del archivo que contiene el controlador para ese dispositivo en particular. Un principio similar se aplica a los controladores para cosas que no son dispositivos de hardware, como sistemas de archivos y algoritmos criptográficos. Para obtener más detalles, consulte Debian no detecta la tarjeta PCI serie después de reiniciar/lib/modules/VERSION/modules.alias

Una vez que modprobe ha identificado qué archivo de módulo ( .ko) contiene el controlador solicitado, carga el archivo de módulo en el núcleo: el código del módulo se carga dinámicamente en el núcleo. Si el módulo se carga correctamente, aparecerá en la lista de lsmod.

La carga automática de módulos ocurre cuando el kernel detecta nuevo hardware conectable en caliente, por ejemplo, cuando conecta un periférico USB. El sistema operativo también hace una enumeración de todo el hardware que está presente en el sistema temprano durante el inicio, para cargar los controladores de los periféricos que están presentes en el momento del arranque.

También es posible solicitar manualmente la carga de un módulo con el comando modprobeo insmod. La mayoría de las distribuciones incluyen un script de inicio que carga los módulos enumerados en /etc/modules. Otra forma de cargar los módulos es si son una dependencia de un módulo: si el módulo A depende del módulo B, entonces modprobe Acarga B antes de cargar A.

Una vez que se carga un módulo, permanece cargado hasta que se descarga explícitamente, incluso si todos los dispositivos que usan ese controlador se han desconectado. Hace mucho tiempo, había un mecanismo para descargar automáticamente los módulos no utilizados, pero fue eliminado, si no recuerdo mal, cuando udev entró en escena. Sospecho que la descarga automática de módulos no es una característica común porque los sistemas que tienden a necesitarla son principalmente PC de escritorio que tienen mucha memoria de todos modos (en la escala del código del controlador).


Gracias. No he modificado /etc/modules. rt2800usbestá en la salida de lsmod, y ¿eso significa que conecté su dispositivo a mi computadora antes desde el arranque?
Tim

1
@Tim Si el módulo está cargado, y no lo cargó explícitamente, y no aparece en la lista /etc/modules, entonces sí, probablemente la razón por la que se carga el módulo es porque el dispositivo estaba presente en algún momento.
Gilles 'SO- deja de ser malvado'

5

Los módulos se cargan cuando el sistema se inicia a través del disco RAM inicial, también conocido como initrd . La Sección de Justificación establece:

Muchas distribuciones de Linux incluyen una única imagen genérica de kernel de Linux, una que los desarrolladores de la distribución crean específicamente para arrancar en una amplia variedad de hardware. Los controladores de dispositivo para esta imagen genérica del núcleo se incluyen como módulos de núcleo cargables porque compilar estáticamente muchos controladores en un núcleo hace que la imagen del núcleo sea mucho más grande, tal vez demasiado grande para arrancar en computadoras con memoria limitada. Esto plantea el problema de detectar y cargar los módulos necesarios para montar el sistema de archivos raíz en el momento del arranque o, para el caso, deducir dónde o qué es el sistema de archivos raíz.

Ubuntu, como muchas otras distribuciones, elige cargar cada controlador de dispositivo en este initrd, independientemente de si el controlador es necesario o no, y también independientemente de si el dispositivo está presente en el sistema o no. Como señaló Giles, todo se carga en la RAM, y luego los módulos utilizados se detectan al inicio y los no utilizados se eliminan de la RAM. El uso de este enfoque garantiza que Ubuntu siempre se iniciará en cualquier sistema, independientemente de la configuración. Ubuntu está imitando un núcleo monolítico utilizando construcciones de microkernel. Ver la razón por la que esto funciona


  1. El módulo rt2800usbsiempre se cargará en el arranque porque el módulo se incluyó en los initramfs a los que Gilles se refirió. Initramfs es un sucesor de initrd, por lo tanto, siempre se mostrará con lsmod. Tenga en cuenta que puede insertar un módulo recién compilado en el núcleo utilizando modprobeseguido del nombre del módulo.

Como prueba, reinicie su sistema con su adaptador inalámbrico desconectado. Si todo va bien, el módulo no aparecerá en la lista de lsmodsalida de s porque durante el arranque, el proceso de detección iniciado por initramfs y el sistema de inicio no encontró el dispositivo durante el sondeo, y el módulo se retiró de la RAM.

  1. Para eliminar un módulo mientras se está ejecutando un sistema, puede usar comandos como rmmod, o modprobe -rseguidos del nombre del módulo. En el próximo arranque, el módulo se volverá a cargar. Véase más arriba. En la mayoría de los casos, un módulo no se elimina dinámicamente, ya que esto deshabilitaría la conexión en caliente, es decir, una vez que se retira un módulo, el dispositivo que lo usa no puede detectarse nuevamente cuando se vuelve a enchufar.

Para eliminar un módulo lsmod, debe eliminarlo de la imagen initramfs creada volviendo a compilar el núcleo sin el módulo elegido y luego reconstruyendo la imagen. Hacer esto deshabilita toda detección de dicho módulo.


3
Está confundiendo cargar un archivo en la RAM como parte de un disco RAM y cargar (es decir, vincular dinámicamente) un módulo en el núcleo en ejecución. Los módulos se cargan temporalmente en la memoria, no en el núcleo, desde el initrd (técnicamente un initramfs hoy en día), pero luego se eliminan de la memoria después de montar la raíz real. Los módulos solo se cargan en el núcleo cuando se detecta un dispositivo que los usa (con algunas excepciones).
Gilles 'SO- deja de ser malvado'

Si bien estoy de acuerdo aquí, estaba hablando de descargar y cargar un módulo que no se puede hacer a menos que elija volver a configurar el Disco RAM de Ubuntu, lo que no se recomienda porque Ubuntu elige cargar todos los módulos en la RAM cada actualización del kernel. Todos los módulos se cargan cada vez, simplemente no se usan todos.
eyoung100

2
No, la pregunta es sobre cargar y descargar un módulo en el núcleo. Ni su respuesta original ni su respuesta revisada abordan eso. El initramfs es irrelevante (o como mucho periféricamente relevante) a esta pregunta.
Gilles 'SO- deja de ser malvado'

@Gilles ¿Es esto mejor?
eyoung100

1
@ eyoung100, estoy de acuerdo con Gilles. Una discusión sobre initramfs no es relevante para la pregunta. Los módulos se cargan generalmente enumerando dispositivos /sysy cargando los controladores para los dispositivos que realmente se encuentran en el sistema. Esto sucede si el dispositivo está presente en el arranque o si se conecta en caliente más tarde. udevtiene mucho más que ver que initramfs / initrd, y si todos, la mayoría o solo algunos módulos se copian en initramfs (una opción de configuración en /etc/initramfs-tools/initramfs.conf) no es especialmente relevante.
Celada
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.