
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-0
und 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 --query
und --export
, mit denen Sie nur Umgebungseigenschaften abfragen und in einem auswertbaren Format drucken können.
Ich habe eine Kombination aus systemd-Instanzvariablen und den udevadm
Befehlen 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 DEVNAME
Variable 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_UUID
usw. ID_VENDOR
erhalten.