Передача переменных среды udev в выполнение службы systemd

Я переношу существующее правило udev, которое связано с действием изменения блочного устройства, и запускает данный скрипт.

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

В этой конфигурации udev передал переменные среды, связанные с аппаратным устройством, такие как ID_CDROM_MEDIA-0 а также ID_FS_LABEL, С тех пор я обновил правило udev, чтобы использовать systemd для запуска службы при смене оборудования.

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

Файл службы systemd:

[Unit]
Description=changes to dvd drive

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

[Install]
WantedBy=multi-user.target

На этом этапе служба запускается при событиях изменения, но переменные среды, передаваемые командой RUN в udev, не передаются в выполнение службы.

Можно ли передать среду от udev в среду выполнения systemd или мне нужно явно передать параметры?

2 ответа

Решение

Хотя я не нашел способа передать среду от udev в systemd, можно запросить в базе данных udev свойства среды. udevadm info Команда имеет как --query а также --export параметры, которые позволяют запрашивать только свойства среды и выводить их в формате, который можно оценить.

Я использовал комбинацию переменных экземпляра systemd и udevadm команды для инициализации переменных среды.

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

Это правило udev выполнит следующий служебный файл и передаст DEVNAME переменная как переменная экземпляра со службой.

[Unit]
Description=changes to dvd drive

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

[Install]
WantedBy=multi-user.target

Я использовал эту переменную экземпляра для оценки свойств среды элемента udev и решил мою проблему.

#!/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
 ...

Чтобы расширить отличный ответ @Ben Campbell..

Ниже описано, как получить доступ к свойству из базы данных среды udev после того, как устройство активировало правило udev. Скажем, например, только что был подключен USB-накопитель, и вы хотите получить его метку.

В скрипте, запускаемом службой systemd, послеeval $(udevadm info --query=env --export $1)строку, добавьте что-то вроде:
echo $ID_FS_LABEL >> "/tmp/file.txt"

Аналогичным образом вы можете получить значения дляID_PART_ENTRY_UUID,ID_VENDORи т. д..

Другие вопросы по тегам