Skip to main content

Todo sobre el comando de Linux / Unix: insmod

insmod vs modprobe in LINUX (Abril 2025)

insmod vs modprobe in LINUX (Abril 2025)
Anonim

El comando Linux / Unix insmod instala un módulo cargable en el kernel en ejecución.insmod intenta vincular un módulo al kernel en ejecución resolviendo todos los símbolos de la tabla de símbolos exportados del kernel.

Si el nombre del archivo del módulo se da sin directorios o extensión,insmod Buscará el módulo en algunos directorios predeterminados comunes. La variable de entornoMODPATH se puede utilizar para anular este valor predeterminado. Si un archivo de configuración de módulo como/etc/modules.conf existe, anulará las rutas definidas enMODPATH.

La variable de entornoMODULECONF También se puede utilizar para seleccionar un archivo de configuración diferente del predeterminado/etc/modules.conf (o/etc/conf.modules (obsoleto)). Esta variable de entorno anulará todas las definiciones anteriores.

Cuando variable de entornoUNAME_MACHINE está establecido, modutils utilizará su valor en lugar del campo de la máquina desde el syscall uname (). Esto es principalmente de uso cuando está compilando módulos de 64 bits en el espacio de usuario de 32 bits o viceversa, establezcaUNAME_MACHINE Al tipo de los módulos. Los modutils actuales no admiten el modo de compilación cruzada completa para los módulos, se limita a elegir entre las versiones de 32 y 64 bits de la arquitectura del host.

Opciones

-mi persist_name , --persistir= persist_name

Especifica desde dónde se lee cualquier dato persistente para el módulo en carga y se escribe cuando se descarga esta instanciación del módulo. Esta opción se ignora silenciosamente si el módulo no tiene datos persistentes. Los datos persistentes solo son leídos porinsmod Si esta opción está presente, por defectoinsmod No procesa datos persistentes.

Como una forma abreviada,-e "" (una cadena vacía) es interpretada porinsmod como el valor depersistir como se define enmodules.conf, seguido del nombre de archivo del módulo relativo a la ruta de búsqueda del módulo en el que se encontró, menos cualquier ".gz", ".o" o ".mod". Simodules.conf especifica "persistdir ="(es decir,persistir es un campo vacío) entonces esta forma abreviada se ignora silenciosamente. (Vermodules.conf (5).)

-F, --fuerza

Intente cargar el módulo incluso si la versión del kernel en ejecución y la versión del kernel para el cual se compiló el módulo no coinciden. Esto solo anula la verificación de la versión del kernel, no tiene efecto en las verificaciones de los nombres de los símbolos. Si los nombres de los símbolos en el módulo no coinciden con el núcleo, entonces no hay forma de forzarinsmod para cargar el modulo.

-h, --ayuda

Mostrar un resumen de las opciones y salir de inmediato.

-k, --limpieza automática

Establecer el indicador de limpieza automática en el módulo. Esta bandera será utilizada porKerneld(8) para eliminar módulos que no se han utilizado en algún período de tiempo, generalmente un minuto.

-L, --bloquear

Utilizarrebaño(2) para evitar cargas simultáneas del mismo módulo.

-metro, --mapa

Genere un mapa de carga en la salida estándar, lo que facilita la depuración del módulo en el caso de un pánico en el núcleo.

-norte, --sin carga

Ejecución ficticia, haga todo excepto cargar el módulo en el kernel. Si lo solicita un-metro o-O, la ejecución producirá un mapa o archivo blob. Como el módulo no está cargado, la dirección de carga del kernel real es desconocida, por lo que el mapa y el archivo de blob se basan en una dirección de carga arbitraria de 0x12340000.

-o Nombre del módulo , --nombre= Nombre del módulo

Nombre explícitamente el módulo, en lugar de derivar el nombre del nombre base del archivo de objeto de origen.

-O blob_name , --gota= blob_name

Guarda el objeto binario en blob_name . El resultado es un blob binario (sin encabezados ELF) que muestra exactamente lo que se carga en el kernel después de la manipulación y reubicación de la sección. Opción-metro Se recomienda obtener un mapa del objeto.

-pag, --sonda

Probar el módulo para ver si se pudo cargar con éxito. Esto incluye ubicar el archivo de objeto en la ruta del módulo, verificar los números de versión y resolver símbolos. No verifica las reubicaciones ni produce un archivo de mapa o blob.

-PAG prefijo , --prefijo= prefijo

Esta opción se puede usar con módulos versionados para un kernel SMP o bigmem, ya que dichos módulos tienen un prefijo adicional agregado en sus nombres de símbolo. Si el núcleo fue construido con versiones de símbolos entoncesinsmod extraerá automáticamente el prefijo de la definición de "get_module_symbol" o "inter_module_get", uno de los cuales debe existir en cualquier kernel que admita módulos. Si el kernel no tiene versiones de símbolos pero el módulo se construyó con versiones de símbolos, el usuario debe proporcionar-PAG.

