Wie richte ich einen systemd-Dienst ein, der von einem Benutzer ohne Rootberechtigung als Benutzerdämon gestartet werden soll?

20

Ich habe gerade die Installation und Einrichtung von systemd auf meinem Arch-Linux-System abgeschlossen (2012.09.07). Ich habe deinstalliert initscripts(und die Konfigurationsdateien entfernt).

Ich möchte einen Dienst erstellen, der von einem Benutzer ohne Rootberechtigung gestartet und gestoppt werden kann. Der Dienst soll eine getrennte Bildschirmsitzung starten, in der rtorrent ausgeführt wird. Ich möchte jedoch, dass jeder Benutzer auf dem System, der diesen Dienst gestartet (aktiviert) hat, eine bestimmte Instanz speziell für ihn startet. Wie würde man das machen?

Ich erinnere mich, dass ich gelesen habe, dass systemd Benutzerinstanzen von Diensten unterstützt, jedoch keine Informationen darüber gefunden habe, wie dies einzurichten ist oder ob es sich auf das bezieht, was ich suche.

Servicedatei, die ich für das System verwendet habe:

[Unit]
Description=rTorrent

[Service]
Type=forking
ExecStart=/usr/bin/screen -d -m -S rtorrent /usr/bin/rtorrent
ExecStop=/usr/bin/killall -w -s 2 /usr/bin/rtorrent

UPDATE 1 :

Nachdem ich hier und hier die Manpages durchgelesen habe , verstehe ich, wie systemd ein bisschen besser funktioniert. Insbesondere ermöglicht die Verwendung der Optionen User=und WorkingDirectory=, dass der Dienst in einer Benutzersitzung gestartet wird. Allerdings bleibt die Frage nach wie vor , dass der Benutzer selbst kann nicht start, stop, enable, oder disableder Service. Ein Fehler, bei dem der Zugriff verweigert wird, wird von gegeben systemctl.

UPDATE 2 :

Zunächst habe ich zur Vereinfachung und zur besseren Nutzung der (noch unvollständigen) Benutzersitzungsfunktion von systemd die Benutzer-Sitzungseinheiten von sofar verwendet und seine Konfigurationsanweisungen befolgt.

Es scheint, dass es in der aktuellen Version von DBus (1.6.4-1) einen Fehler gibt, bei dem die Umgebungsvariable nicht gesetzt wird, DBUS_SESSION_BUS_ADDRESSwas bedeutet, dass die systemctl --userBefehlsfehler ausgegeben werden mit:

Failed to get D-Bus connection: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11

Die Variable sollte folgendermaßen aussehen:

DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/USERUID/dbus/user_bus_socket"

Dabei muss USERUID die UID des angegebenen Benutzers sein.

Hans
quelle
Mir ist klar, dass man eine separate Servicedatei pro Benutzer erstellen und einfach aktivieren kann. Ich möchte jedoch nur wissen, ob es möglich sein könnte, wie ich es oben beschrieben habe.
Hans
Fairerweise könnte ich die Einrichtung sudofür die Benutzer vereinfachen und sie, wie in meinem Kommentar oben erwähnt, ihre eigene Servicedatei steuern lassen. Mit dieser Lösung kann der Benutzer jedoch auch die meisten anderen Dienste steuern ...
Hans
Wenn Sie die sudoDokumentation von sudoers (5) gelesen hätten, wäre dies nicht der Fall. Sudoers (5) enthält viele Beispiele zur Einschränkung der Argumente eines Befehls.
Grawity

Antworten:

19

Mit systemd können normale Benutzer normalerweise keine Systemdienste starten. Zwar wird das Gewähren von Zugriff über das Polkit unterstützt, doch fehlt dieser Teil noch etwas, und Sie können noch nicht nur einen bestimmten Dienst zulassen.

Da es sich bei rtorrent eigentlich nicht um einen Systemdienst handelt und Sie möchten, dass jeder Benutzer eine eigene Instanz von rtorrent hat, sollten Sie mit dem "Benutzer" -Modus von systemd experimentieren.

Wenn Sie sich anmelden, startet das System eine user@<uid>.serviceSystemeinheit für Sie, die eine separate "--user" -Instanz von systemd startet. Das neue Benutzersystem liest Unit-Dateien (beginnend mit default.target) von ~/.config/systemd/user/, /etc/systemd/user/und /usr/lib/systemd/user/.

Grawity
quelle
1
Dank grawity, das hat mir im Grunde gefehlt. Es hat sich jedoch auch als DBus-Problem herausgestellt: Es scheint einen Fehler in dbuse zu geben, der nicht die richtige globale Variable DBUS_SESSION_BUS_ADDRESSfür einen bestimmten Benutzer festlegt, sodass systemctl nicht auf die Benutzersitzung zugreifen kann. Sobald ich dieses kleine Problem herausgefunden habe, funktioniert alles andere wunderbar!
Hans