Quirks del kernel Linux

Lo primero, ¿sabes lo que es un “quirk“?  Según el traductor, tiene varias acepciones como capricho o peculiaridad. Es esta última acepción de la que vamos a hablar.

Linux tiene código “quirk” (peculiaridades) para ciertos dispositivos concretos.

Esto se debe a que hay muchos dispositivos que aunque tienen funcionalidades en común, incorporan “peculiaridades” que deben ser tratadas para explotar al máximo el dispositivo. Un ejemplo claro son los teclados con teclas multimedia o esos joysticks enormes que se emplean en los simuladores de vuelo.

Os voy a poner un ejemplo con un dispositivo de interfaz-humana (HID) al que vamos a intercambiar la funcionalidad de dos de sus teclas.

Como sabéis, cada dispositivo USB tiene asociado un par de códigos que representan un código unívoco de producto (identificador de fabricantes e identificador de producto). Cuando un dispositivo HID USB se conecta al sistema, el kernel busca si tiene asociado algún quirk, y si procede, aplica el “remapeo” de eventos.

Un fragmento de hid-belkin.c para un teclado Belkin.


static int belkin_input_mapping(struct hid_device ∗ hdev, struct hid_input ∗ hi, struct hid_field ∗ field, struct hid_usage ∗ usage,unsigned long ∗ ∗ bit, int  max)
{
unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);

    if ((usage >hid & HID_USAGE_PAGE) != HID_UP_CONSUMER || !(quirks & BELKIN_WKBD))
          return 0;
    switch (usage >hid & HID_USAGE) {
          case 0x03a: belkin_map_key_clear(KEY_SOUND);
          case 0x03b: belkin_map_key_clear(KEY_CAMERA);
          case 0x03c: belkin_map_key_clear(KEY_DOCUMENTS);
          default:
          return 0;
    }
    return 1;
}

¿es fácil de entender no? El código “mapea” tres eventos distintos a los códigos de kernel correspondientes a las teclas KEY_SOUND, KEY_CAMERA y KEY_DOCUMENTS.
Esta función de “mapeo” se ejecuta después de que la función “probe” del driver sea positiva y se haya obtenido la tabla de usos del dispositivo USB HID.
Dicha función de “mapeado” se aplica para cada uno de los códigos que reporte el dispositivo. Si os fijáis, cuando se produce un intercambio el código de retorno es 0.
Se devuelve 1 si no hay alteración (como puede ser el caso de la tecla ‘a’).

Si tenéis curiosidad veréis en que en todo el kernel hay numerosos “quirks” a todos los niveles.

 

[Tip] Cambiar contraseña en GNU/Linux de cualquier usuario

Tener acceso físico a un sistema GNU/Linux supone tener acceso a toda la información (salvo que esté encriptado el disco duro) de un usuario.

Se puede cambiar tanto la contraseña del administrador, root, como la de cualquier otro usuario.

Para cambiar la contraseña del root, basta indicarle a nuestro gestor de arranque (GRUB, LILO, etc) que queremos arrancar el sistema en modo single.

En este modo no se arranca casi ningún servicio (y mucho menos entorno gráfico) y al finalizar el arranque aparece directamente un prompt de sistema (sin pedir ni usuario ni contraseña). El acceso al modo single se consigue añadiendo una “s” a las opciones de arranque del kernel.

Usando grub (el gestor de arranque por defecto en Ubuntu), sería algo así:


kernel		/boot/vmlinuz-2.6.28-18-generic root=UUID=6f6aee6e-e301-4794-9676-8f1312b0ff75 ro quiet splash s

Una vez dentro, basta con ejecutar lo siguiente:


passwd

Introducimos la nueva contraseña y listo.

Si en vez de querer cambiar la contraseña de root, queremos cambiar la de otro usuario, sólo hay que añadir el usuario como argumento a passwd.


passwd <user>

Este tip puede ser útil en caso de olvido de contraseña.

Nota: Ubuntu suele instalar un modo “a prueba de fallos” en la lista de kernels a usar. Yo prefiero usar una shell, pero puede venir bien para usuarios inexpertos.

Translate to:English
MenefanteMenéame TwitterTwitter

[Tip]: Liberar espacio en GNU/Linux

Os traigo un “mini” tip.

Posiblemente alguna vez os habéis encontrado en la situación de tener poco espacio libre en disco. Aquellos users que venga de Windows XP (o “superior”) saben que había una utilidad que permite liberar espacio.

En GNU/Linux como tal no existe utilidad parecida. Algunas distros si tienen aplicaciones para tal tarea pero no se han convertido en estándar de facto. Además, en la mayoria de los casos requiere instalar uno o varios paquetes, lo cual choca con el hecho de querer liberar espacio.

Hay una solución más sencilla y que no requiere de más búsquedas y/o instalaciones: find.

