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.