Gestión de módulos de núcleo

Describe cómo inspeccionar los módulos de núcleo cargados, ajustar los parámetros y controlar qué módulos se cargan en Oracle Linux.

Utilice el comando lsmod para ver qué módulos se cargan en el núcleo en ejecución. Utilice el comando modinfo para obtener información sobre un módulo de núcleo. Utilice el comando modprobe para cargar un módulo en el núcleo en ejecución o para cambiar los parámetros del módulo de núcleo. También puede crear archivos de configuración en /etc/modprobe.d/ para controlar los parámetros que se utilizan cuando se cargan los módulos de núcleo. También puede configurar si los módulos se cargan en el momento del inicio, editando la configuración en /etc/modules-load.d/.

Listado de información sobre módulos cargados

Utilice el comando lsmod para mostrar los módulos que se cargan en el núcleo y utilice el comando modinfo para obtener más información sobre cada módulo. Para obtener más información, consulte las páginas del manual lsmod(5) y modinfo(8).
  1. Ejecute el comando lsmod para mostrar los módulos que se cargan en el núcleo.
    lsmod
    Module                  Size  Used by
    udp_diag               16384  0
    ib_core               311296  0
    tcp_diag               16384  0
    inet_diag              24576  2 tcp_diag,udp_diag
    nfsv3                  49152  0
    nfs_acl                16384  1 nfsv3
    ...
    dm_mirror              24576  0
    dm_region_hash         20480  1 dm_mirror
    dm_log                 20480  2 dm_region_hash,dm_mirror
    ...

    La salida muestra el nombre del módulo, la cantidad de memoria que utiliza, el número de procesos que utilizan el módulo y los nombres de otros módulos de los que depende. El módulo dm_log, por ejemplo, depende de los módulos dm_region_hash y dm_mirror. El ejemplo también muestra que dos procesos están utilizando los tres módulos.

  2. Utilice el comando modinfo para mostrar información detallada sobre un módulo.
    modinfo ahci
    filename:       /lib/modules/6.12.0-100.28.2.el10uek.x86_64/kernel/drivers/ata/ahci.ko.xz
    version:        3.0
    license:        GPL
    description:    AHCI SATA low-level driver
    author:         Jeff Garzik
    srcversion:     1DC2CDA088C5DC03187A5E0
    alias:          pci:v*d*sv*sd*bc01sc06i01*
    ...
    depends:        libata,libahci
    intree:         Y
    name:           ahci
    retpoline:      Y
    vermagic:       6.12.0-100.28.2.el10uek.x86_64 SMP preempt mod_unload modversions 
    sig_id:         PKCS#7
    signer:         Oracle CA Server
    sig_key:        7B:38:D7:DC:38:51:E7:C7:F1:61:C5:5D:8D:CC:6B:1C:90:82:4D:05
    sig_hashalgo:   sha512
    signature:      64:05:FC:CC:B1:D3:88:91:B6:C9:A2:39:A3:A9:BB:8C:95:11:36:20:
                    62:9C:95:D9:8B:B8:F6:5F:CC:D2:93:4E:7D:59:E1:80:DB:70:FA:4C:
                    9B:8D:75:E3:98:AB:9D:BD:94:93:A7:72:0B:28:3B:15:4E:96:0D:E3:
                    9F:FE:24:1A:09:B5:31:27:F2:EE:45:61:C8:4A:D3:4B:82:07:23:66:
                    A1:06:F4:DF:B9:FF:D2:78:08:1D:AA:EC:DE:3C:E4:17:BD:69:6A:A5:
    
                    ...
                    64:F0:4F:E2:4E:F3:47:A5:40:E8:F7:07:68:3F:58:25:32:BA:13:E9:
                    00:46:7A:2F:30:73:B4:32:48:76:6B:1E
    parm:           marvell_enable:Marvell SATA via AHCI (1 = enabled) (int)
    parm:           mobile_lpm_policy:Default LPM policy for mobile chipsets (int)
    ...

    Este capítulo incluye la información siguiente:

    filename

    Ruta de acceso absoluta del archivo de objeto de núcleo.

    version

    número de versión del módulo. Tenga en cuenta que es posible que el número de versión no se actualice para los módulos con parches y que falte o se elimine en los núcleos más recientes.

    license

    Información de licencia para el módulo.

    description

    Breve descripción del módulo.

    author

    Crédito de autor para el módulo.

    srcversion

    Hash del código fuente utilizado para crear el módulo.

    alias

    Nombres de alias internos para el módulo.

    depends

    Lista separada por comas de los módulos de los que depende este módulo.

    retpoline

    Un indicador que indica que el módulo está construido que incluye una mitigación contra la vulnerabilidad de seguridad de Spectre.

    name
    Nombre del módulo.
    intree

    Indicador que indica que el módulo se ha creado a partir del origen del árbol del núcleo y no está contaminado.

    vermagic

    Versión del núcleo que se utilizó para compilar el módulo, que se comprueba con respecto al núcleo actual cuando se carga el módulo.

    sig_id

    Método utilizado para almacenar claves de firma que podrían haberse utilizado para firmar un módulo para el inicio seguro, normalmente PKCS#7

    signer

    El nombre de la clave de firma utilizada para firmar un módulo para el inicio seguro.

    sig_key

    Identificador de clave de firma de la clave utilizada para firmar el módulo.

    sig_hashalgo

    Algoritmo utilizado para generar el hash de firma para un módulo firmado.

    signature

    Datos de firma de un módulo firmado.

    parm

    Parámetros del módulo y descripciones.

  3. Utilice el comando modinfo -n para buscar la ruta del archivo al módulo en el sistema de archivos.

    Los módulos se cargan en el núcleo desde los archivos de objetos del núcleo (/lib/modules/kernel_version/kernel/*ko*). Para mostrar la ruta absoluta de un archivo de objeto de núcleo, especifique la opción -n, por ejemplo:

    modinfo -n parport
    /lib/modules/6.12.0-100.28.2.el10uek.x86_64/kernel/drivers/parport/parport.ko.xz

Carga y descarga de módulos

Los módulos se cargan y descargan mediante el comando modprobe. Para obtener más información, consulte las páginas del manual modprobe(8) y modules.dep(5).
  1. Cargue un módulo de núcleo con el comando modprobe.

    El comando modprobe carga módulos de núcleo, por ejemplo:

    sudo modprobe nfs
    sudo lsmod | grep nfs
    nfs                   266415  0 
    lockd                  66530  1 nfs
    fscache                41704  1 nfs
    nfs_acl                 2477  1 nfs
    auth_rpcgss            38976  1 nfs
    sunrpc                204268  5 nfs,lockd,nfs_acl,auth_rpcgss

    Incluya la opción -v (verbosa) para mostrar si hay otros módulos cargados para resolver dependencias.

    sudo modprobe -v nfs
    insmod /lib/modules/6.12.0-100.28.2.el10uek.x86_64/kernel/net/sunrpc/auth_gss/auth_rpcgss.ko 
    insmod /lib/modules/6.12.0-100.28.2.el10uek.x86_64/kernel/fs/nfs_common/nfs_acl.ko 
    insmod /lib/modules/6.12.0-100.28.2.el10uek.x86_64/kernel/fs/fscache/fscache.ko 
    ...
    Nota

    El comando modprobe no vuelve a cargar los módulos que ya están cargados. Primero debe descargar un módulo para poder volver a cargarlo.

  2. Descargue un módulo mediante el comando modprobe -r.

    Utilice la opción -r para descargar módulos de núcleo:

    sudo modprobe -rv nfs
    rmmod /lib/modules/6.12.0-100.28.2.el10uek.x86_64/kernel/fs/nfs/nfs.ko
    rmmod /lib/modules/6.12.0-100.28.2.el10uek.x86_64/kernel/fs/lockd/lockd.ko
    rmmod /lib/modules/6.12.0-100.28.2.el10uek.x86_64/kernel/fs/fscache/fscache.ko
    ...

    Los módulos se descargan en el orden inverso en el que se cargaron por primera vez. Los módulos no se descargan si un proceso u otro módulo cargado los requiere.

Cambio de Parámetros del Módulo del Núcleo

Los módulos de núcleo, como los controladores de hardware, suelen tener parámetros personalizados que se pueden configurar para cambiar el comportamiento del controlador o módulo. Hay varios mecanismos disponibles para actualizar los parámetros del módulo.
  1. Utilice sysfs para actualizar los parámetros del módulo inmediatamente.

    Puede cambiar los valores de algunos parámetros para los módulos cargados y los controladores incorporados escribiendo el nuevo valor en un archivo en /sys/module/module_name/parameters, por ejemplo:

    echo 0 | sudo tee /sys/module/ahci/parameters/skip_host_reset

    Consulte About the /sys Virtual File System y sysfs Directory Reference.

    Tenga en cuenta que los cambios no son persistentes y no se aplican automáticamente después del reinicio.

  2. Utilice el comando modprobe para cambiar la configuración en ejecución de un módulo.

    Para cambiar el comportamiento de un módulo, especifique parámetros para el módulo en el comando modprobe:

    sudo modprobe module_name parameter=value ...

    Separe los pares de parámetros y valores con espacios. Los valores de matriz se representan mediante una lista separada por comas, por ejemplo:

    sudo modprobe foo parm=bar arrayparm=1,2,3,4
  3. Actualice la configuración de modprobe para obtener cambios de configuración de módulo más permanentes.
    Los archivos de configuración (/etc/modprobe.d/*.conf) especifican opciones de módulo, crean alias de módulo y sustituyen el comportamiento habitual de modprobe para los módulos con requisitos especiales. El archivo /etc/modprobe.conf que se utilizó con versiones anteriores de modprobe también es válido si existe. Las entradas de los archivos /etc/modprobe.conf y /etc/modprobe.d/*.conf utilizan la misma sintaxis. Consulte Referencia de configuración de Modprobe para obtener más información.

Especificación de los módulos que se van a cargar en el inicio

El sistema carga la mayoría de los módulos automáticamente en el momento del inicio. También puede agregar módulos que se van a cargar creando un archivo de configuración para el módulo en el directorio /etc/modules-load.d. El nombre de archivo debe tener la extensión .conf.

Los cambios en el directorio /etc/modules-load.d persisten tras los reinicios.

  1. Para forzar la carga de un módulo en el momento del inicio, cree un archivo de configuración en /etc/modules-load.d para el módulo.
    Por ejemplo, para forzar la carga de bnxt_en.conf en el momento del inicio, ejecute el siguiente comando:
    echo bnxt_en | sudo tee /etc/modules-load.d/bnxt_en.conf
  2. Verifique que el archivo existe y que contiene el nombre del módulo.
    cat /etc/modules-load.d/bnxt_en.conf

    Si el módulo aún no está cargado, puede cargarlo manualmente mediante el comando modprobe, o puede reiniciar el sistema y cargarlo automáticamente mediante la configuración que ha proporcionado.

Evitar que los módulos se carguen en el momento del inicio

Puede evitar que los módulos se carguen en el momento del inicio agregando una regla de denegación en un archivo de configuración en el directorio /etc/modprobe.d y, a continuación, reconstruyendo el ramdisk inicial utilizado para cargar el núcleo en el momento del inicio.

Advertencia

La desactivación de módulos puede tener consecuencias no deseadas y puede impedir que un sistema se inicie o que funcione completamente después del inicio. Como mejor práctica, cree una imagen ramdisk de copia de seguridad antes de realizar cambios y asegúrese de que la configuración sea correcta.

  1. Cree un archivo de configuración para evitar que el módulo se cargue.

    Por ejemplo:

    sudo tee /etc/modprobe.d/bnxt_en-deny.conf <<'EOF'
    #DENY bnxt_en
    blacklist bnxt_en
    install bnxt_en /bin/false
    EOF
  2. Reconstruya la imagen de ramdisk inicial.
    sudo dracut -f -v
  3. Reinicie el sistema para que los cambios surtan efecto.
    sudo reboot

Eliminación de módulos de actualización débiles

En ciertos casos, puede eliminar módulos de actualización débiles en lugar de un núcleo más nuevo, por ejemplo, en el caso de que un problema con un controlador enviado se haya resuelto en un núcleo más nuevo. En este caso, es posible que prefiera utilizar el nuevo controlador en lugar del módulo externo que instaló como parte de una actualización de controlador. Consulte Acerca de los módulos de actualización débiles para obtener más información.

Se pueden utilizar dos enfoques diferentes para eliminar un módulo de actualización débil.

  1. Elimine el enlace simbólico manualmente.

    Debido a que los módulos de actualización débiles están vinculados simbólicamente para cada versión del núcleo en el sistema, puede eliminar el enlace simbólico para el módulo de cada núcleo donde no desea que se aplique. Por ejemplo:

    sudo rm -rf /lib/modules/6.12.0-100.28.2.el10uek.x86_64/weak-updates/kmod-kvdo

    En este ejemplo, el módulo de actualización débil, kmod-kvdo, se elimina del núcleo, 6.12.0-100.28.2.el10uek.x86_64.

  2. Utilice el comando weak-modules para eliminar el módulo.

    Puede utilizar el comando weak-modules para eliminar un módulo de actualización débil especificado para todos los núcleos compatibles o el comando para eliminar el módulo de actualización débil para el núcleo actual. También puede utilizar el comando weak-modules de manera similar para agregar módulos de actualización débiles. Para obtener más información sobre este comando, ejecute:

    weak-modules -h

    También puede utilizar el comando weak-modules con la opción dry-run para probar los resultados sin realizar cambios reales, por ejemplo:

    weak-modules --remove-kernel --dry-run --verbose