Como tantas otras cosas que vimos, los drivers (o controladores) se manejan un poco distinto en Linux. La idea es exactamente la misma, el driver provee al sistema con las funciones necesarias para que se pueda usar algún hardware especifico.
Los drivers se cargan en el kernel (núcleo) del sistema operativo, de dos maneras. Pueden estar embebidos en el kernel o pueden ser un modulo.
Los drivers que están embebidos en el kernel suelen ser los mas básicos que sirven en la mayoría de los sistemas, los demás siempre es recomendable que sean módulos, ya que estos se pueden quitar de la memoria si no son necesarios.
El kernel trae cada vez mas drivers y es mas compatible con el hardware a medida que pasa el tiempo, ya que se descubren bugs y se van solucionando y es muy raro (si alguna vez sucede) que alguna parte se reescriba desde cero. De hecho, como anecdota personal, muy pocas veces tuve que compilar e instalar drivers, inclusive en mi netbook la ultima versión de openSUSE instalo todos los drivers correctamente (incluidos camara web, lector de tarjetas, módem 3G y teclas especiales)
Sin embargo hay veces en que es necesario instalar un driver, por ejemplo si el que trae el kernel no provee toda la funcionalidad del hardware en cuestión o no funciona con la misma velocidad que un driver propietario. Por ejemplo, con una placa de vídeo. Normalmente instalar un driver no tendría que representar mayores problemas, siguiendo con el ejemplo de la placa de vídeo, instalar los drivers de una placa nVidia, es tan sencillo como bajar el driver, elevar privilegios a root e instalar el archivo. Con la única excepción de que hay que pasarse a runlevel 3 (por lo menos) así que voy a explicar un poco este asunto
Los runlevel son, como su nombre lo indica, niveles de ejecución, es un estado en el que entra el sistema y se ejecutan distintas cosas según el nivel. En realidad no hay nada que defina los diferentes runlevels de una manera homogénea entre los distintos sistemas, pero si hay ciertas convenciones.
| Runlevel | Nombre | Descripción |
| 0 | Halt | Apaga el sistema |
| 1, S | Single user | No configura interfaces de red, inicia demonios ni permite logins que no sean root |
| 2 | Multi user | No configura interfaces de red ni inicia demonios |
| 3 | Muti user con Red | Inicia el sistema normalmente |
| 4 | No usado/Definido por el usuario | Especial |
| 5 | X11 | Como runlevel 3 + Interfaz grafica |
| 6 | Reboot | Reinicia el sistema |
Cuando se instalar un driver de vídeo es necesario pasar a runlevel 3 para detener la interfaz grafica, es decir, dejar de usar el driver de video.
En otra sección voy a explicar un poco mas este asunto.
Siguiendo con los drivers, por lo general se compilan los fuentes de los drivers, como esto lo explique en un tema anterior no lo voy a explicar de nuevo, excepto algunas cosas especiales.
Para poder compilar hacen falta las cabeceras del kernel (kernel-headers) de la versión de kernel que estemos usando, esto suele estar disponible en el CD/DVD de instalación y sino en algun repositorio, también se pueden usar los fuentes completos del kernel, pero hay que configurarlos y las cabeceras sirven lo mismo de bien.
También suele ser necesario que la versión del compilador (el GCC) sea la misma con la que se compilo el kernel, si no actualizaron el kernel ni el gcc, tienen que ser la misma versión.
Una vez hecho esto, hay que meter el driver (modulo) en el kernel, la ventaja de los módulos es que se pueden insertar o remover del kernel sin necesidad de reiniciar el sistema, así que podemos probar configuraciones distintas bastante rápido (a menos que sea un driver medio jodido que cuelgue el sistema)
Una vez compilado dicho driver, se genera un archivo con extensión ”ko” y por lo general se instalan en /lib/module
Estos archivos “ko” se cargan en el kernel con el comando insmod [archivo] aunque esta practica no suele ser la mejor, siempre es preferible hacerlo con modprobe [driver], la diferencia radica en la forma en la que trabajan, ya que modprobe suele tener en cuenta mas cosas, como dependencias del driver en cuestión, etc.
Para desinstalar un driver del kernel se usa el comando rmmod [driver], de mas esta decir que si se quita un driver en uso se puede provocar inestabilidad en el sistema.
Por ultimo, para ver que módulos están instalados actualmente en el kernel existe el comando lsmod.
De mas esta decir que todo este manejo de drivers requiere privilegios de root.
Hay ciertas situaciones, en las que el driver que bajamos e intentamos compilar/instalar es para reemplazar algun driver propio del kernel que no cumple su función como es debido.
Puede suceder que cuando instalamos el nuevo driver en el kernel, el anterior se rehúse a compartir el dispositivo, para esto antes habrá que hacer un rmmod, pero cuando reiniciamos el sistema volvemos a lo mismo, el driver anterior se cargo antes y el nuevo no se cargo.
Para esto, existen unos archivos de configuración que pasare a explicar. En /etc/modprobe.d existen archivos de configuración para los drivers que se cargan automáticamente e incluso cuales no se tienen que cargar bajo ningún punto de vista.
Estos archivos de configuración soportan varias opciones:
alias: permite asignarle un alias a un driver, por ejemplo, para acortar algun nombre largo. También puede hacer referencia a otro alias. Uso: alias [alias_nuevo] [driver]
options: pasa opciones al driver, algunos drivers soportan parámetros de configuración, normalmente no son necesarios, pero están si hacen falta. Uso: options [driver/alias] [opciones]
include: agrega un archivo al archivo actual, es útil para mantener un poco el orden. Uso: include [archivo]
blacklist: marca el driver para que no se cargue, como su nombre lo indica, lo pone en una lista negra. Uso: blacklist [driver]
Y por ultimo, pero no por eso menos importante, siempre antes de compilar/instalar un driver, lean las instrucciones, alguien se tomo el tiempo de escribirlas para que puedan hacer funcionar su hardware, así que lo menos que uno puede hacer es pegarles una ojeada, pueden contener instrucciones especiales sobre ese driver en particular.

