Pasar variables de entorno udev a la ejecución del servicio systemd

Pasar variables de entorno udev a la ejecución del servicio systemd

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-0y 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 --queryy --exportque 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 udevadmcomandos 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 DEVNAMEvariable 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_VENDORetc.

información relacionada