Se nos plantea un problema, y es que queremos que un sistema detecte si tiene una tarjeta gráfica nvidia en cuestión, y si la tiene, actuar en consecuencia para poder activar el driver propietario de nvidia para sacarle el máximo partido.

En nuestro caso, estamos trabajando sobre una Ubuntu 9.10 (Karmic), y la solución elegida es delegar en udev la tarea de, en caso de detectarla, lanzar el comando encargado de hacer que se active el driver propietario de nvidia correspondiente.

Lo primero de todo es, conocer con qué tarjeta estamos tratando, y comprobar que funciona debidamente con la última versión del driver propietario, para ello podemos usar la aplicación jockey, la cual tiene la capacidad de detectar hardware para el cual existen drivers propietarios y nos permite habilitarlos.
Por lo que, antes de nada, debemos arrancarla desde el menu de aplicaciones ó desde el terminal, y comprobar que efectivamente, tenemos una tarjeta nvidia para la cual tenemos la posibilidad de usar el driver privativo.

Captura de pantalla de la interfaz de Jockey

Lo bueno de jockey, es que también nos ofrece la posibilidad de operar, mediante la linea de comandos sin necesidad de abrir la aplicación de escritorio, perfecto para nuestro objetivo. Así no tendremos que estar haciendo a mano muchas cosas que jockey ya hace por nosotros.

Pues nada, pasamos a habilitarla y reiniciaremos el equipo como se nos sugiere. Tras arrancarlo y comprobar que la aceleración funciona correctamente, nos dispondremos a deshabilitar el driver propietario de nuevo, para posteriormente activarla a través de nuestra regla udev. Por lo que, reiniciamos para quedarnos como al principio.

Comenzamos, ¿que vamos a usar?

  • lspci
  • udevadm
  • jockey-text
  • vim ó tu editor de texto favorito

Personalmente, me gusta bastante usar la linea de comandos siempre que pueda, por lo que voy a ir al grano usándola, pero, para conocer los datos de nuestro hardware usando una aplicación con interfaz gráfica, podemos usar:

  • gnome-device-manager, si tu distribución sigue usando HAL
  • udev-discover, para los sistemas en los que HAL ya ha sido eliminado en favor de DeviceKit y udev.

¿Qué necesitamos?

Información de la tarjeta gráfica en cuestión. Yo, para obtener los datos necesarios para construir la regla udev, voy a hacer lo siguiente:

  1. Compruebo el dispositivo mediante un lspci -nn y me quedo con la información que necesito, en mi caso, la salida de dicho comando me arroja la siguiente linea acerca de la tarjeta gráfica:01:00.0 VGA compatible controller [0300]: nVidia Corporation G98 [GeForce 8400 GS] [10de:06e4] (rev a1)
  2. Utilizo udevadm para consultar los atributos que podré usar para crear mi regla y que identifique a mi tarjeta de gráfica sin duda alguna.
    Haciendo uso del udevadm comando de la siguiente manera:sudo udevadm info -a -p /sys/devices/pci0000\:00/0000\:00\:01.0/0000\:01\:00.0/Obtengo la siguiente información:looking at device ‘/devices/pci0000:00/0000:00:01.0/0000:01:00.0’:
        KERNEL==”0000:01:00.0″
        SUBSYSTEM==”pci”
        DRIVER==”nvidia”
        ATTR{vendor}==”0x10de”
        ATTR{device}==”0x06e4″
        ATTR{subsystem_vendor}==”0x1043″
        ATTR{subsystem_device}==”0x8322″
        ATTR{class}==”0x030000″
        ATTR{irq}==”16″
        ATTR{local_cpus}==”ff”
        ATTR{local_cpulist}==”0-7″
        ATTR{modalias}==”pci:v000010DEd000006E4sv00001043sd00008322bc03sc00i00″
        ATTR{enable}==”1″
        ATTR{broken_parity_status}==”0″
        ATTR{msi_bus}==””
        ATTR{boot_vga}==”1″

Ya tenemos los datos que necesitamos, por lo que pasamos a escribir nuestra regla correspondiente, en mi caso, la regla es ésta, la cual lanzará nuestro script que habilitará los drivers propietarios correspondientes.

SUBSYSTEM==”pci”, ATTRS{vendor}==”0x10de”, ATTRS{device}==”0x06e4″, RUN+=”/usr/bin/nv_restricted_drivers”

Bien, tendremos que, elegir cuando queremos que se ejecute, para ello podemos ver nuestras necesidades y aplicarle el orden según la siguiente tabla de prioridades. En mi caso, la he colocado al final del todo y la he copiado al directorio /etc/udev/rules.d/, pero, ahora tenemos que comprobar que la regla es válida y nuestra regla hace match con nuesta tarjeta gráfica. Puesto que nuestro dispositivo no es un pendrive o cualquier otro dispositivo que podamos enchufar en caliente, no podremos probarla simplemente enchufando y desenchufando, por eso vamos a usar udeavdm, para evitar tener que estar reiniciando constantemente para comprobar que funciona.

udevadm test /sys/devices/pci0000\:00/0000\:00\:01.0/0000\:01\:00.0/

Si vemos que, efectivamente, nuestra regla hace match, pues ahora nos dedicaremos al script.
En nuestro caso, vamos a activarlo siempre, ya jockey se encargará de comprobar si está en uso o no y hacer lo oportuno.

Primero, comprobaremos cuál es el driver que queremos activar, para ello, usamos el comando jockey para que nos muestre el listado de drivers propietarios para nuestro dispositivo:

jockey-text -l

xorg:nvidia-173 – NVIDIA accelerated graphics driver (Privativa, Desactivado, No está en uso)
xorg:nvidia-185 – NVIDIA accelerated graphics driver (Privativa, Desactivado, No está en uso)

Para a continuación, escribir la siguiente linea en nuestro script, pasándole como argumento, el driver que queremos usar:

jockey-text -e xorg:nvidia-185

Echamos nuestro script a /usr/bin/ con permisos de ejecución. Antes de reiniciar, necesitaremos hacer algo de trabajo adicional, debido a que nuestra tarjeta gráfica se está detectando en el arranque, es decir, desde initramfs, y nuestra regla deberá está debidamente insertada en la imagen que initramfs usará para comenzar el arranque del sistema.

Para ello, en lugar de echar la regla a /etc/udev/rules.d, vamos a moverla a /lib/udev/rules.d y necesitaremos asegurarnos que al regenerar nuestro initramfs la regla se incluya, por eso incluiremos nuestra regla en el hook correspondiente de udev de initramfs.

Podemos actualizar nuestro initramfs ejecutando:

sudo update-initramfs -u

O crear uno nuevo:

sudo update-initramfs -c

Tras reiniciar, los drivers propietarios deben estár habilitados, gracias a nuestra regla udev.

Ésto es una experiencia personal, para la cual he tirado de ésta guía y poco más, por lo que sspero que dicho post pueda solucionarle a alguien la vida ó simplemente le de las ganas de experimentar con udev y algunos de nuestros dispositivos.