Übergeben von udev-Umgebungsvariablen an die Ausführung von systemd-Diensten

Übergeben von udev-Umgebungsvariablen an die Ausführung von systemd-Diensten

Ich migriere eine vorhandene Udev-Regel, die an die Änderungsaktion eines Blockgeräts gebunden ist und ein bestimmtes Skript ausführt.

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

In dieser Konfiguration übergab udev die dem Hardwaregerät zugeordneten Umgebungsvariablen wie ID_CDROM_MEDIA-0und ID_FS_LABEL. Ich habe die udev-Regel seitdem aktualisiert, um systemd zum Starten eines Dienstes bei der Hardwareänderung zu verwenden.

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

Die systemd-Servicedatei:

[Unit]
Description=changes to dvd drive

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

[Install]
WantedBy=multi-user.target

An diesem Punkt wird der Dienst bei Änderungsereignissen ausgeführt, aber die vom RUN-Befehl in udev übergebenen Umgebungsvariablen werden nicht an die Ausführung des Dienstes übergeben.

Ist es möglich, die Umgebung von udev an die Ausführungsumgebung von systemd zu übergeben oder muss ich Parameter explizit übergeben?

Antwort1

Obwohl ich keine Möglichkeit gefunden habe, die Umgebung von udev an systemd zu übergeben, ist es möglich, die udev-Datenbank nach den Umgebungseigenschaften abzufragen. Dieudevadm info Befehlverfügt über die Parameter --queryund --export, mit denen Sie nur Umgebungseigenschaften abfragen und in einem auswertbaren Format drucken können.

Ich habe eine Kombination aus systemd-Instanzvariablen und den udevadmBefehlen zum Initialisieren der Umgebungsvariablen verwendet.

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

Diese Udev-Regel führt die folgende Dienstdatei aus und übergibt die DEVNAMEVariable als Instanzvariable mit dem Dienst.

[Unit]
Description=changes to dvd drive

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

[Install]
WantedBy=multi-user.target

Ich habe diese Instanzvariable verwendet, um die Umgebungseigenschaften des udev-Elements auszuwerten und mein Problem zu lösen.

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

Antwort2

Zur Verlängerung der großenAntwortvon @Ben Campbell..

So greifen Sie auf eine Eigenschaft aus der Udev-Umgebungsdatenbank zu, nachdem ein Gerät die Udev-Regel ausgelöst hat. Nehmen wir beispielsweise an, dass gerade ein USB-Laufwerk angeschlossen wurde und Sie dessen Bezeichnung abrufen möchten.

Fügen Sie im vom systemd-Dienst ausgeführten Skript nach der eval $(udevadm info --query=env --export $1)Zeile etwas wie Folgendes hinzu:
echo $ID_FS_LABEL >> "/tmp/file.txt"

Auf ähnliche Weise können Sie die Werte für ID_PART_ENTRY_UUIDusw. ID_VENDORerhalten.

verwandte Informationen