LINUX

Cómo enumerar / cargar / descargar el módulo del kernel de Linux

Linux es un núcleo monolítico. Un kernel monolítico es una arquitectura de kernel en la que todos los servicios de gestión de procesos, gestión del sistema de archivos, E / S y gestión de dispositivos se ejecutan en el espacio del kernel, es decir, el kernel es responsable de manejar estos servicios. Entonces, estos se cargan en la memoria con el kernel, en el momento del arranque. Con este enfoque, agregar nuevos componentes al kernel se vuelve difícil y complejo, porque el kernel tendría que recompilarse con nuevos componentes y luego cargarse en la memoria. Sin embargo, los módulos de kernel cargables (LKM) compatibles con Linux (y algunos otros kernels monolíticos) pueden cargarse y eliminarse del kernel de forma dinámica.

La imagen del núcleo debe ser lo más clara posible. Además, no todos los controladores pueden integrarse en el kernel. Los módulos en Linux pueden ser algunos controladores de hardware de terceros, controladores para algunos sistemas de archivos o algunos otros componentes (por ejemplo, hay un módulo para iptables en Linux). Aunque el demonio del kernel carga y descarga estos módulos automáticamente, pero si lo desea, puede hacerlo usted mismo, o si hay un módulo que el kernel no puede cargar por sí mismo, debe cargarlo manualmente (y descargarlo cuando ya no es necesario).

Módulos en Linux

Los módulos se denominan objetos Kernel en Linux. Están presentes en el sistema como archivos .ko. Están ubicados en los subdirectorios de un directorio llamado como su número de versión de Kernel en / lib / modules. La versión del Kernel se puede verificar con el comando uname.

$ uname -r
2.6.38-13-generic

En el ejemplo anterior, los módulos están presentes en el directorio llamado ‘2.6.13-generic’ en mi máquina.

$ ls -l /lib/modules/2.6.38-13-generic/
total 4228
lrwxrwxrwx 1 root root 40 2012-02-13 02:13 build -> /usr/src/linux-headers-2.6.38-13-generic
drwxr-xr-x 2 root root 4096 2012-02-13 02:12 initrd
drwxr-xr-x 11 root root 4096 2012-02-13 02:12 kernel
-rw-r--r-- 1 root root 679119 2012-02-13 02:14 modules.alias
-rw-r--r-- 1 root root 656768 2012-02-13 02:14 modules.alias.bin
-rw-r--r-- 1 root root 6097 2012-01-25 00:39 modules.builtin
-rw-r--r-- 1 root root 7438 2012-02-13 02:14 modules.builtin.bin
-rw-r--r-- 1 root root 69 2012-02-13 02:14 modules.ccwmap
-rw-r--r-- 1 root root 309067 2012-02-13 02:14 modules.dep
-rw-r--r-- 1 root root 458980 2012-02-13 02:14 modules.dep.bin
-rw-r--r-- 1 root root 186 2012-02-13 02:14 modules.devname
-rw-r--r-- 1 root root 665 2012-02-13 02:14 modules.ieee1394map
-rw-r--r-- 1 root root 218 2012-02-13 02:14 modules.inputmap
-rw-r--r-- 1 root root 21509 2012-02-13 02:14 modules.isapnpmap
-rw-r--r-- 1 root root 610 2012-02-13 02:14 modules.ofmap
-rw-r--r-- 1 root root 126391 2012-01-25 00:39 modules.order
-rw-r--r-- 1 root root 440266 2012-02-13 02:14 modules.pcimap
-rw-r--r-- 1 root root 1723 2012-02-13 02:14 modules.seriomap
-rw-r--r-- 1 root root 131 2012-02-13 02:14 modules.softdep
-rw-r--r-- 1 root root 245040 2012-02-13 02:14 modules.symbols
-rw-r--r-- 1 root root 313493 2012-02-13 02:14 modules.symbols.bin
-rw-r--r-- 1 root root 1001662 2012-02-13 02:14 modules.usbmap
drwxr-xr-x 3 root root 4096 2012-02-13 02:14 updates

Para ver los archivos .ko, necesitaremos buscar en los subdirectorios. Por ejemplo,

$ ls -l /lib/modules/2.6.38-13-generic/kernel/arch/x86/kernel/
total 88
-rw-r--r-- 1 root root 44184 2012-01-25 00:39 apm.ko
drwxr-xr-x 4 root root 4096 2012-02-13 02:12 cpu
-rw-r--r-- 1 root root 7308 2012-01-25 00:39 cpuid.ko
-rw-r--r-- 1 root root 20640 2012-01-25 00:39 microcode.ko
-rw-r--r-- 1 root root 7908 2012-01-25 00:39 msr.ko

Enumere los módulos cargados

Los módulos que se cargan en el kernel se pueden ver con el comando «lsmod». Enumerará todos los módulos cargados actualmente.

