Logo GNU/Linux

Cómo cargar módulos del kernel en Linux

 
 

En este artículo veremos como cargar módulos del kernel en Linux, tanto por demanda como en el arranque del sistema. Veremos también como conocer información sobre los módulos y como descargarlos y deshabilitarlos totalmente.

Índice General

  1. Introducción
  2. Cómo listar los módulos cargados
  3. Cómo conocer el nombre del módulo que usa un dispositivo conectado al bus PCI
  4. Cómo conocer el nombre del módulo que usa un dispositivo conectado al bus USB
  5. Cómo mostrar los drivers incluidos en el kernel
  6. Cómo mostrar información de un módulo
  7. Cargar y descargar módulos del kernel con el comando modprobe
  8. Cargar módulos durante el arranque
  9. Poner en la lista negra un módulo del kernel

 

  1. Introducción (Volver al índice General)
    Los módulos del kernel mejoran o mejor dicho, amplían la funcionalidad del mismo. La existencia de módulos evitan el tener que compilar el kernel cada vez que se necesite una nueva funcionalidad, y además, tener kernels grandes y consumidores de recursos nada mas iniciar el sistema.

    Los módulos del kernel de Linux terminan con la extensión .ko y se almacenan en el directorio /lib/modules/version_del_kernel. Si queremos ver los módulos disponibles para nuestro kernel, podemos ejecutar el siguiente comando:

    $ ls -R /lib/modules/$(uname -r)

    Donde $(uname -r) es una variable que guarda el valor de la versión de nuestro kernel que se obtiene con el comando uname -r.

    Normalmente, los módulos se cargan automáticamente cuando arranca el sistema y se detecta el hardware. No obstante, podemos administrarlos usando ciertos comandos, como pueden ser insmod, rmmod, modprobe, etc. En este artículo nos centraremos en el comando modprobe por su facilidad de uso ya que no tendremos que indicar la ruta absoluta del módulo.

    Antes de ver como se cargan y descargan los módulos en el kernel, veremos como listar los módulos cargados, que módulo utiliza determinado hardware, como mostrar los drivers incluidos en el kernel o como mostrar información sobre un módulo.

  2.  

  3. Cómo listar los módulos cargados (Volver al índice General)
    Para listar los módulos cargados en el kernel, utilizaremos el comando lsmod. Lo que hace lsmod es leer el contenido del archivo /proc/modules. Este comando muestra la información presentando 3 columnas:

    • Module: Muestra los nombres de los módulos cargados.
    • Size: Muestra el tamaño que ocupa cada uno de los módulos cargados en la memoria.
    • Used: Indica si un módulo está siendo usado por otros módulos.

    $ lsmod
    Module                  Size  Used by
    fuse                  122880  1
    btrfs                1404928  0
    zstd_compress         172032  1 btrfs
    zstd_decompress        81920  1 btrfs
    xxhash                 16384  2 zstd_compress,zstd_decompress
    xor                    24576  1 btrfs
    raid6_pq              122880  1 btrfs
    ufs                    86016  0
    qnx4                   16384  0
    hfsplus               118784  0
    hfs                    69632  0
    minix                  40960  0
    msdos                  20480  0
    jfs                   208896  0
    xfs                  1462272  0
    libcrc32c              16384  2 btrfs,xfs
    cpuid                  16384  0
    ...
    ...

    Para filtrar la salida del comando, podemos utilizar una tubería con grep. Veamos un ejemplo para comprobar si está cargado el módulo vfat, necesario para trabajar con sistemas de archivo FAT16 y FAT32:

    $ lsmod | grep vfat
    vfat                   20480  1
    fat                    86016  2 msdos,vfat

    Una alternativa al comando lsmod es mostrar el contenido del archivo /proc/modules:

    $ cat /proc/modules
  4.  

  5. Cómo conocer el nombre del módulo que usa un dispositivo conectado al bus PCI (Volver al índice General)
    El comando lspci muestra todos los dispositivos conectado al bus PCI. En nuestro ejemplo, de todos los dispositivos listados, nos fijaremos en la controladora de red ethernet y veremos que las líneas 11 y 12 nos indican que se está utlizando el driver e1000e:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    $ lspci -v
    ...
    00:19.0 Ethernet controller: Intel Corporation 82579LM Gigabit Network Connection (Lewisville) (rev 04)
            DeviceName:  L1U1
            Subsystem: Intel Corporation 82579LM Gigabit Network Connection (Lewisville)
            Flags: bus master, fast devsel, latency 0, IRQ 27
            Memory at f7100000 (32-bit, non-prefetchable) [size=128K]
            Memory at f7139000 (32-bit, non-prefetchable) [size=4K]
            I/O ports at f040 [size=32]
            Capabilities: <access denied>
            Kernel driver in use: e1000e        Kernel modules: e1000e...</access>

    Para ver si está cargado, podemos comprobarlo con el siguiente comando:

    $ lsmod | grep nvidia
    nvidia_uvm             36864  0
    nvidia              10588160  133 nvidia_uvm
    drm                   491520  3 nvidia

    En este ejemplo vemos que el módulo nvidia está cargado, que depende del módulo drm y a su vez, el módulo nvidia_uvm depende del módulo nvidia.

  6.  

  7. Cómo conocer el nombre del módulo que usa un dispositivo conectado al bus USB (Volver al índice General)
    El comando usb-devices muestra todos los dispositivos conectado al bus USB. En el siguiente ejemplo, de todos los dispositivos listados, nos fijaremos en la impresora y veremos que la línea 11 nos indica que se está utlizando el driver usblp:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    $ usb-devices
    ...
    T:  Bus=01 Lev=02 Prnt=02 Port=01 Cnt=01 Dev#=  6 Spd=480 MxCh= 0
    D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
    P:  Vendor=03f0 ProdID=c111 Rev=01.00
    S:  Manufacturer=HP
    S:  Product=Deskjet 1510 series
    S:  SerialNumber=CN39219K5805YR
    C:  #Ifs= 3 Cfg#= 1 Atr=c0 MxPwr=2mA
    I:  If#=0x0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=cc Prot=00 Driver=(none)
    I:  If#=0x1 Alt= 0 #EPs= 2 Cls=07(print) Sub=01 Prot=02 Driver=usblpI:  If#=0x2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=04 Prot=01 Driver=(none)
    ...

  8.  
     
     

  9. Cómo mostrar los drivers incluidos en el kernel (Volver al índice General)
    En ocasiones nos puede ser de utilidad saber si un driver está incluido en el kernel o lo está a través de un módulo. Los drivers incluidos en el kernel siempre están cargados en memoria y listos para usarse. Esta información es muy útil a la hora de compilar el kernel ya que nos permite ver que drivers están cargados y no necesitamos o solo los necesitamos en ocasiones, consiguiendo así compilar un kernel que mantiene en memoria solo lo imprescindible para que funcione el equipo y menos voluminoso.

    Para listar la totalidad de drivers incluidos en el kernel ejecutaremos el siguiente comando:

    cat /lib/modules/$(uname -r)/modules.builtin
  10.  

  11. Cómo mostrar información de un módulo (Volver al índice General)
    Para mostrar información de un módulo concreto, utilizaremos el comando modinfo. Por ejemplo veamos la información que nos muestra del módulo anterior vfat:

    $ modinfo vfat
    name:           vfat
    filename:       (builtin)
    author:         Gordon Chaffee
    description:    VFAT filesystem support
    license:        GPL
    alias:          fs-vfat
  12.  

  13. Cargar y descargar módulos del kernel con el comando modprobe (Volver al índice General)
    En este punto, no solo veremos como cargar y descargar los módulos, veremos también otras utlidades del comando.
     

    • Cargar módulos del kernel (Volver al índice General)
      Para cargar un módulo en el núcleo y todas sus dependencias, utilizaremos el siguiente comando:

      $ sudo modprobe modulo

      Por ejemplo, cargemos el módulo ntfs necesario para montar particiones con el sistema de archivo NTFS:

      $ sudo modprobe ntfs

      Si nos surgen problemas a la hora de cargar los módulos, podemos probar forzando su carga con la opción -f (o también --force):

      $ sudo modprobe -f ntfs

      Si tras forzar su carga seguimos teniendo problemas, deberíamos habilitar la depuración para intentar localizar el problema y subsanarlo. La combinación de las opciones -n (o también --dry-run) y -v (o también --verbose) es utilizada para la depuración de problemas:

      $ sudo modprobe -vn ntfs
    •  

    • Descargar módulos del kernel (Volver al índice General)
      Para descargar un módulo del núcleo junto con sus dependencias, añadiremos al comando modprobe la opción -r:

      $ sudo modprobe -r modulo

      Por ejemplo, descarguemos el módulo ntfs:

      $ sudo modprobe -r ntfs
    •  

    • Mostrar las dependencias de un módulo (Volver al índice General)
      En ocasiones, un módulo podrá depender de uno o más módulos. Conocer las dependencias es importante ya que es posible que no podamos cargar un módulo por no estar instalados los módulos de los que depende. Para ver las dependencias de un módulo utilizaremos la opción -D (o también --show-depends) Veamos un ejemplo:

      $ modprobe --show-depends nvidia
      insmod /lib/modules/5.4.0-70-generic/kernel/drivers/gpu/drm/drm.ko 
      insmod /lib/modules/5.4.0-70-generic/kernel/drivers/char/drm/nvidia.ko

      En este ejemplo vemos que el módulo nvidia que utiliza nuestra tarjeta de vídeo, depende del módulo drm.

    •  

    • Mostrar la configuración de un módulo del kernel (Volver al índice General)
      Para conocer la configuración de un determinado módulo tendremos que filtrar la información de salida, ya que si no lo hacemos, nos mostrará la información de todos los módulos. Veamos un ejemplo en el que mostraremos la configuración del módulo nvidia:

      $ modprobe -c | grep -w nvidia
      alias char_major_195_* nvidia
      alias pci:v000010DEd*sv*sd*bc03sc00i00* nvidia
      alias pci:v000010DEd*sv*sd*bc03sc02i00* nvidia
      alias pci:v000010DEd00000AA3sv*sd*bc0Bsc40i00* nvidia
      alias pci:v000010DEd00000E00sv*sd*bc04sc80i00* nvidia
      alias symbol:nvUvmInterfaceAddressSpaceCreate nvidia
      alias symbol:nvUvmInterfaceAddressSpaceCreateMirrored nvidia
      ...

      Nota: En este ejemplo, con el comando grep hemos utilizado la opción -w para que busque solo las líneas en las que aparece la palabra nvidia, si no utilizamos la opción -w podrían aparecer líneas pertenecientes a drivers como nvidiafb.

      Si nos interesa mostrar la configuración de todos los módulos, lo conseguiríamos con el comando modprobe -c, pero os aconsejo listarlo entubado con el comando less para que pagine la salida o direccionar la salida a un archivo de texto para luego tratarlo.

      $ modprobe -c | less
      $ modprobe -c > archivo-de-texto
  14.  

  15. Cargar módulos durante el arranque (Volver al índice General)
    Los módulos del kernel pueden ser cargados durante el arranque del sistema añadiéndolos a una lista estática en la carpeta /etc/modules-load.d o en el archivo /etc/modules, según la distribución que usemos.

    • Si utilizamos la carpeta /etc/modules-load.d, tendremos que crear un archivo de texto con extensión .conf y dentro del mismo añadir el módulo a cargar. Veamos un ejemplo para el driver ntfs:

      Creamos el archivo con nuestro editor de texto preferido:

      $ sudo /etc/modules-load.d/ntfs.conf

      En su interior añadimos algo similar a esto:

      # Este archivo carga el módulo ntfs.ko al incio del sistema
      ntfs

      Las líneas vacías y las que comienzan con # o ; serán ignoradas.

    • Si utilizamos el archivo /etc/modules, solo tendremos que añadir el nombre del módulo que queremos que se carge en el arranque. Veamos de nuevo un ejemplo para ntfs:

      Editamos o creamos el archivo, si no existe, con nuestro editor de texto preferido:

      $ sudo /etc/modules

      En su interior añadidos el nombre del módulo a cargar, si añadimos más de un módulo, cada uno irá en una línea distinta:

      # Este archivo carga el módulo ntfs.ko al incio del sistema
      ntfs
      vfat
  16.  

  17. Poner en la lista negra un módulo del kernel (Volver al índice General)
    Puede darse el caso que en nuestro sistema convivan 2 o más módulos que realizan la misma función y que si están cargados a la vez generen problemas. Un caso típico que suele ocurrir es que tengamos instalados en nuestro sistema los drivers privativos de nVIDIA junto a los drivers de software libre y código abierto Nouveau. Podemos solucionarlo poniendo en la lista negra uno de los dos módulos, de tal forma que el módulo que esté en la lista negra no se cargará nunca. Para hacerlo haremos lo siguiente:

    Supongamos que nos interesa que nuestro sistema trabaje con los drivers privativos de nVIDIA, entonces, tendremos que poner en la lista negra el módulo de Nouveau. Para hacerlo, primero editamos el archivo blacklist.conf con nuestro editor de texto favorito:

    $ sudo nano /etc/modprobe.d/blacklist.conf

    Nos vamos al final del archivo y en una nueva línea escribimos los siguiente:

    blacklist nouveau

    Podemos anteponer una línea comentada explicando lo que acabamos de hacer:

    # Driver libre Nouveau; se anula para evitar problemas con el módulo nvidia.
    blacklist nouveau

    Una vez realizados los cambios, guardamos los cambios y cerramos el archivo. Si ninguno de los módulos activos depende del módulo nouveau, en el siguiente inicio del sistema no se cargará el módulo nouveau.

    La operación realizada anteriormente no evitará que se cargue el módulo si otros módulos dependen él. Para evitar esto y bloquear de forma absoluta la carga del módulo tendremos que sustituir la línea blacklist nouveau por la siguiente:

    install nouveau /bin/false

    Guardadas las modificaciones, reiniciamos el sistema para que surtan efecto los cambios.

    También hay que tener en cuenta que si el módulo deshabilitado forma parte de initramfs, el initramfs deberá ser generado de nuevo. En ZeppelinuX hemos publicado el artículo Generar el initramfs del kernel de Linux en el que se explica como regenerar un nuevo initramfs.

 

Espero que este artículo os haya sido de utilidad. Si pensáis que podéis colaborar para mejorar este artículo, que hay algo erróneo en él o simplemente deseáis comentarlo, por favor, dejad vuestra opinión más abajo.
  Configuración de privacidad y de cookies.
Seguir J. Carlos:

Técnico Informático - Desarrollo Web - Administración de Redes

Técnico Informático. Desarrollo Web. Administración de redes.

Últimas publicaciones de

2 comentarios

  1. alfema

    Hola J. Carlos:

    Gracias por el artículo, me ayudó a instalar en mi antiguo equipo un módulo de Nuvoton que no se cargaba por defecto.

    Recientemente he cambiado la placa base, la nueva tiene un controlador de E/S, NUVOTON NCT6687-R, que no está incluido en el núcleo, siguiendo las instrucciones de la página de GitHub (1) lo incluyo con dkms.

    Estoy buscando la forma de que el módulo se cargue automáticamente al inicio Linux, en mi caso Mint 21, sin tener que volver a compilarlo con dkms manualmente.

    (1) https://github.com/Fred78290/nct6687d


    Saludos

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.