Vyhledávání na webu

Jak vytvořit a spustit nové servisní jednotky v Systemd


Před pár dny jsem narazil na 32bitové distro Centos 8 a pocítil jsem touhu otestovat ho na starém 32bitovém stroji. Po nabootování jsem si uvědomil, že má chybu a ztrácí připojení k síti, které jsem musel pokaždé po startu ručně „nahoru“. Otázka tedy zněla, jak mohu nastavit skript provádějící tuto práci, spuštěný při každém spuštění počítače?

No, to je velmi jednoduché a já vám ukážu systémový způsob pomocí servisních jednotek. Nejprve ale malé představení servisních jednotek.

V tomto článku vysvětlím, co je to „servisní jednotka“ v systemd a jak snadné je ji vytvořit a spustit. Pokusím se zjednodušit, co jsou „cíle“, proč jim říkáme „kolekce jednotek“ a jaké jsou jejich „chce“. Nakonec využíváme servisní jednotku ke spuštění vlastního skriptu po zaváděcí proceduře.

Je zřejmé, že váš počítač je užitečný díky službám, které nabízí, a aby měl tuto funkcionalitu, musí být mnoho služeb nazýváno při startu počítače a dosahuje různých úrovní.

Další služby jsou volány, aby byly spuštěny, když počítač dosáhne například úrovně záchrany (úroveň běhu 0) a další služby, když dosáhne úrovně pro více uživatelů (úroveň běhu 3). . Tyto úrovně si můžete představit jako cíle.

Jednoduše řečeno, target je soubor servisních jednotek. Pokud se chcete podívat na servisní jednotky běžící na vaší úrovni graphical.target, zadejte:

systemctl --type=service

Jak můžete vidět, některé služby jsou aktivní a „běžící“ neustále, zatímco jiné se spouštějí jednorázově a ukončí se (ukončí).

Pokud chcete zkontrolovat stav služby, můžete použít příkaz systemctl, jak je znázorněno.

systemctl status firewalld.service

Jak vidíte, zkontroloval jsem stav firewalld.service (tip: pro název služby můžete použít automatické doplňování ). Informuje mě, že služba firewalld je neustále spuštěna a je povolena.

Povoleno a zakázáno znamená, že služba bude nebo nebude trvale načtena při příštím spouštění. Na druhou stranu spuštění a zastavení služby má omezení aktuální relace a není trvalé.

Pokud například zadáte:

systemctl stop firewalld.service
systemctl status firewalld.service

Můžete vidět, že firewalld.service je neaktivní (mrtvá), ale je stále povolená, což znamená, že při příštím spouštění bude načtena. Pokud tedy chceme, aby se služba v budoucnu načítala během bootování, musíme ji povolit. Jaký skvělý závěr! Pojďme si jeden vytvořit, je to snadné.

Pokud přejdete do složky:

cd /etc/systemd/system
ls -l

Můžete vidět některé soubory odkazů jednotkových služeb a některé adresáře “požadavek“ cíle. Například to, co chce víceuživatelský cíl načíst, když spouštěcí procedura dosáhne své úrovně, je uvedena v adresáři s názvem /etc/systemd/system/multi-user.target.wants/ .

ls multi-user.target.wants/

Jak vidíte, neobsahuje pouze služby, ale také další cíle, což jsou také kolekce služeb.

Vytvořme servisní jednotku s názvem connection.service.

vim connection.service

a zadejte následující (stisknutím “i “ pro režim vkládání), uložte jej a ukončete (pomocí “esc “ a “:wq! “):

[Unit]
Description = making network connection up
After = network.target

[Service]
ExecStart = /root/scripts/conup.sh

[Install]
WantedBy = multi-user.target

Pro vysvětlení výše uvedeného: vytvořili jsme jednotku typu služby (můžete také vytvořit jednotky cílového typu) a nastavili jsme, aby se načítala za network.target (můžete pochopit, že bootovací procedura dosáhne cílů s definovaným pořadím) a chceme pokaždé, když služba začne provádět bash skript s názvem conup.sh, který se chystáme vytvořit.

Zábava začíná u poslední části [instalovat]. Říká, že to bude chtít “multi-user.target “. Pokud tedy povolíme naši službu, ve složce multi-user.target.wants se vytvoří symbolický odkaz na tuto službu! Mám to? A pokud to zakážeme, bude odkaz smazán. Tak jednoduché.

Stačí to povolit a zkontrolovat:

systemctl enable connection.service

Informuje nás, že byl vytvořen symbolický odkaz ve složce multi-user.target.wants. Můžete potvrdit spuštěním příkazu ls, jak je znázorněno.

ls multi-user.target.wants/

Jak můžete vidět, „connection.service“ je připravena na další spuštění, ale nejprve musíme vytvořit soubor skriptu.

cd /root
mkdir scripts
cd scripts
vim conup.sh

Přidejte následující řádek do Vimu a uložte jej:

#!/bin/bash
nmcli connection up enp0s3

Příkaz nmcli pro vyvolání síťového připojení pro rozhraní enp0s3.

Samozřejmě, pokud chcete, aby váš skript spouštěl něco jiného, můžete místo druhého řádku napsat, co chcete.

Například,

#!/bin/bash
touch /tmp/testbootfile

to by vytvořilo soubor ve složce /tmp (jen pro kontrolu, že vaše služba funguje).

Skript také musíme provést spuštěním příkazu chmod, jak je znázorněno.

chmod +x conup.sh

Nyní jsme připraveni. Pokud nechcete čekat do dalšího spuštění (je již povoleno), můžeme spustit službu pro aktuální relaci zadáním:

systemctl start connection.service

Voila! Moje připojení funguje!

Pokud jste se rozhodli zapsat do skriptu příkaz “touch /tmp/testbootfile “, jen abyste zkontrolovali jeho funkčnost, uvidíte tento soubor vytvořený ve složce /tmp .

Opravdu doufám, že vám pomůžu zjistit, o jaké služby, požadavky, cíle a spouštění skriptů během spouštění jde.