Come creare un target systemd?


16

Dopo aver cercato in abbondanza attraverso molti post, video di Youtube e "documentazione" sulla questione di systemd, sono ancora in perdita.

Il link ( https://wiki.archlinux.org/index.php/systemd#Create_custom_target ) sembrava promettente, ma era un po 'vago (per me).

Domanda

Come si potrebbe creare un target di sistema personalizzato (IE: foo.target) in modo che si possa avviare con unità .service selezionate?

Esempio

  1. Il sistema avvia default.target (link simbolico di "foo.target")
  2. "foo.target" avvia solo un server X barebone e un programma GUI, ad esempio "gvim".

Motivo

Sto semplicemente cercando di creare un obiettivo personalizzato per l'avvio rapido di un programma X. Sarei bello escludere tutti i servizi di cui non ho bisogno.

Grazie in anticipo!

Risposte:


16

Leggendo man 5 systemd.unite man 5 systemd.targetci dice che i file di unità vengono utilizzati per definire obiettivi e tutto il resto systemd. Non esiste alcuna documentazione specifica su come creare un target , quindi è difficile determinare come dovrebbe essere fatto, ma non è troppo diverso dalla creazione di un servizio.

Quando crei la tua destinazione, dovrai creare collegamenti simbolici alla target.wantsdirectory dalla directory dei servizi di systemd. Quindi è possibile impostare / avviare il target. Ecco come potrebbe apparire il tuo esempio.

/etc/systemd/system/foo.target

Questo è il file di unità della destinazione. Se graphical.target è preso come esempio, possiamo creare il nostro target utilizzandolo come base.

[Unit]
Description=Foobar boot target
Requires=multi-user.target
Wants=foobar.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target
AllowIsolate=yes

Spiegare le opzioni prese dalle manpage di systemd;

  • Description- Descrive il bersaglio. Dovresti capire
  • Requires- Dure dipendenze del bersaglio. Dovresti avviare il sistema di base prima di avviare i tuoi servizi
  • Wants- Dipendenze morbide. Il target non richiede che questi vengano avviati.
  • Conflicts - Se un'unità ha un'impostazione Conflitti su un'altra unità, l'avvio della prima interromperà la seconda e viceversa.
  • After - Si avvia dopo questi servizi
  • AllowIsolate- Davvero a te e al tuo ambiente. I dettagli sono disponibili nella manpagesystemd.unit(5)

/etc/systemd/system/foo.target.wants/

Questa è la directory in cui collegherai i servizi creati / richiesti per il tuo target. È equivalente Wants=all'opzione nel file di unità. Creare questa directory e quindi creare collegamenti simbolici in questo modo; ln -s /usr/lib/systemd/system/bar.service /etc/systemd/system/foo.target.wants/bar.service. Questo crea un collegamento simbolico da bar.service nella directory di sistema alla directory foo.target.wants.


Penso che la creazione di un file unitario per un servizio esca dall'ambito di questa risposta e che la domanda sia decisamente più documentata, quindi per ora lo tralascio. Quando si crea il file di unità, è sufficiente collegarlo alla directory target.wants o aggiungerlo alla Wants=direttiva.


Ho seguito quanto sopra per creare un nuovo obiettivo e ho aggiunto alcuni obiettivi al mio servizio. Tuttavia, nessuno di questi servizi è avviato da systemd. Esiste un esempio completo che dimostra che i servizi all'interno del target appena aggiunto funzionano?
linuxfan,

1
Vedi lo stack post di necromancer se stai cercando semplici passaggi per impostare un servizio personalizzato da eseguire all'avvio.
Pilbox

@linuxfan Aggiungo foo.targetal Requirescampo e al Beforecampo di multi-user.target, e piace Requires: base.target foo.target. Dopodiché riavvio Arch Linux vm e foobar.servicefunzionerò automaticamente come demone.
L_K,

2
Bella risposta, ma in realtà non sembra funzionare come ti aspetteresti. 1. Solo perché è nel bisogno non significa che il servizio inizierà con quell'obiettivo. 2. Il multi-user.target sembra avere una sorta di cose nascoste che lo fanno funzionare.
Otheus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.