Esta utilidad es muy útil porque puede buscar ficheros según muchos criterios. En el caso que nos ocupa, yo suelo especificar una búsqueda de ficheros “grandes”  (más de 50 megas) y posteriormente paso a su eliminación (si procede).

Os dejo con la sintaxis, ¡que aproveche! 🙂

 find ~ -size "+50M" 

Translate to:English
MenefanteMenéame TwitterTwitter

Exportar e importar firmas digitales en GNU/Linux

Firma digital

Firma digital

Ando liado con trámites tributarios.

La firma digital es una de esas cosas de la tecnología que te hace preguntar: ¿cómo hemos podido vivir sin esto? Puede parecer una exageración, pero el hecho de poder hacer trámites de la Agencia Tributaria o de asuntos relacionados con tu ayuntamiento desde el PC de tu casa, no tiene precio. No tienes que pedir horas en tu trabajo, no haces colas, es muy rápido e indoloro. La pega que tiene es el soporte técnico. Tiene un soporte horrible. A pesar de haber cursado asignaturas en la carrera donde se ven los certificados, firmas y demás engendros digitales, tengo que reconocer que me cuesta un poco tanto “palabroto” técnico (X.509, PKCS12, PEM, etc). No quiero imaginar a mi madre haciendo esto.

El asunto es que ayer probé a usar mi firma digital y comprobé que estaba caducada (tenia que haberla renovado por la propia web meses antes de que caducara). Era necesario volver a solicitar una nueva. El proceso es sencillo:

  1. Entras en la web de CERES y solicitas un certificado de usuario (no sé como irá el tema de los DNIe)
  2. Te piden el NIF y te generan un código que tienes que guardar.
  3. Es necesario que te presentes con el DNI en la oficina más cercana que expida firmas digitales (hay un buscador que calcula la más cercana a tu dirección).
  4. Te presentas en la oficina, enseñas el código, el DNI y firmas el contrato de adhesión.
  5. Vuelves a tu casa, te conectas a la web de CERES y especificando tu DNI y el código previamente asignado, ¡voila! el certificado se instala en tu equipo.

El proceso anterior es la teoría. En la práctica hay una letra pequeña que cuando se lee ya es tarde. Cuando vuelves de firmar el contrato y pinchas en la opción de descarga, aparece un párrafo que dice: “El certificado se descargará en el navegador y PC con el que solicitó el certificado“. El gráfico “Uppss” aparece en mi cabeza: “PC el de siempre…, navegador web… Google Chrome Beta para GNU/Linux“. Por supuesto, Chrome todavía no está preparado para gestionar este tipo de certificados personales. La cuestión es que, aún sabiendas de que posiblemente no iba a funcionar, pulsé en “Descargar“. Ni el puntero del ratón se movió. Indagando un poco en cómo gestiona Chrome los certificados, me doy con una utilidad muy potente, certutil.

Resulta que Chrome guarda los certificados bajo la ruta ~/.pki/nssdb/ en varios ficheros que suelen ser bases de datos SQLite3.

Uno de los cometidos de certutil es mostrar los certificados que existen en esa base de datos. Para ser exacto, esta línea me mostró todos los certificados

certutil -L -d sql:~/.pki/nssdb 

Qué sorpresa me lleve cuando comprobé que la última línea correspondía con mi certificado personal. Resultó que cuando le di a descargar el certificado, Chrome lo guardo ahí.

Genial. Si el certificado está ahí, seguro que puedo exportarlo e importarlo en Firefox (que sí esta soportado). ¿Cómo?

Después de buscar un poco, encontré una opción para exportar certificados para LDAP que usaba la utilidad pk12util.

El nombre de esta utilidad viene del formato de documento, PKCS12, se trata simplemente de una forma de codificar un certificado digital que contiene tu clave pública y privada mediante una contraseña para que nadie te pueda usurpar. Era necesario por tanto establecer una contraseña y guardarla en un archivo (por ejemplo, /tmp/clave”). La sintaxis que usé para exportar mi certificado fue:

 pk12util -d sql:~/.pki/nssdb -n "<nombre-certificado-mostrado-por-certutil>" -o <nombre-fichero-salida>.p12  -w /tmp/clave -k /tmp/clave 

El mensaje de salida fue: pk12util: PKCS12 EXPORT SUCCESSFUL

Faltaba la prueba de fuego: ¿funcionará en Firefox?¿cargará por fin la Oficina Virtual?

Podéis imaginar que sí 🙂

Firefox, después de solicitarme la clave que especifiqué en “/tmp/clave”, importó sin problemas el certificado y la oficina virtual por fin entró.

No sé si este post servirá para alguien o no. Por lo menos dejó registró en la web por si algún día necesito recurrir a estos comandos (ya sabéis eso de volver a tropezar con la misma piedra).

