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.
- Introducción
- Cómo listar los módulos cargados
- Cómo conocer el nombre del módulo que usa un dispositivo conectado al bus PCI
- Cómo conocer el nombre del módulo que usa un dispositivo conectado al bus USB
- Cómo mostrar los drivers incluidos en el kernel
- Cómo mostrar información de un módulo
- Cargar y descargar módulos del kernel con el comando modprobe
- Cargar módulos durante el arranque
- Poner en la lista negra un módulo del kernel
- 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 comandouname -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 comandomodprobe
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.
- Cómo listar los módulos cargados (Volver al índice General)
Para listar los módulos cargados en el kernel, utilizaremos el comandolsmod
. Lo que hacelsmod
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ódulovfat
, 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
- Cómo conocer el nombre del módulo que usa un dispositivo conectado al bus PCI (Volver al índice General)
El comandolspci
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 drivere1000e
: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ódulodrm
y a su vez, el módulonvidia_uvm
depende del módulonvidia
. - Cómo conocer el nombre del módulo que usa un dispositivo conectado al bus USB (Volver al índice General)
El comandousb-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 driverusblp
: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) ...
- 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
- Cómo mostrar información de un módulo (Volver al índice General)
Para mostrar información de un módulo concreto, utilizaremos el comandomodinfo
. Por ejemplo veamos la información que nos muestra del módulo anteriorvfat
:$ modinfo vfat name: vfat filename: (builtin) author: Gordon Chaffee description: VFAT filesystem support license: GPL alias: fs-vfat
- 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 comandomodprobe
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ódulodrm
. - 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ódulonvidia
:$ 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 palabranvidia
, si no utilizamos la opción-w
podrían aparecer líneas pertenecientes a drivers comonvidiafb
.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 comandoless
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
- Cargar módulos del kernel (Volver al índice General)
- 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 driverntfs
:
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 parantfs
:
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
- Si utilizamos la carpeta
- 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.
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
J. Carlos
Gracias a ti por visitar ZeppelinuX