
Estoy intentando configurar udev en RHEL7 para que a las unidades flash USB se les asignen nombres /dev específicos (es decir, /dev/backup1 , /dev/backup2....) para unidades flash específicas. Me doy cuenta de que no puedo controlar el / asignaciones dev/sdx pero estoy intentando configurar enlaces simbólicos automatizados usando reglas udev.
blkid me da:
/dev/sdi1: LABEL="Samsung USB" UUID="64A5-F009" TYPE="exfat"
/dev/sdj1: LABEL="Samsung USB" UUID="64A5-F009" TYPE="exfat"
/dev/sdk1: LABEL="Samsung USB" UUID="64A5-F009" TYPE="exfat"
Quería hacer algo como: en mi archivo de reglas
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/lib/udev/scsi_id --whitelisted --replace-whitespace --device=%N", RESULT=="64A5-F009", SYMLINK+="backupkeya%n"
pero como las tres unidades flash USB tienen el mismo uuid, quería que unidades flash específicas se vincularan a nombres de dispositivos virtuales específicos. Entonces, si conecto el que tiene la etiqueta "unidad2", se vinculará a /dev/backupkeyb. En este momento tenemos 3 unidades flash, pero queremos ampliarlas a unas 8.
udevadm me da algo de singularidad...
[root@alpha2 mnt]# udevadm info /dev/sdg | grep "ID_SERIAL_SHORT"
E: ID_SERIAL_SHORT=0305119070014252
[root@alpha2 mnt]# udevadm info /dev/sdi | grep "ID_SERIAL_SHORT"
E: ID_SERIAL_SHORT=0330219070015017
[root@alpha2 mnt]# udevadm info /dev/sdj | grep "ID_SERIAL_SHORT"
E: ID_SERIAL_SHORT=0305119070014208
Cambié mi regla udev para leer (/etc/udev/rules.d/99-symlink.rules)
KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/bin/udevadm info --name=%N", RESULT=="0305119070014208", SYMLINK+="backupkeyc%n"
sin embargo, cuando conecté la clave que tenía el número de serie ...4208, no se creó ningún enlace simbólico /dev/backupkeyc. Sospecho que es porque el resultado de la declaración udevadm no coincidía exactamente con mi RESULTADO ==
Creé un script /usr/local/udevinfo y cambié PROGRAM=="/usr/local/udevinfo %N" como se muestra a continuación para no saturar la regla udev... después de colocar la unidad flash, sin enlace simbólico, pero lo más importante es que no había nada en /tmp/passeddata que debería haber contenido el nombre del dispositivo, por lo que parece que la regla udev nunca se ejecutó.
echo "$1" >> /tmp/passeddata
udevadm info --name=$1 | grep "ID_SERIAL_SHORT" | awk -F= '{print $2}'
¿Me estoy perdiendo algo? ¿Alguna forma más fácil de hacer lo que estoy tratando de hacer?
Respuesta1
Sí, no era una coincidencia exacta, porque 'udevadm info' genera una gran cantidad de información, no solo el número de serie.
Sin embargo, todo lo que vea en 'udevadm info' esestablecido porlas propias reglas de udev (a menudo invocando elementos integrados de udev). Por lo tanto, el número de serie ya se puede utilizar ENV{ID_SERIAL_SHORT}=="..."
sin tener que llamar a un programa externo. (Eso es lo que realmente indica el prefijo "E:").
KERNEL=="sd*", SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="0305119070014208", SYMLINK+="backupkeyc"
(De hecho, es posible que 'udevadm info' no funcioneen absolutodurante el procesamiento de reglas. Un error común en las reglas de udev es intentar usar herramientas que a su vez solo obtienen información de las señales de "reglas terminadas").
Respuesta2
Estoy totalmente de acuerdo con la respuesta de @grawity de no utilizar un script para dicha solución sino directamente el entorno. Pero para los otros aspectos:
La sintaxis del programa es correcta de esa manera. Tú escribiste y funciona. ¿Quizás quiere decir que no hay nada en el archivo que no se cree? Entonces, ¿falta la línea shebang (como en su fragmento) o permisos de ejecución? De lo contrario, debería funcionar de esa manera - Y Ni siquiera necesita pasar ningún argumento ya que toda la información que conoce udev está disponible en el entorno como variables. Por lo tanto, el script puede acceder a ellos cuando lo llama la instrucción PROGRAM de la regla udev.
Pero debería ser mucho más conveniente y genérico seguir un enfoque diferente:
no utilice los números de serie del dispositivo, sino asígneles un UUID o una etiqueta de partición (o ambos para reducir la probabilidad de que se inserte cualquier otra cosa que tenga el mismo UUID o etiqueta de partición). ). Así que simplemente vuelva a etiquetar las particiones o formatéelas para establecer un nuevo "UUID". También es posible parchear la información UUID dentro de la partición existente si no desea reformatear (no conozco ninguna herramienta que haga esto por usted, pero es muy sencillo escribir la suya propia).
De esa manera podría reemplazar los objetivos sin modificar su sistema. O añadir más palos a una piscina, por ejemplo.
En ese caso, incluso podría preferir utilizar un pequeño script de PROGRAMA que traduzca la etiqueta de partición de un formato específico a un nombre de enlace simbólico de un formato específico.
Otra forma (si es factible, la más estándar) podría ser usar un GPT en los dispositivos y asignar algún tipo de partición específico y una combinación -UUID para su caso de uso, posiblemente un nombre de partición adicional.