2016-03-31 7 views
1

Ich habe einen Server, der beim Systemstart mit einem Yocto-kompatiblen Dateisystem auf einem eingebetteten Ziel gestartet wird. Das Dateisystem verwendet systemd für sein Dienstsystem.Wie aktiviert man eine System-Unit-Vorlage für die Boot-Zeit-Ausführung?

Mein Server verwendet eine Systemd-Vorlage Unit-Datei, und ich habe Probleme, es aktiviert zu bekommen. Wir verwenden die Vorlage, um den vollständigen Pfadnamen einer SQLite-Datenbankdatei anzugeben, die der Server verwendet. Die Vorlage Einheit-Datei benannt wird:

/lib/systemd/system/[email protected] 

Sein Inhalt:

[Unit] 
    Description=Data Server application (with DB=%I) 
    After=syslog.target 
[Service] 
    Type=simple 
    ExecStart=/opt/ndc/DataServer --DEBUG --databaseFile=%I 
    Restart=always 
    RestartSec=2 
[Install] 
    WantedBy=multi-user.target 

Die Datenbankdatei ist in /var/lib/ndc/DataServer.DB, so habe ich einen symbolischen Link in/lib/systemd/system:

# ln -s [email protected] [email protected] 

Wenn ich laufen:

# systemctl start [email protected] 

Der Server wird mit dem richtigen Parameter gestartet, sucht die Datenbank und wird erwartungsgemäß im Hintergrund ausgeführt. Also habe ich versucht die Dienstvorlage zu aktivieren, so dass es den Dienst während des Systemstarts Zeit starten wird:

# systemctl enable [email protected] 
    Failed to execute operation: No such file or directory 

Da das nicht gelang, habe ich versucht damit die Vorlagendatei selbst:

# systemctl enable [email protected] 
    ln -s '/lib/systemd/system/[email protected]''/etc/systemd/system/multi-user.target.wants/[email protected]' 

Auf der Oberfläche scheint das System zufrieden zu sein, aber Systemd führt den Bootvorgang von TDI_DataServer nicht korrekt aus. Es scheint, den "multi-user" -Parameter (vielleicht von dem WantedBy-Ziel in der Maßeinheitsdatei?) Zur Maßeinheitsdatei zu liefern. Hier

ist der systemctl Status:

$ systemctl status -l TDI* 
    ● [email protected] - Data Server application (with DB=multi/user) 
     Loaded: loaded (/lib/systemd/system/[email protected]; enabled) 
     Active: activating (auto-restart) (Result: signal) since Sat 2000-02-05 20:41:05 UTC; 1s ago 
     Process: 2951 ExecStart=/opt/ndc/DataServer --DEBUG --databaseFile=%I (code=killed, signal=ABRT) 
    Main PID: 2951 (code=killed, signal=ABRT) 

    Feb 05 20:41:05 mityomapl138 DataServer[2951]: [949783265:2047] NOTICE: per-conn mem: 136 + 2140 headers + protocol rx buf 
    Feb 05 20:41:05 mityomapl138 DataServer[2951]: [949783265:2056] NOTICE: Listening on port 4243 
    Feb 05 20:41:05 mityomapl138 systemd[1]: [email protected]: main process exited, code=killed, status=6/ABRT 
    Feb 05 20:41:05 mityomapl138 systemd[1]: Unit [email protected] entered failed state. 
    Feb 05 20:41:05 mityomapl138 DataServer[2951]: 2000:02:05 20:41:05: WSServer connected on socket tcp://localhost:5556 
    Feb 05 20:41:05 mityomapl138 DataServer[2951]: 2000:02:05 20:41:05: bound to socket inproc://clients 
    Feb 05 20:41:05 mityomapl138 DataServer[2951]: 2000:02:05 20:41:05: DatabaseWorker using database multi/user 
    Feb 05 20:41:05 mityomapl138 DataServer[2951]: unable to open database file 
    Feb 05 20:41:05 mityomapl138 DataServer[2951]: terminate called after throwing an instance of 'SQLite::Exception' 
    Feb 05 20:41:05 mityomapl138 DataServer[2951]: what(): unable to open database file 

● TDI_DataServer.service 
     Loaded: loaded (/etc/init.d/TDI_DataServer) 
     Active: inactive (dead) 

bin ich etwas fehlt? Jede Hilfe würde sehr geschätzt werden.

+0

Hinweis: Wenn ich meinen eigenen symbolischen Link in das Verzeichnis /etc/systemd/system/multi-user.target.wants mit dem Namen "TDI_DataServer @ - var-lib-ndc-DataServer.DB.service ", alles funktioniert gut. Es ist nur, dass "systemctl enable" das für mich tun soll – f1fan44

Antwort

2

Es scheint tatsächlich ein Fehler in der systemctl-Analyse des Parameters% I vorhanden zu sein, der an die Unit-Datei übergeben wurde. Wie oben erwähnt, schlägt der folgenden Befehl ein:

# systemctl enable [email protected] 

Allerdings, wenn ich den Namen unserer Datenbank-Datei in/var/lib/NDC von „DataServer.DB“ auf „DataServer.db“ (dh Klein ändern nach dem Punkt), und ich geben Sie den folgenden Befehl ein:

# systemctl enable [email protected] 

... alles funktioniert. Der symbolische Link wird in /etc/systemd/system/multi-user.target.wants erstellt, und beim nächsten Neustart des Systems findet unser DataServer-Dienst seine Datenbank und läuft glücklich.

Ich habe unseren Drittanbieter Dateisystemanbieter darüber informiert. Es ist wahrscheinlich etwas, das die Leute bei Yocto und die Betreuer von systemd interessieren würden.

+0

Ich denke, ein Teil des Problems ist hier das Alter des Systems in Frage. Ihr Beispiel hat lokal auf meiner Fedora 23 Installation funktioniert, aber Yocto/Daisy (1.6.3) ist ziemlich alt und somit ist die Systemunterstützung ziemlich alt. Um es herum zu arbeiten, wie Sie gefunden haben, ist wahrscheinlich die beste Lösung für dieses spezielle Problem. –

0

Statt

# systemctl enable [email protected] 

versuchen

# systemctl enable [email protected] 

Ich weiß, dass die aktuellen systemd unterstützt entweder, aber ich nehme an, dass Sie irgendwann mit dem .service Teil explizit sein musste und das ist, was Du rennst hier rein. Zu sagen, auf welcher Yocto-Version das Dateisystem basiert, würde hier helfen, danke!

+0

Ich habe bereits versucht, den ".service" an den Gerätenamen anzuhängen, aber ich bekomme immer noch die "Fehlgeschlagene Operation auszuführen: Keine solche Datei oder Verzeichnis" Nachricht. Wir bekommen das Dateisystem von einer dritten Partei - ich versuche, die Yocto-Version zu finden, auf der es basiert. – f1fan44

+0

Das Dateisystem basiert auf Yocto poky daisy (1.6.3). – f1fan44