Reconocimiento de un dispositivo USB por el sistema. Muchas veces tenemos un grave problema en Linux: Acabamos de conectar un disco externo USB (o un pen drive) y no sabemos cómo ha llamado el sistema a este dispositivo y tenemos que emplear cierto tiempo en poder montarle. Hoy en día, en el entorno gráfico, todas las distribuciones ya hacen accesibles los dispositivos USB de forma sencilla, de tal forma que tras conectar el dispositivo sólo hay que pinchar sobre un icono que nos aparece en el escritorio, o en una menú emergente, y tendremos acceso al dispositivo. Pero, ¿y si queremos que se monte siempre en un directorio que nosotros hemos creado a tal efecto? ¿Y si cuándo se monte queremos que se ejecute algún script que hemos creado, por ejemplo un backup? ¿Qué hacemos entonces? En un primer paso lo que hacemos es conectar el disco o pen-drive. En este momento tenemos que localizar el nombre que le acaba de dar el kernel. Para ello podemos teclear tail /var/log/messages o dmesg donde obtendremos que por ejemplo nuestro pen drive acaba de ser reconocido por el kernel y se le ha asignado el nombre sdb. En este momento buscamos la información del dispositivo, utilizando para ello el comando udevinfo: udevinfo -a -p /sys/block/sdb sustituiremos sdb por lo que nos haya salido. La información que obtenemos es muy amplia, nos debemos centrar en las líneas que “caracterizan” el dispositivo, como por ejemplo: ATTRS{rev}=="V44O" ATTRS{model}=="5DLAT80 ATTRS{vendor}=="HDT72252" " Es decir, este disco duro es el modelo 5DLAT80, del vendor HDT72252 con la rev V440. Con esta información ya podemos hacer muchas cosas. Ya sabemos que cada vez que nuestro kernel localice un dispositivo cuyo vendor es "HDT72252", el modelo es "5DLAT80 " y la revisión es "V44O", se está tratando de “este” disco duro que acabamos de instalar (u otro igual). Ahora lo que podemos hacer es indicar al sistema operativo qué hacer en el caso en el que reconozca a este dispositivo de nuevo, para ello editamos el fichero /etc/udev/rules.d/usb.rules NO hace falta que se llame así, tal cual, lo que es obligatorio es que esté en el directorio /etc/udev/rules.d y que el nombre acabe en .rules (ojo con el punto, es necesario. y escribimos algo así como: KERNEL=="sd*", SYSFS{vendor}=="HDT72252",SYMLINK+="datos%n" Es fácil entenderlo: El Kernel sabemos que le va a llamar sd-algo (de ahí que escribimos el asterisco), y con esto indicamos “fíjate cuando el kernel descubra un sd-algo”. A continuación le decimos que si el “vendor” (que ha salido del comando udevinfo, NO de la caja del disco, cuidado con esto), es HDT72252 (ojo con los espacios y todo esto, es mejor copiar desde las doble comillas hasta las doble comillas de la entrada del comando udevinfo y así no habrá equivocación) entonces llame a este dispositivo /dev/datos pero además queremos que las particiones se respeten, es decir, si hay tres particiones queremos que se cree /dev/datos1, /dev/datos2 y /dev/datos3 por eso escribimos SYMLINK+="datos %n" para que cree los tres enlaces simbólicos correspondientes (crea tres y no sólo uno porque hemos especificado %n, que crea tantos enlaces simbólicos como particiones vea, y en el orden que las ve). Si tuviéramos más discos con el mismo “vendor”, entonces podríamos añadir el modelo y la revisión con el fin de acotar qué nombre se da a cada dispositivo. Entonces ahora ya podemos escribir en nuestro fstab algo así como: /dev/datos1 /dev/datos2 /dev/datos3 /backup/1 /backup/2 /datos ext3 ext3 ext3 defaults defaults defaults 0 0 0 0 0 0 y ahora ya cada vez que pinchemos ese disco se montará correctamente, sin más, en el directorio que hemos indicado. En nuestro caso tenemos un disco duro usb externo con tres particiones formateadas como ext3, si tuviéramos menos o más particiones, y formateadas con otros sistemas, deberíamos cambiar con arreglo a nuestro caso el fichero fstab. Cada cosa que especifiquemos en la línea se tiene que cumplir. Si hay una sóla de las entradas que no se cumple, entonces no crea el enlace simbólico. ¿Y si queremos ejecutar algo cada vez que se conecte el dispositivo? Si queremos ejecutar por ejemplo nuestro programa script, que está en el directorio /directorio, lo que debemos hacer es continuar la línea escrita en el fichero .rules que hemos creado, con la sintaxis:RUN+="/directorio/script", es decir, en nuestro ejemplo quedaría: KERNEL=="sd*", SYSFS{vendor}=="HDT72252",SYMLINK+="datos%n", +="/directorio/script" RUN de tal forma que cada vez que conectáramos nuestro disco duro, el sistema operativo le asignaría el nombre /dev/datos, identificando con un número a cada una de las particiones, y además ejecutaría /directorio/script