Mapeo persistente de dispositivos USB en Linux

Actualmente los sistemas operativos son capaces de detectar y montar dispositivos para poder ser usados por el usuario a través del sistema, haciendo que estos dispositivos conectados al sistema sean accedidos de manera transparente.

En Linux cuando conectamos cualquier dispositivo como un dispositivo USB, el sistema lo mapea automáticamente como un terminal en "/dev". El dispositivo aparece con el prefijo "tty" más un identificador del tipo de conexión que implementa a nivel de hardware el dispositivo (USB, ACM, S, ...) y un número que numera los distintos dispositivos del mismo tipo. Para ver los dispositivos que tiene conectados y mapeados en "/dev" ejecuta los siguientes comandos:

cd /dev   # Movernos a /dev
ls   # Listar elementos del directorio

Debido a que el nombre del mapeo de cualquier dispositivo depende de los dispositivos que haya conectados previamente al sistema operativo, puede resultar complicado automatizar procesos que dependen de dispositivos que pueden ser conectados y desconectados en caliente (mientras el sistema operativo está encendido). Para solucionar el problema vamos a realizar un re-mapeo sobre el mapeo automático que hace el sistema.

Lo primero que hay que identificar es el IDVENDOR y IDPROUDCT del dispositivo que queremos mapear de manera persistente. El IDVENDOR es un número que identifica al fabricante del dispositivo y el IDPRODUCT es otro número que identifica al producto del vendedor. Con estos dos valores, suele ser suficiente para mapear unívocamente dispositivos (a no ser que tengamos varios dispositivos idénticos conectados 🙁 , pero eso también tiene solución 😉 ). Para listar los dispositivos y ver ambos valores ejecuta "lsusb":

lsusb
# Result
Bus 001 Device 004: ID 0846:9041 NetGear, Inc. WNA1000M 802.11bgn [Realtek RTL8188CUS]
Bus 001 Device 005: ID 16d0:0856 MCS 
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Detectar cuál es el dispositivo es tan fácil como hacer "lsusb" antes de conectar el dispositivo  y volver a hacer "lsusb" con el dispositivo conectado. El valor del IDVENDOR es el valor comprendido entre el ID y los dos puntos, y el IDPRODUCT el valor comprendido entre los dos puntos y el primer espacio en blanco.

Si necesitamos mapear varios dispositivos de un mismo producto que son de un mismo fabricante, repetiremos el mismo proceso pero listando los puertos conectados y mapedados en "/dev" para conocer el mapeo que le asigna el sistema (ver primer snippet de código) y procederemos a ejecutar el siguiente comando para conocer el el valor SERIAL del dispositivo:

udevadm info -a -n /dev/ttyXXX | grep '{serial}' | head -n1
# Resultado
ATTRS{serial}=="XXXXXXXX"

Donde ttyXXX puede ser ttyUSB0, ttyUSB1, ttyUSB2 ..., ttyACM0, ttyACM1, ttyACM2 ..., ttyS0, ttyS1, ttyS2 ... El valor que nos devuelve de SERIAL es un identificador único para el dispositivo conectado.

Con esta información vamos a crear unas reglas para que al conectar el dispositivo nos realice el mapeo de manera persistente y estática de los dispositivos conectados. Para ello vamos a definir unas reglas UDEV en el siguiente directorio "/etc/udev/rules.d", creando el fichero "99-usb-serial.rules":

sudo nano 99-usb-serial.rules

El fichero lo crearemos con la siguiente estructura si queremos mapear un dispositivo de acuerdo a un un fabricante y producto:

SUBSYSTEM=="tty", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", SYMLINK+="nombre_mapeo_1"
SUBSYSTEM=="tty", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", SYMLINK+="nombre_mapeo_2"
...

Si además necesitas diferencia diversos dispositivos de un mismo fabricante, añade el serial del dispositivo:

SUBSYSTEM=="tty", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", ATTRS{serial}=="XXXXXXXX", SYMLINK+="nombre_mapeo_1"
SUBSYSTEM=="tty", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", ATTRS{serial}=="XXXXXXXX", SYMLINK+="nombre_mapeo_2"
...

Deberemos completar los valores "XXXX" con la información que hemos recogido en los pasos anteriores y guardamos haciendo CTRL+O y salimos con CTRL+X.

El fichero de reglas que hemos definido crea enlaces simbólicos que apuntan a las direcciones de acceso de los dispositivos y dichos enlaces simbólicos siempre apuntarán al dispositivo que hemos definido.

Si tras generar el fichero de reglas, no se realiza el mapeo que hemos definido, prueba conectar y desconectar el dispositivo, o a reiniciar el sistema. Os aparecerá en "/dev" un enlace simbólico con el nombre que hayáis definido en "SYMLINK+"

A la hora de usar estos mapeos desde scripts de Linux, debeís usar el comando:

readlink -f [symbolic_link]

De esta forma se obtiene la ruta completa a donde apunta el enlace simbólico y podremos programar scripts de manera más transparente, gracias al mapeo, el cual  nos generará un enlace simbólico persistente al dispositivo que conectemos.

 





8422 Visitas Totales 6 Visitas para Hoy

One response on “Mapeo persistente de dispositivos USB en Linux

Deja un comentario