# lsmod
Module Size Used by
ppp_deflate 12838 0
zlib_deflate 26594 1 ppp_deflate
bsd_comp 12777 0
ppp_async 17308 1
crc_ccitt 12595 1 ppp_async
binfmt_misc 13213 1
parport_pc 32111 0
ppdev 12849 0
snd_hda_codec_idt 60537 1
snd_hda_intel 24113 2
snd_hda_codec 90901 2 snd_hda_codec_idt,snd_hda_intel
snd_hwdep 13274 1 snd_hda_codec
snd_pcm 80042 2 snd_hda_intel,snd_hda_codec
snd_seq_midi 13132 0
i915 451053 3
option 21045 2
lib80211_crypt_tkip 17203 0
snd_rawmidi 25269 1 snd_seq_midi
snd_seq_midi_event 14475 1 snd_seq_midi
snd_seq 51291 2 snd_seq_midi,snd_seq_midi_event
wl 2642531 0
joydev 17322 0
snd_timer 28659 2 snd_pcm,snd_seq
snd_seq_device 14110 3 snd_seq_midi,snd_rawmidi,snd_seq
usb_wwan 19711 1 option
drm_kms_helper 40971 1 i915
snd 55295 13 snd_hda_codec_idt,snd_hda_intel,snd_hda_codec,snd_hwdep,snd_pcm,snd_rawmidi,snd_seq,snd_timer,snd_seq_device
drm 184164 4 i915,drm_kms_helper
i2c_algo_bit 13184 1 i915
dell_laptop 13515 0
dcdbas 14054 1 dell_laptop
dell_wmi 12601 0
sparse_keymap 13666 1 dell_wmi
usbserial 37116 7 option,usb_wwan
uvcvideo 66851 0
soundcore 12600 1 snd
videodev 75143 1 uvcvideo
snd_page_alloc 14073 2 snd_hda_intel,snd_pcm
lib80211 14570 2 lib80211_crypt_tkip,wl
video 18951 1 i915
psmouse 73312 0
serio_raw 12990 0
lp 13349 0
parport 36746 3 parport_pc,ppdev,lp

usbhid 41704 0
hid 77084 1 usbhid
r8169 42534 0

Cargar un módulo nuevo

Cualquier módulo que desee cargar en el kernel puede cargarse usando el comando ‘modprobe’ o ‘insmod’. Sin embargo, el comando ‘modprobe’ es más poderoso, por lo que es posible que desee utilizar ‘modprobe’ en lugar de ‘insmod’. Además, si hay alguna dependencia en el módulo que deseamos cargar, ‘modprobe’ se encarga de ello. Entonces, para fines de demostración, usaremos ‘modprobe’.

El módulo para iptables (ip_tables) aún no se ha cargado en la memoria. Esto se puede verificar en la salida anterior, o podemos buscarlo usando grep.

# lsmod | grep table
#

Este comando no devuelve nada. Entonces cargaremos el módulo correspondiente usando ‘modprobe’ como:

# modprobe ip_tables
# lsmod | grep table
ip_tables 18125 0
x_tables 21907 1 ip_tables

Aquí, deseamos cargar el módulo ‘ip_tables’ y ‘x_tables’ era su dependencia de la que se encargaba ‘modprobe’.

Módulo de descarga

Cuando ya no necesitemos el módulo, podemos eliminarlo usando el comando ‘rmmod’ o ‘modprobe -r’. Una vez más, ‘modprobe’ también descargará todas las dependencias. Tenga en cuenta que un módulo no se descargará a menos que no esté siendo utilizado por ningún otro módulo. Si intentamos eliminar el módulo ‘x_tables’ antes de ‘ip_tables’, obtenemos un error, porque ‘x_tables’ está siendo utilizado por ‘ip_tables’.

# modprobe -r x_tables
FATAL: Module x_tables is in use.
root@raghu-Inspiron-1440:~# lsmod | grep table
ip_tables 18125 0
x_tables 21907 1 ip_tables
#

Ahora, si eliminamos el módulo ip_tables con ‘modprobe’, también eliminará ‘x_tables’.

# modprobe -r ip_tables
# lsmod | grep table

Obtener información del módulo

El comando ‘modinfo’ muestra información sobre un módulo:

# modinfo ip_tables
filename: /lib/modules/2.6.38-13-generic/kernel/net/ipv4/netfilter/ip_tables.ko
description: IPv4 packet filter
author: Netfilter Core Team <coreteam@netfilter.org>
license: GPL
srcversion: 71A366B1B82EB2884B5A127
depends: x_tables
vermagic: 2.6.38-13-generic SMP mod_unload modversions 686

Conclusión

En este tutorial, aprendimos los comandos utilizados en Linux para listar, cargar y descargar módulos del kernel. Espero que haya disfrutado leyendo esto y deje su sugerencia en la sección de comentarios a continuación.

Publicaciones relacionadas

Deja una respuesta

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

Botón volver arriba
Cerrar