-q, --tranquilo

No imprima una lista de símbolos sin resolver. No te quejes del desajuste de versión. El problema solo se reflejará en el estado de salida deinsmod.

-r, --raíz

Algunos usuarios compilan módulos bajo un ID de usuario no root y luego instalan los módulos como root. Este proceso puede dejar los módulos que son propiedad del ID de usuario no root, incluso aunque el directorio de módulos sea propiedad de root. Si el ID de usuario no root está comprometido, un intruso puede sobrescribir los módulos existentes que son propiedad de ese ID de usuario y usar esta exposición para arrancar hasta el acceso de raíz.

Por defecto, modutils rechazará los intentos de usar un módulo que no es propiedad de root. Especificando -r cambiará la verificación y permitirá que la raíz cargue módulos que no son propiedad de la raíz.

Nota: El valor predeterminado para la verificación de raíz se puede cambiar cuando se configuran los modutils.El uso de -r para deshabilitar la verificación de raíz o establecer el valor predeterminado como "sin verificación de raíz" en el momento de la configuración es una exposición de seguridad importante y no se recomienda.

-s, --syslog

Salida de todo asyslog(3) En lugar de la terminal.

-S, --kallsyms

Forzar el módulo cargado para que tengakallsyms datos, incluso si el núcleo no lo soporta. Esta opción es para sistemas pequeños donde el kernel se carga sinkallsyms Datos, pero los módulos seleccionados necesitankallsyms para la depuración. Esta opción es la predeterminada en Red Hat Linux.

-v, --verboso

Ser verboso

-V, --versión

Mostrar la versión deinsmod.

-X, --exportar; -X, --noexportar

Hacer y no exportar todos los símbolos externos del módulo, respectivamente. El valor predeterminado es que los símbolos se exporten. Esta opción solo es efectiva si el módulo no exporta explícitamente su propia tabla de símbolos controlados y, por lo tanto, está en desuso.

-Y, --kymoops; -y, --noksymoops

Hacer y no agregarksymoops Símbolos para ksyms. Estos símbolos son utilizados porksymoops para proporcionar una mejor depuración si hay un Oops en este módulo. El valor predeterminado es para elksymoopsSímbolos a definir. Esta opción es independiente de la-X/-X opciones

ksymoops Los símbolos agregan aproximadamente 260 bytes por módulo cargado. A menos que realmente tenga poco espacio en el kernel y esté tratando de reducir ksyms a su tamaño mínimo, tome el valor predeterminado y obtenga una depuración más precisa de Oops.ksymoops Se requieren símbolos para guardar datos persistentes del módulo.

-NORTE, --solo numérico

Solo verifique la parte numérica de la versión del módulo con la versión del kernel, es decir, ignore EXTRAVERSION cuando decida si un módulo pertenece a un kernel. Esta bandera se establece automáticamente para el kernel 2.5 en adelante, es opcional para los kernels anteriores.

Parámetros del módulo

Algunos módulos aceptan parámetros de tiempo de carga para personalizar su funcionamiento. Estos parámetros son a menudo puertos de E / S y números de IRQ que varían de una máquina a otra y no se pueden determinar a partir del hardware.

En los módulos creados para núcleos de la serie 2.0, cualquier símbolo de puntero de entero o carácter puede tratarse como un parámetro y modificarse. A partir de los núcleos de la serie 2.1, los símbolos se marcan explícitamente como parámetros, de modo que solo se pueden cambiar valores específicos. Además, se proporciona información de tipo para verificar los valores proporcionados en el momento de la carga.

En el caso de los enteros, todos los valores pueden estar en decimal, octal o hexadecimal a la C: 17, 021 o 0x11. Los elementos de la matriz se especifican secuencia separados por comas. Los elementos se pueden omitir omitiendo el valor.

