Wie schreibe ich einen systemd-Dienst, der von einem vorhandenen Gerät abhängt?

8

Ich möchte einen systemd-Dienst schreiben, der davon abhängt, ob ein USB-WLAN-Dongle vorhanden ist. Es muss nicht gestartet werden, wenn das Gerät angeschlossen ist, solange es nicht gestartet wird, wenn das Gerät nicht angeschlossen ist. Wie kann ich dies erreichen?

Die Systemd-Konfigurationsdatei hat das Format network @ .conf. Es verwendet den %iPlatzhalter. Also habe ich versucht, dies zur Unit-Datei hinzuzufügen:

[Path]
PathExists = /dev/%i

Wo %iwäre so etwas wlan0. Leider wird dies völlig ignoriert, sodass ich die ordnungsgemäße Verwendung dieses Abschnitts möglicherweise nicht verstehe.

Ich habe auch versucht:

[Unit]
....
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device

Ich habe es irgendwo abgeholt (ich habe vergessen, wo), und das funktioniert auch nicht.

agtoever
quelle

Antworten:

7

Sie müssen udev und systemd kombinieren .

Fügen Sie eine neue Regel für udev in /etc/udev/rules.d/95-mywifi.rules wie folgt hinzu:

 ACTION=="add", ATTRS{idVendor}=="...", ATTRS{idProduct}=="...", SYMLINK=="mywifi", TAG+="systemd", ENV{SYSTEMD_WANTS}="[email protected]"

(Sie müssen die Punkte durch die für Ihren Dongle geeigneten Lieferanten- und Produktcodes ersetzen.)

Der vorhandene netctl-auto @ .service ist:

  # cat /lib/systemd/system/netctl-auto\@.service 
  [Unit]
  Description=Automatic wireless network connection using netctl profiles
  Documentation=man:netctl.special(7)
  BindsTo=sys-subsystem-net-devices-%i.device
  After=sys-subsystem-net-devices-%i.device
  Before=network.target
  Wants=network.target

  [Service]
  ExecStart=/usr/bin/netctl-auto start %I
  ExecStop=/usr/bin/netctl-auto stop %I
  RemainAfterExit=yes
  Type=forking

  [Install]
  WantedBy=multi-user.target

Damit dies funktioniert, müssen Sie ein netctl- Profil einrichten. Informationen dazu finden Sie im Arch Linux-Wiki .

MariusMatutiae
quelle
Gibt es eine Möglichkeit, dies für einen WLAN-Dongle zu tun, ohne die Hersteller- und Produkt-IDs kennen zu müssen?
1
@bvukelic Ja: ACTION == "add", SUBSYSTEM == "net", KERNEL == "wlan [1-9]", SYMLINK == "mywifi", TAG + = "systemd", ENV {SYSTEMD_WANTS} = "netctl [email protected] ". Dies setzt voraus, dass Sie ein integriertes WLAN namens wlan0 haben. In diesem Fall wird nichts unternommen, sowie USB-WLAN-Dongles, die von wlan1 bis wlan9 aufgerufen werden. Wenn Sie keine WLAN-Karte an Bord haben, ändern Sie [1-9] in [0-9]
MariusMatutiae
Vielen Dank für sehr detaillierte Anweisungen. Ich werde das morgen testen.
Ich habe nicht genug Repräsentanten, um die akzeptierte Antwort zu kommentieren, und ich weiß, dass dies ein bisschen nekrotisch ist, aber um die Antwort zu erweitern: Ich habe eine Arbeitsregel basierend auf MariusMatutiaes: ACTION == "add", SUBSYSTEM == " net ", KERNEL ==" wlan [1-9] ", TAG + =" systemd ", ENV {SYSTEMD_WANTS} =" netctl-auto@$name.service "Ich bin mir nicht sicher, ob es besser ist, aber ich würde es denken, weil Es wird kein Symlink verwendet.
Gdunstone