
Estoy migrando una regla udev existente que se vincula a la acción de cambio de un dispositivo de bloque y ejecuta un script determinado.
SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sr0", ACTION=="change", RUN+="/usr/local/bin/script"
En esta configuración, udev pasó las variables de entorno asociadas al dispositivo de hardware, como ID_CDROM_MEDIA-0
y ID_FS_LABEL
. Desde entonces, actualicé la regla udev para usar systemd para iniciar un servicio en el cambio de hardware.
SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sr0", ACTION=="change", TAG+="systemd", ENV{SYSTEMD_WANTS}=="drive-change.service"
El archivo de servicio systemd:
[Unit]
Description=changes to dvd drive
[Service]
Type=oneshot
ExecStart=/usr/local/bin/script
[Install]
WantedBy=multi-user.target
En este punto, el servicio se ejecuta en eventos de cambio, pero las variables de entorno pasadas por el comando RUN en udev no se pasan a la ejecución del servicio.
¿Es posible pasar el entorno de udev al entorno de ejecución de systemd o necesito pasar parámetros explícitamente?
Respuesta1
Si bien no encontré una manera de pasar el entorno de udev a systemd, es posible consultar la base de datos de udev para conocer las propiedades del entorno. Eludevadm info
dominiotiene los parámetros --query
y --export
que le permiten consultar solo las propiedades de un entorno e imprimirlas en un formato que pueda evaluarse.
Utilicé una combinación de variables de instancia de systemd y los udevadm
comandos para inicializar las variables de entorno.
SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sr0", ACTION=="change", TAG+="systemd", ENV{SYSTEMD_WANTS}=="drive-change@%E{DEVNAME}.service"
Esta regla udev ejecutará el siguiente archivo de servicio y pasará la DEVNAME
variable como una variable de instancia con el servicio.
[Unit]
Description=changes to dvd drive
[Service]
Type=oneshot
ExecStart=/usr/local/bin/script %I
[Install]
WantedBy=multi-user.target
Utilicé esta variable de instancia para evaluar las propiedades ambientales del elemento udev y resolví mi problema.
#!/bin/sh
# Systemd passes the DEVNAME as the first parameter to the script
eval $(udevadm info --query=env --export $1)
# The rest of the script that depends on the udev environment
...
Respuesta2
Para extender el granrespuestapor @Ben Campbell..
A continuación se explica cómo acceder a una propiedad desde la base de datos del entorno udev después de que un dispositivo activó la regla udev. Digamos, por ejemplo, que se acaba de conectar una unidad USB y desea obtener su etiqueta.
En el script ejecutado por el servicio systemd, después de la eval $(udevadm info --query=env --export $1)
línea, agregue algo como:
echo $ID_FS_LABEL >> "/tmp/file.txt"
De manera similar, podría obtener los valores para ID_PART_ENTRY_UUID
, ID_VENDOR
etc.