Passando variáveis de ambiente do udev para a execução do serviço systemd

4

Estou migrando uma regra do udev existente que se liga à ação de alteração de um dispositivo de bloco e executa um determinado script.

SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sr0", ACTION=="change", RUN+="/usr/local/bin/script"

Nesta configuração, o udev transmitiu as variáveis de ambiente associadas ao dispositivo de hardware, como ID_CDROM_MEDIA-0 e ID_FS_LABEL . Desde então, atualizei a regra do udev para usar o systemd para iniciar um serviço na alteração de hardware.

SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sr0", ACTION=="change", TAG+="systemd", ENV{SYSTEMD_WANTS}=="drive-change.service"

O arquivo de serviço do systemd:

[Unit]
Description=changes to dvd drive

[Service]
Type=oneshot
ExecStart=/usr/local/bin/script

[Install]
WantedBy=multi-user.target

Neste ponto, o serviço é executado em eventos de mudança, mas as variáveis de ambiente passadas pelo comando RUN no udev não são passadas para a execução do serviço.

É possível passar o ambiente do udev para o ambiente de execução do systemd ou eu preciso passar parâmetros explicitamente?

    
por Ben Campbell 06.06.2015 / 19:25

1 resposta

2

Embora eu não tenha encontrado uma maneira de passar o ambiente do udev para o systemd, é possível consultar o banco de dados do udev para as propriedades do ambiente. O comando udevadm info tem os parâmetros --query e --export que permitem consultar apenas um propriedades do ambiente e imprimi-las em um formato que possa ser avaliado.

Eu usei uma combinação de variáveis de instância systemd e os comandos udevadm para inicializar as variáveis de ambiente.

SUBSYSTEM=="block", ENV{DEVNAME}=="/dev/sr0", ACTION=="change", TAG+="systemd", ENV{SYSTEMD_WANTS}=="drive-change@%E{DEVNAME}.service"

Esta regra do udev executará o seguinte arquivo de serviço e transmitirá a variável DEVNAME como uma variável de instância com o serviço.

[Unit]
Description=changes to dvd drive

[Service]
Type=oneshot
ExecStart=/usr/local/bin/script %I

[Install]
WantedBy=multi-user.target

Eu usei essa variável de instância para avaliar as propriedades do ambiente do elemento udev e resolvi meu 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
 ...
    
por 08.06.2015 / 08:00