He obviado algunos detalles sobre la importación y solicitud de firma digital. En la Web hay bastante información al respecto. No obstante, si teneis dudas, preguntad 🙂

ACTUALIZACIÓN:

La versión 10.0.648 (y posterior) de Chrome soporta ya la gestión de  certificados.

Translate to:English
MenefanteMenéame TwitterTwitter

[Tip] Direcciones IPs virtuales

Direcciones IP virtuales

Direcciones IP virtuales

Seguramente sabréis que la dirección IP es una entidad lógica y que la dirección MAC es un identificador hardware único asociado a un dispositivo.

Esto quiere decir que, si tenéis una tarjeta de red, ésta tendrá una dirección MAC puesta por el fabricante (tipo: XX-XX-XX-YY-YY-YY) y una dirección IP asignada a mano o mediante DHCP.

En GNU/Linux es posible asociar múltiples direcciones IPs a una única interfaz de red. A esto se le conoce como interfaces virtuales. Se usa principalmente para poder acceder a diferentes redes IP simultáneamente.

El procedimiento es sencillo, supongamos que actualmente nuestra NIC eth0 tiene la dirección 192.168.1.10/24 y queremos poder comunicarnos con la red 10.10.10.x/24 usando la dirección IP 10.10.10.10. Basta con la siguiente línea:

 sudo ifconfig eth0:1 10.10.10.10 

Podemos añadir más interfaces virtuales sólo modificando el ethX:Y, donde X es la interfaz e Y el numero de dirección virtual.

Espero que si os encontrais en esta situación, os sirva este tip 🙂

P.D. Sé que en Windows es posible tener interfaces virtuales, pero nunca se ha presentado la necesidad.

Translate to:English
MenefanteMenéame TwitterTwitter

Análisis y desarrollo de un driver para Xorg: EloTouch (I)

Análisis y desarrollo de driver para Elo Touch

Análisis y desarrollo de driver para Elo Touch

EloTouch es una empresa que se dedica a la fabricación de pantallas táctiles.

No tengo queja de su hardware. Sus controladores tienen interfaz serie y/o USB. Particularmente me gusta más el controlador USB debido a que existe un perfil HID que recoge este tipo de periférico y GNU/Linux tiene un driver HID que no funciona mal.

El caso es que recientemente he tenido que desarrollar un driver para una pantalla resistiva de EloTouch que funciona bajo GNU/Linux con Xorg.

La motivación viene de la necesidad de poder asociar un controlador touch a una pantalla (screen) determinada. De este modo podemos tener un escritorio extendido con dos monitores, cada uno de ellos con una interfaz táctil. Tanto los monitores como los controladores de touch están conectados a una misma CPU.

El fabricante tiene un driver (bastante tedioso de instalar) que no contempla esta posibilidad: asociar un controlador a un screen arbitrario.

Lo primero que se me vino a la mente fue buscar un driver GPL que cumpliera con este requisito.

Para “mi sorpresa” encontré en el repositorio de Xorg, los siguientes drivers:

La estructura de ambos es muy parecida y para mi asombro sí que implementan la funcionalidad que demandaba.

¿funcionarán con mi controlador?

No hubo suerte. Ni uno ni otro funcionaba a pesar de establecer la configuración tal y como describía la documentación asociada.

No queda más remedio que hacer mi propio driver.

Leer más de esta entrada

El Show de GNU/Linux

The Linux Show

The Linux Show

Hoy estoy en plan retro.

Posiblemente mucho ya conoceréis  “El Show de Linux” (no es nada nuevo).

Para los que no, os cuento.

El “Linux Show” es un show llevado a cabo de forma magistral por Xavier de Blas.

Xavier de Blas es doctor en INEF y un amante del S.L. Es un crack de los malabares y aprovecha ésta y otras habilidades para crear una exhibición sobre GNU/Linux y su entorno.

Yo tuve ocasión de verlo durante el 3º encuentro anual de dinamizadores del proyecto GuadalInfo en Cádiz (año 2006).

Todo el mundo se quedó con la boca abierta.

He estado buscando más información sobre Xavier y su show pero parece que Google lo ha mandado al olvido (creo que empezó a realizar el show en el 2003).

Lo importante de este show para mí es que se lo podría poner a mi abuela y entendería lo que es GNU/Linux y el software libre.

La afirmación anterior es una exageración, pero no he visto otra forma mejor de introducir GNU/Linux al público general.

Me gustaría poder poner un enlace con la exhibición completa, pero no existe (sólo pequeños fragmentos no significativos).

Os dejo lo único “decente” que he podido encontrar:

Espero que algún día Xavier suba su excelente show a la Red (o si alguien sabe dónde está que lo diga).

Translate to:English
MenefanteMenéame TwitterTwitter