¿Cuál es la secuencia de carga del módulo de kernel de Linux en el inicio? ¿Cómo se les asigna prioridad?


9

Tengo un módulo de kernel de Linux que compilé dinámicamente. ¿Cómo se agrega al inicio? Hay muchos .koarchivos en /lib/modules. ¿Cómo se establece la prioridad para cargar estos módulos?

Respuestas:


11

No se cargan automáticamente al inicio o en cualquier otro momento, aunque muchos de ellos terminan cargándose durante el arranque. Hay tres mecanismos diferentes por los cuales esto sucede:

  • Solicitud de espacio de usuario: que cubre todo, desde los servicios de inicio hasta udev y la línea de comandos. Init o udev son probablemente los medios más directos si desea cargar un módulo específico en el momento del arranque.

  • Dispositivo conectado en caliente: cuando conecta algo a, por ejemplo, USB o PCI, el núcleo lo detecta y solicita un módulo apropiado en función de cómo se identifica el dispositivo.

  • Protocolo necesario u otra implementación : cuando el núcleo necesita hacer algo, como leer un sistema de archivos, y descubre que carece del conocimiento para hacerlo, solicitará un módulo.

Tenga en cuenta que para los dos últimos utilicé la frase "solicitar un módulo", esto se debe a que el núcleo realmente se carga a través de un demonio de espacio de usuario, kmodque se ejecuta /sbin/modprobe. Según Wolfgang Mauerer en Linux Kernel Architecture , solo hay ~ 100 puntos diferentes en el kernel 2.6 donde se llama una request_module()función interna .

modprobeusa una base de datos de MODULE_ALIAS instaladas. Estos se especifican explícitamente en el código fuente del módulo o se derivan de su MODULE_DEVICE_TABLE, que es una lista de ID de dispositivos OEM a los que da servicio el módulo.


3

Muchos sistemas están configurados para usar un initrd o initramfs . Estas son imágenes del sistema de archivos que el gestor de arranque carga y pone a disposición del núcleo antes de que monte la partición raíz. Esto permite que los controladores necesarios para montar la partición raíz (controladores de disco, controladores de sistema de archivos, mapeador de dispositivos o controladores de volumen lógico, ...) se compilen como módulos y se carguen desde initrd / initramfs.

Los scripts de inicio en initrd ( /linuxrc) o initramfs ( /init) generalmente cargan algunos módulos y localizan el sistema de archivos raíz. Cada distribución tiene su propia configuración. Ubuntu usa un initramfs que se ensambla a partir de componentes en el initramfs-toolspaquete y se regenera para cada núcleo en función de los controladores necesarios para montar el sistema de archivos raíz.

Después de montar el sistema de archivos raíz, durante el arranque del sistema, se cargan los módulos enumerados en /etc/modules(Debian, ...) o /etc/modules.conf(Red Hat, Arch, ...). Este archivo generalmente enumera algunos módulos, si los hay. La mayoría de los módulos se cargan a pedido.

Cuando el núcleo detecta algún hardware para el que carece de un controlador, o ciertos otros componentes, como protocolos de red o algoritmos criptográficos, llama /sbin/modprobepara cargar el módulo. Para los controladores de hardware, el kernel pasa nombres que codifican la identificación PCI, la identificación USB u otra designación sistemática del hardware. Hay una tabla en la /lib/modules/$VERSION/modules.aliasque se asignan estas designaciones sistemáticas a los nombres de los módulos. Esta tabla es generada depmody leída por modprobe.

Si tiene un módulo de kernel adicional que compiló manualmente para un dispositivo de hardware, colóquelo en /lib/modules/$VERSION/local(cree el localsubdirectorio si no existe) y ejecútelo depmod -apara regenerar la base de datos de alias. Si el módulo es por alguna característica inusual que el núcleo no puede detectar automáticamente, colóquelo /lib/modules/$VERSION/local, ejecútelo depmod -apara analizar sus dependencias y agregue el nombre del módulo /etc/modules.


No puedo encontrar un /var/lib/modulesni un /lib/modules/*/local, ni puedo encontrar ninguna mención de esto en Google o en la depmodpágina del manual. Visto en CentOS 6.4, 7.4 y Ubuntu 19.04.
itsadok

@itsadok Estoy bastante seguro de que quería escribir /lib/modules/…. Simplemente cree el localsubdirectorio ( depmodrecorre /lib/module/$VERSIONrecursivamente).
Gilles 'SO- deja de ser malvado'
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.