Consulta y modificación de parámetros del kernel

2018/05/18

Obtener información de un módulo del 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.

Obtener los parámetros utilizados en un módulo del kernel

grep

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:

systool

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.

Modificar parámetros de un módulo del kernel

Para modificar un parámetro de un módulo del kernel se tienen las siguientes alternativas:

  1. 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:

    1. Al iniciar el sistema, editando la linea de comandos del kernel
    2. Modificando la linea de comandos del kernel en los archivos de configuración del bootloader; en el caso de grub la variable GRUB_CMDLINE_LINUX_DEFAULT del archivo /etc/default/grub.

    Ejemplo: utilizando el built-in data para el valor de edid:

    drm.edid_firmware=1024x768
    
  2. 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
    
  3. 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.

  4. 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.