En los módulos de la serie 2.0, los valores que no comienzan con un número se consideran cadenas. A partir de 2.1, la información de tipo del parámetro indica si se debe interpretar el valor como una cadena. Si el valor comienza con comillas dobles ('), la cadena se interpreta como en C, secuencias de escape y todo. Tenga en cuenta que desde el indicador de comandos de shell, las cotizaciones deben estar protegidas de la interpretación de shell.

Módulos y símbolos con licencia GPL

A partir del kernel 2.4.10, los módulos deben tener una cadena de licencia, definida conMODULE_LICENSE (). Varias cadenas son reconocidas como compatibles con GPL; Cualquier otra cadena de licencia o ninguna licencia significa que el módulo se trata como propietario.

Si el kernel soporta el/ proc / sys / kernel / tainted bandera entoncesinsmod O O la bandera contaminada con '1' al cargar un módulo sin una licencia GPL. Se emite una advertencia si el kernel admite la corrupción y se carga un módulo sin una licencia. Siempre se emite una advertencia para los módulos que tienen unaMODULE_LICENSE () eso no es compatible con GPL, incluso en núcleos más antiguos que no admiten la degradación. Esto minimiza las advertencias cuando se utilizan nuevos modutils en los núcleos más antiguos.

insmod -f El modo (forzado) O la bandera contaminada con '2' en los núcleos que admiten la contaminación. Siempre emite una advertencia.

Algunos desarrolladores de kernel requieren que los símbolos exportados por su código solo deben ser utilizados por módulos con una licencia compatible con GPL. Estos símbolos son exportados porEXPORT_SYMBOL_GPL en lugar de lo normalEXPORT_SYMBOL. Los símbolos solo de GPL exportados por el kernel y por otros módulos solo son visibles para los módulos con una licencia compatible con GPL, estos símbolos aparecen en/ proc / ksyms con un prefijo deGPLONLY_'. insmod ignora elGPLONLY_ prefijo en los símbolos mientras se carga un módulo con licencia GPL, por lo que el módulo solo se refiere al nombre del símbolo normal, sin el prefijo. Los símbolos de solo GPL no están disponibles para módulos sin una licencia compatible con GPL, esto incluye módulos sin licencia.

Asistencia Ksymoops

Para ayudar con la depuración de kernel Oops al usar módulos,insmod de manera predeterminada, para agregar algunos símbolos a ksyms, consulte la-Y opción. Estos símbolos comienzan con__insmod_ Nombre del módulo_ . los Nombre del módulo Se requiere hacer los símbolos únicos. Es legal cargar el mismo objeto más de una vez bajo diferentes nombres de módulos. Actualmente, los símbolos definidos son:

__insmod_ Nombre del módulo _ Archivo de objetos _ Mmtime _ Vversion

archivo de objetos es el nombre del archivo desde el que se cargó el objeto. Esto asegura que ksymoops puede hacer coincidir el código con el objeto correcto. mtime es la última marca de tiempo modificada en ese archivo en hexadecimal, cero si la estadística falló. versión es la versión del kernel para la que se compiló el módulo, -1 si no hay una versión disponible. los_O El símbolo tiene la misma dirección de inicio que el encabezado del módulo.

__insmod_ Nombre del módulo _ Nombre de sección _ Llength

Este símbolo aparece al inicio de las secciones ELF seleccionadas, actualmente .text, .rodata, .data, .bss y .sbss. Solo aparece si la sección tiene un tamaño distinto de cero. Nombre de la sección es el nombre de la sección ELF, longitud Es la longitud de la sección en decimal. Estos símbolos ayudan a ksymoops a asignar direcciones a secciones cuando no hay símbolos disponibles.

__insmod_ Nombre del módulo _Ppersistente_ nombre del archivo

Solo creado porinsmod si el módulo tiene uno o más parámetros que están marcados como datos persistentes y un nombre de archivo para guardar los datos persistentes (ver-mi, arriba) está disponible.

El otro problema con la depuración del kernel Oops en módulos es que el contenido de / proc / ksyms y / proc / modules puede cambiar entre Oops y cuando procesa el archivo de registro. Para ayudar a superar este problema, si el directorio / var / log / ksymoops existe entoncesinsmod ymmm copiará automáticamente / proc / ksyms y / proc / modules a / var / log / ksymoops con un prefijo de `fecha +% Y% m% d% H% M% S`. El administrador del sistema puede decirle a ksymoops qué archivos de instantáneas deben usar al depurar un Oops. No hay interruptor para deshabilitar esta copia automática. Si no desea que ocurra, no cree / var / log / ksymoops. Si ese directorio existe, debe ser propiedad de root y estar en modo 644 o 600 y debe ejecutar este script todos los días aproximadamente. La siguiente secuencia de comandos se instala como insmod_ksymoops_clean.

#! / bin / sh # Eliminar ksyms y módulos guardados no accedidos en 2 días si -d / var / log / ksymoops entonces establecer -e # Asegúrate de que siempre haya al menos una versión. d = `fecha +% Y% m% d% H% M% S` cp -a / proc / ksyms /var/log/ksymoops/${d}.ksyms cp -a / proc / modules /var/log/ksymoops/${d}.modules encuentra / var / log / ksymoops -type f -atime +2 -exec rm {} ; fi

Información básica a saber

NOMBRE

insmod - Instalar el módulo del kernel cargable

SINOPSIS

insmod -fhkLmnpqrsSvVxXyYN -e persist_name -o Nombre del módulo -O blob_name -PAG prefijo módulo símbolo= valor …