Publicado 2018-05-18.
Palabras clave: kernel
Para obtener información de un módulo del kernel está el programa
modinfo
:
Ejemplo:
# modinfo drm
filename: /lib/modules/4.16.0-1-amd64/kernel/drivers/gpu/drm/drm.ko
license: GPL and additional rights
description: DRM shared core routines
author: Gareth Hughes, Leif Delgass, José Fonseca, Jon Smirl
license: GPL and additional rights
description: DRM bridge infrastructure
author: Ajay Kumar <ajaykumar.rs@samsung.com>
license: GPL and additional rights
description: DRM panel infrastructure
author: Thierry Reding <treding@nvidia.com>
depends:
retpoline: Y
intree: Y
name: drm
vermagic: 4.16.0-1-amd64 SMP mod_unload modversions
parm: edid_firmware:Do not probe monitor, use specified EDID blob from built-in data or /lib/firmware instead. (string)
parm: vblankoffdelay:Delay until vblank irq auto-disable [msecs] (0: never disable, <0: disable immediately) (int)
parm: timestamp_precision_usec:Max. error on timestamps [usecs] (int)
parm: edid_fixup:Minimum number of valid EDID header bytes (0-8, default 6) (int)
parm: debug:Enable debug output, where each bit enables a debug category.
Bit 0 (0x01) will enable CORE messages (drm core code)
Bit 1 (0x02) will enable DRIVER messages (drm controller code)
Bit 2 (0x04) will enable KMS messages (modesetting code)
Bit 3 (0x08) will enable PRIME messages (prime code)
Bit 4 (0x10) will enable ATOMIC messages (atomic code)
Bit 5 (0x20) will enable VBL messages (vblank code)
Bit 7 (0x80) will enable LEASE messages (leasing code) (int)
Si el objetivo es modificar los parámetros se puede utilizar la opción -p
para
obtener solamente la lista de parámetros que soporta el módulo.
La versión de un hombre
pobre
para verificar los valores en run-time es utilizando grep
como se indica en
la documentación del
kernel:
# grep -H . /sys/module/<module>/parameters/*
Notar que hay que ejecutar el comando como root o a través de sudo
, ya que
en caso contrario al obtener el valor de algunos parámetros nos puede aparecer
el error de permisos.
Ejemplo:
# grep -H . /sys/module/drm/parameters/*
/sys/module/drm/parameters/debug:0
/sys/module/drm/parameters/edid_fixup:6
/sys/module/drm/parameters/timestamp_precision_usec:20
/sys/module/drm/parameters/vblankoffdelay:5000
PROS:
CONS:
Una información más completa se puede obtener mediante el comando
systool
del paquete sysfsutils
(debian/centos):
# systool -vm <modulo>
Ejemplo:
# systool -vm drm
Module = "drm"
Attributes:
coresize = "458752"
initsize = "0"
initstate = "live"
refcnt = "7"
taint = ""
uevent = <store method only>
Parameters:
debug = "0"
edid_firmware = ""
edid_fixup = "6"
timestamp_precision_usec= "20"
vblankoffdelay = "5000"
Sections:
...
PROS:
CONS:
De los ejemplos anteriores se puede ver el caso del parámetro edid_firmware
que está vacío, en la versión con grep
no aparece.
Para modificar un parámetro de un módulo del kernel se tienen las siguientes alternativas:
Linea de comandos del kernel.
Es la opción a utilizar cuando el módulo está integrado al kernel. De kernel-parameters en la documentación del kernel:
Parameters for modules which are built into the kernel need to be specified on the kernel command line
Hay dos formas de especificarlo:
GRUB_CMDLINE_LINUX_DEFAULT
del archivo /etc/default/grub
.Ejemplo: utilizando el built-in data para el valor de edid:
drm.edid_firmware=1024x768
modprobe.d - directorios de configuración de modprobe.
El paquete kmod que contiene los
comandos modprobe
e insmod
incluye el directorio de configuración
/etc/modprobe.d/
en el cual pueden crearse archivos con extensión .conf
para indicar que opciones deben utilizarse al cargar un módulo dado. Para
ello se utiliza la directiva option, aunque hay otras disponibles.
Ejemplo:
# cat > /etc/modprobe.d/drm.conf <<'END'
options drm edid_firmware=1024x768
END
Llamar manualmente a modprobe
o insmod
al cargar el módulo del kernel.
De la documentación de
modprobe
e
insmod
se ve
que es posible pasar los parámetros del módulo al insertar un módulo en el
kernel.
Si el módulo ya está en memoria es necesario removerlo previamente
(modprobe -r
/rmmod
) y volver a insertarlo para utilizar los nuevos
valores de los parámetros.
Ejemplo:
# cat /sys/module/usbhid/parameters/jspoll
0
# modprobe -v -r usbhid; modprobe -v usbhid jspoll=5
rmmod usbhid
insmod /lib/modules/4.16.0-1-amd64/kernel/drivers/hid/usbhid/usbhid.ko jspoll=5
# cat /sys/module/usbhid/parameters/jspoll
5
CUIDADO: si se está utilizando un teclado usb y se remueve el módulo usbhid del kernel el teclado dejará de responder. Por eso es que se realiza en una misma linea del shell la remoción e inserción del kernel.
Cambio en runtime.
Como se indica en kernel-parameters:
Loadable modules, after being loaded into the running kernel, also reveal their parameters in /sys/module/${modulename}/parameters/. Some of these parameters may be changed at runtime by the command
echo -n ${value} > /sys/module/${modulename}/parameters/${parm}
.
Los parámetros se pueden modificar o no en base al valor del parámetro
perm
de la macro module_param
que es utilizada para definir el parámetro
del módulo.
Ejemplo:
# cat /sys/module/usbhid/parameters/jspoll
5
# echo -n 7 > /sys/module/usbhid/parameters/jspoll
# cat /sys/module/usbhid/parameters/jspoll
7
NOTA: En este caso se puede ver del código del módulo en https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/hid/usbhid/hid-core.c que el valor del parámetro jspoll se puede cambiar en runtime. Si los permisos no lo permiten es necesario reinsertar el módulo del kernel como se vió en el caso anterior.