systemd (Suomi)
Lainattu ja suomennettu projektin sivulta:
- systemd on Linuxille luotu kokonaisuus systeemin peruspalikoista. Se tarjoaa järjestelmän ja palvelumanagerin ja toimii PID:llä 1 ja lähtee suorittamaan järjestelmän muita osasia. Systemd tarjoaa agressiivisen rinnastus kyvyn, käyttää socketin ja D-Bus aktivointia palvelujen käynnistämiseen, mahdollistaa tarvittaessa taustaprosessien käynnistämisen, pitää kirjaa prosesseista jotka käyttävät Linuxin control groups, ylläpitää mounttaus ja automounttaus paikkoja ja implementoi toiminallisen riippuvuuksiin perustuvan hallinta logiikan. systemd tukee SysV ja LSB:n init skriptejä ja alkujaan toimii korvaavana ratkaisuna sysvinitille. Toisaalta systemd:stä löytyy myös loggaus palveluprosessi, apuvälineitä hallitsemaan perus järjestelmän konfigurointia kuten verkkotunnus, päivämäärä,paikalliset asetukset, listattuna käyttäjien sisäänkirjautumiset ja käytetyt virtuaalikoneet, järjestelmä tilit, ajoajan järjestelmäpolut sekä asetukset ja taustaprosessit yksinkertaisille verkko konfiguraatioille, verkon ajan tahdistus, kirjauksien siirrot ja nimiresoluutio.
Perus systemctl:n käyttö
Päällimmäinen komento jolla voidaan tutkiskella ja hallita systemd:tä on systemctl. Jotain hyötyjä tällä on järjestelmän tilan tutkiminen ja järjestelmän sekä palvelujen hallitseminen. Katso systemctl(1) löytääksesi enemmän tietoa liittyen sen käyttöön.
- Voit käyttää kaikkia seuraavia systemctl komentoja käyttämällä
-H user@host
kytkintä hallitsemaan systemd instanssia etäkoneesta. Tämä käyttää SSH tunnelia yhdistämään etänä systemd instanssiin. - Plasma:n alla on mahdollista asentaa systemd-kcmAUR graafisena tulkkina systemctl:lle. Asennuksen jälkeen moduuli löytyy System administration:in alta.
Järjestelmävaiheen analysointi
Näet järjestelmän tilan komennolla:
$ systemctl status
Listaa käynnistetyt yksiköt:
$ systemctl
tai:
$ systemctl list-units
Listaa kaatuneet yksiköt:
$ systemctl --failed
Saatavilla olevat yksikkötiedostot (eng. unit file) ovat nähtävissä poluissa /usr/lib/systemd/system/
ja /etc/systemd/system/
(viimeineen vaatii oikeuksia polun lukemiseen). Listaa asennetut yksikkötiedostot komennolla:
$ systemctl list-unit-files
Näytä cgroup slice, muisti ja isäntä PID:ille:
$ systemctl status pid
Yksiköiden käyttö
Yksiköitä voi olla esim. palvelut (.service), mounttaus paikat (.mount), laitteet (.device) tai socketit (.socket).
Kun systemctl:ää halutaan käyttää, joudut usein määrittelemään kokonaisuudessa koko yksikkötiedoston nimen, mukaanlukien sen loppuliitteen, esim. sshd.socket
. Siitä huolimatta on olemassa muutamia lyhyitä muotoja kun tarkennetaan yksikköä kuten seuraavissa systemctl komennoissa on:
- Jos loppuliitettä ei tarkenneta, systemctl olettaa .service. Esim.
netctl
janetctl.service
tulkitaan samana. - Mounttaus paikat automaattisesti käännetään oikeaan muotoon .mount yksikkö. Esim. antamalla
/home
on sama kuinhome.mount
. - Samalla tavalla kuin mounttaus paikat, laitteet automaattisesti käännetään muotoon .device yksikkö, siksipä antamalla
/dev/sda2
on sama kuindev-sda2.device
.
Löydät aiheesta yksityiskohtaisesti systemd.unit(5).
@
merkin (esim. muotoa name@string.service
): tällöin nämä ovat instansseja template yksiköstä, minkä todellinen tiedosto nimi ei sisällä string
osaa (esim. muotoa name@.service
). string
on mitä kutsutaan instanssi tunnisteeksi, ja on samanlainen komennon kanssa joka annetaan template yksikölle kun sitä kutsutaan systemctl komennolla: yksikkötiedostossa se korvautuu %i
tarkenteella.
Tarkemmin sanottuna, ennen kuin systemd yrittää toteuttaa name@.suffix
template yksikön, se yrittää etsiä yksikköä samalla name@string.suffix
tiedosto nimellä, vaikkakin tälläinen "yhteenotto" tapahtuu harvoin, esim. suurin osa yksikkötiedostoista jotka sisältää @
merkin ovat tarkoitettu template yksiköksi. Jos template yksikköä kutsutaan ilman instanssi tunnistetta, kutsu yksinkertaisesti epäonnistuu, koska %i
tarkennetta ei pystytä korvaamaan.- Suurin osa seuraavista komennoista toimii myös vaikka useampi yksikkö on annettu tarkennukseksi, kato systemctl(1) lisäinformaatiolle.
-
--now
kytkintä voidaan käyttää yhdessäenable
,disable
, jamask
kanssa vastaavasti käynnistää, lopettaa, tai naamioida yksikkö välittömästi kuin vastaisuudessa vasta uudelleen käynnistäessä. - Paketti saattaa tarjota yksikköjä eri tarkoituksiin. Jos olet juuri asentanut paketin,
pacman -Qql paketti | grep -Fe .service -e .socket
voidaan käyttää tarkistamaan ja löytämään nämä yksiköt.
Statuksen tarkistaminen
Manuaali eri yksiköistä (mikäli yksikkö sitä tukee) voidaan näyttää komennolla:
$ systemctl help yksikkö
Status yksiköstä, silloinkin jos se ei ole sillä hetkellä toiminnassa näytetään komennolla:
$ systemctl status yksikkö
Tarkistaaksesi mikäli yksikkö on aktivoitu ja sen toiminta on sallittu:
$ systemctl is-enabled yksikkö
Käynnistäminen, uudelleen käynnistys ja uudelleen lataaminen
Käynnistä yksikkö välittömästi:
# systemctl start yksikkö
Lopeta yksikön toiminta välittömästi:
# systemctl stop yksikkö
Käynnistä uudelleen yksikkö:
# systemctl restart yksikkö
Uudelleen lataa yksikkö ja sen konfiguraatio:
# systemctl reload yksikkö
Uudelleen lataa systemd managerin konfiguraatio, jolla skannataan uusia tai muutettuja yksikköjä:
# systemctl daemon-reload
Aktivointi
Aktivoi yksikkö käynnistymään heti bootatessa:
# systemctl enable yksikkö
Aktivoi yksikkö käynnistymään heti bootatessa ja käynnistä se välittömästi:
# systemctl enable --now yksikkö
Deaktivoi yksikkö käynnistymästä bootatessa:
# systemctl disable yksikkö
Naamiointi
Naamioi yksikkö tehdäksesi käynnistämisestä mahdotonta (manuaalisesti sekä riippuvuutena, mikä tekeekin naamioinnista vaarallisen):
# systemctl mask yksikkö
Paljasta yksikkö:
# systemctl unmask yksikkö
Virran hallinta
polkit on tarpeellinen virranhallinnalle epäoikeutettuna käyttäjänä. Jos olet lokaalissa systemd-logind käyttäjä sessiossa ja mikään muu sessio ei ole aktiivinen, seuraavat komennot toimivat ilman root-oikeuksia. Jos näin ei ole (esim. jos joku toinen käyttäjä on kirjautuneena tty:hyn), systemd kysyy automaattisesti root salasanaa.
Sammuttaminen ja uudelleen käynnistys järjestelmälle:
$ systemctl reboot
Sammuta ja sammuta järjestelmästä virta:
$ systemctl poweroff
Lakkauta järjestelmä:
$ systemctl suspend
Laita järjestelmä taukotilaan:
$ systemctl hibernate
Laita järjestelmä hybridiuni tilaan:
$ systemctl hybrid-sleep
Yksikkötiedostojen kirjoittaminen
Systemd:n syntaksi yksikkötiedostoissa (systemd.unit(5)) on saanut inspiraationsa XDG Desktop Entry Specification .desktop tiedostoista, joka taas on saanut inspiraationsa Microsoft Windows .ini tiedostoista. Yksikkötiedostot ladataan useista sijainneista (nähdäksesi täyden listan, suorita systemctl show --property=UnitPath
terminaalissa), mutta tärkeimmät ovat (listattuna pienimmästä suurimpaan arvojärjestyksessä):
-
/usr/lib/systemd/system/
: yksiköt tarjoaa asennetut paketit -
/etc/systemd/system/
: yksiköt jotka järjestelmän valvoja on asentanut
- Latauspolut ovat täysin erilaiset kun suoritetaan systemd käyttäjä tilassa.
- systemd yksiköiden nimet voivat sisältää vain ASCII alfanumeerisia kirjaimia, alleviivauksia ja pisteitä. Kaikki muut kirjaimet täytyy korvata C-tyylisillä "\x2d" koodinvaihtomerkeillä tai antaa näiden ennaltamäärätyillä semantiikoilla ('@', '-'). Katso systemd.unit(5) ja systemd-escape(1) lisäinformaatiolle.
Kannattaa katsoa pakettien asentamia yksiköitä esimerkiksi. Lisää löytyy myös täältä systemd.service(5) § EXAMPLES.
#
voidaan myös käyttää yksikkötiedostoissa, mutta vain uusilla riveillä. Rivin jälkeen annetut kommentit systemd parametreissä johtaa siihen ettei yksikkö aktivoidu.Riippuvuuksien käsittely
Systemd:llä riippuvuuksia pystytään ratkomaan suunnittelemalla yksikkötiedostot oikein. Kaikkein tyypillisin tapaus on, kun yksikkö A vaatii yksikköä B käynnistymään ennen yksikköä A. Siinä tapauksessa lisää Requires=B
ja After=B
[Unit]
-osaan A:ta. Jos riippuvuus on vapaaehtoinen, lisää sen sijaan Wants=B
ja After=B
. Huomaa ettei Wants=
ja Requires=
vastaa After=
, tarkoittaen siis sitä jos After=
ei ole tarkennettu, nämä kaksi yksikköä käynnistetään rinnakkain.
Riippuvuuksia on yleensä asetettu palveluihin eikä kohteisiin. Esimerkiksi mikä tahansa palvelu joka konfiguroi verkkoyhteyden rajapinnan, nostaa network.target
jonka takia omien yksiköiden suorittaminen sen jälkeen on riittoisa sillä network.target
on käynnissä jo muutenkin.
Palvelu tyypit
Käytettävissä on useita käynnistys tyyppejä, joista voi harkita itse sopivaa käynnistystapaa kirjottaessa omaa palvelu tiedostoa. Tämä asetetaan Type=
parametrilla [Service]
osassa:
-
Type=simple
(oletus): systemd käynnistää palvelun välittömästi. Tämä prosessi ei saa haarukoita muihin osasiin. Älä käytä tätä käynnistystapaa mikäli kyseinen palvelu vaatii muiden palveluiden kutsumista, ellei palvelu ole suoritinkannan aktivointi. -
Type=forking
: systemd käynnistää palvelun kun prosessi haarukoituu muihin osasiin ja isäntä prosessi lopettaa toimintansa. Tyypillisille taustaprosesseille tämä on varmin vaihtoehto, ellet tiedä sen olevan tarpeeton. Kannattaa myös määrittääPIDFile=
, jotta systemd voi seurata pääprosessia. -
Type=oneshot
: tämä on hyödyllinen skripteille, jotka tekevät yhden asian ja lopettavat toimintansa. Voit myös haluta asettaaRemainAfterExit=yes
, jotta systemd tulkitsee tämän palvelun aktiiviseksi vielä sen jälkeen kun prosessi on oikeasti lopettanut toimintansa. -
Type=notify
: identtinenType=simple
kanssa, mutta vain siinä tapuksessa kun taustaprosessi lähettää signaalin systemd:lle ollessaan valmis. Viittauksen tähän toteutukseen tulee libsystemd-daemon.so:sta. -
Type=dbus
: palvelu on valmis kunBusName
ilmestyy DBus:sin järjestelmäväylässä. -
Type=idle
: systemd viivästyttää palvelun binäärien suorittamista kunnes kaikki työt on saatu toimintaan. Muutoin tämä käynnistystapa vastaaType=simple
.
Katso systemd.service(5) § OPTIONS manuaali yksityiskoihtaisemmasta selityksestä liittyen Type
arvoihin.
Valmiiden yksiköiden muokkaaminen
Välttääksesi ristiriitoja pacman:in kanssa, pakettien mukana tulevia yksikkötiedostoja ei saisi suoraan muokata. On olemassa kaksi turvallista tapaa muokata yksikköä koskematta alkuperäiseen tiedostoon: luo uusi yksikkötiedosto, joka kirjoittaa edellisen yli tai luo drop-in pätkä, joka tulee alkuperäisen päälle. Molemmissa tapauksissa yksikkö täytyy ladata uudestaan saadaksesi muutokset käyttöön. Tämä voidaan tehdä joko muokkaamalla yksikköä systemctl edit
(joka lataa yksikön uudestaan automaattisesti) tai lataamalla kaikki yksiköt uudestaan komennolla:
# systemctl daemon-reload
- Voit käyttää systemd-delta nähdäksesi minkä yksikkötiedostojen yli on kirjoitettu tai laajennettu ja tarkalleen mitä muutoksia on tehty.
- Käytä
systemctl cat yksikkö
nähdäksesi yksikön sisällön ja kaikki siihen liittyvät drop-in pätkät.
Korvaavat yksikkötiedostot
Korvataksesi yksikkötiedoston /usr/lib/systemd/system/yksikkö
, luo tiedosto /etc/systemd/system/yksikkö
ja uudelleen aktivoi yksikkö päivittämään symlinkit:
# systemctl reenable yksikkö
Vaihtoehtoisesti, suorita:
# systemctl edit --full yksikkö
Tämä avaa /etc/systemd/system/yksikkö
muokkaus ohjelmassa (kopioimalla asennetun version jos se ei ole olemassa) ja automaattisesti lataa sen kun olet valmis muokkauksen kanssa.
Drop-in tiedostot
Luodaksesi drop-in tiedostoja yksikkötiedostoille /usr/lib/systemd/system/yksikkö
, luo polku /etc/systemd/system/yksikkö.d/
ja aseta .conf tiedostot sinne kirjoittaaksesi tiedostojen yli tai lisätäksesi lisää vaihtoehtoja. systemd jäsentää sekä asettaa nämä tiedostot alkuperäisen yksikön päälle.
Helpoin tapa on suorittaa komento:
# systemctl edit yksikkö
Tämä avaa tiedoston /etc/systemd/system/yksikkö.d/override.conf
tekstin käsittely ohjelmassa (luoden sen jos tarpeellista) ja automaattisesti lataa yksikön kun olet muokannut tiedoston.
Conflicts=
korvaava tiedosto on tarpeellinen.Palauta toimittajan versioon
Palauttaaksesi tehdyistä muutoksista joihin on käytetty systemctl edit
käytä komentoa:
# systemctl revert yksikkö
Esimerkkejä
Jos haluat yksinkertaisesti lisätä vaihtoehtoisen riippuvuuden yksikölle, voit mahdollisesti luoda seuraavan mukaisen tiedoston:
/etc/systemd/system/yksikkö.d/customdependency.conf
[Unit] Requires=uusi riippuvuus After=uusi riippuvuus
Vaihtaaksesi ExecStart
direktiivin yksikölle, joka ei ole tyyppiä oneshot
, luo seuraavan mukainen tiedosto:
/etc/systemd/system/yksikkö.d/customexec.conf
[Service] ExecStart= ExecStart=uusi komento
Huomaa kuinka ExecStart
pitää tyhjentää ennenkuin se voidaan uudelleenasettaa [1]. Sama pätee jokaiselle komponentille, joka pitää määrittää useaan kertaan esim. OnCalendar
ajastimille.
Vielä yksi esimerkki palvelun automaattisesta uudelleen käynnistämisestä:
/etc/systemd/system/yksikkö.d/restart.conf
[Service] Restart=always RestartSec=30
Kohteet
systemd käyttää kohteita (englannin target) yksiköiden kokoamiseen yhdeksi ryhmäksi riippuvuuksien välityksellä ja yhdenmukaistettuina synkronointi kohtina. Ne hoitavat samoja asioita kuin ajotasot, mutta käyttäytyvät erilailla.
Hae nykyiset kohteet
Seuraavaa tulisi käyttää systemdn alla, sen sijaan kuin ajotasona runlevel
:
$ systemctl list-units --type=target
Kartoittaminen SysV ajotason ja systemd kohteiden välillä
SysV Ajotaso | systemd Kohde | Huomiot |
---|---|---|
0 | runlevel0.target, poweroff.target | Pysäytä järjestelmä. |
1, s, single | runlevel1.target, rescue.target | Yhden käyttäjän tila. |
2, 4 | runlevel2.target, runlevel4.target, multi-user.target | Käyttäjän määrittelemät/Sivu kohtaiset ajotasot. Oletukselta identtinen 3 kanssa. |
3 | runlevel3.target, multi-user.target | Monikäyttäjä, ei-graafinen. Käyttäjät voivat yleensä kirjautua sisään useammasta konsolista tai verkon kautta. |
5 | runlevel5.target, graphical.target | Monikäyttäjä, graafinen. Sisältää yleensä kaikki palvelut ajotaso 3:sta sekä graafisen sisään kirjautumisen. |
6 | runlevel6.target, reboot.target | Uudelleen käynnistys |
emergency | emergency.target | Hätätila komentotulkki |
Vaihda nykyinen kohde
systemd:ssä tavoitteet voidaan paljastaa target yksiköiden avulla. Niitä voidaan muuttaa seuraavasti:
# systemctl isolate graphical.target
Tämä muuttaa vain sen hetkisen tavoitteen, ja sillä ei ole vaikutusta seuraavassa käynnistyksessä. Tämä on yhtäläinen komentojen telinit 3
tai telinit 5
kanssa Sysvinit:issä.
Vaihda oletus kohde johon käynnistetään
Oletus tavoite on default.target
, joka on symlinkki tavoitteelle graphical.target
. Tämä suunnilleen vastaa vanhaa ajotasoa 5.
Varmistaaksesi vanhan tavoitteen systemctl avulla:
$ systemctl get-default
Vaihtaaksesi oletus tavoitteen mihin käynnistetään, vaihda default.target
symlinkkiä. systemctl avulla:
# systemctl set-default multi-user.target
Removed /etc/systemd/system/default.target. Created symlink /etc/systemd/system/default.target -> /usr/lib/systemd/system/multi-user.target.
Vaihtoehtoisesti, lisää yksi seuraavista kernelin parametreista käynnistyslataimeen:
-
systemd.unit=multi-user.target
(joka vastaa karkeasti vanhaa ajotasoa 3), -
systemd.unit=rescue.target
(joka vastaa karkeasti vanhaa ajotasoa 1).
systemd komponentit
Joitain (ei kokonaisuudessa) systemd:n komponentteja ovat:
- systemd-boot — yksinkertainen UEFI boot manager;
- systemd-firstboot — perus järjestelmän asetusten alustaminen ennen ensimmäistä käynnistystä;
- systemd-homed — siirrettävät ihmiskäyttäjän tilit;
- systemd-logind — istunnon hallinta;
- systemd-networkd — verkon konfiguroinnin hallinta;
- systemd-nspawn — kevyt nimiavaruuden säilö;
- systemd-resolved — verkon nimi resoluutio;
- systemd-sysusers(8) — luo järjestelmäkäyttäjiä ja ryhmiä ja lisää käyttäjiä ryhmiin asennuksen yhdteydessä tai käynnistyksen aikana;
- systemd-timesyncd — järjestelmän ajan synkronointi läpi koko verkon;
- systemd/Journal — järjestelmän kirjaukset;
-
systemd/Timers — monotoniset tai reaaliaikaiset ajastimet
.service
tiedostojen hallintaan tai tapahtumille, kohtuullinen vaihtoehto cron:ille.
Vinkkejä ja konsteja
Vianmääritys
Epäonnistuneiden palveluiden tutkiminen
systemd palvelut, jotka eivät onnistuneet käynnistymään, löytyvät:
$ systemctl --state=failed
Tutki näiden kirjauksia, löytääksesi syyn sille. Katso systemd/Journal#Filtering output lisätiedolle.
Bootaus ongelmien tutkiminen
systemd sisältää monia vaihtoehtoja ongelmien tutkimiseen boot prosessissa. Katso boot debugging lisäohjeille ja asetuksille Boot viestin tallentamiseksi ennenkuin systemd aloittaa toimintansa boot prosessista. Katso myös systemd debuggaus dokumentaatio.
Palvelun tutkiminen
Jos jotkin systemd palvelut eivät toimi oikein tai haluat enemmän tietoa siitä mitä tapahtuu, aseta SYSTEMD_LOG_LEVEL
alusta muuttuja tähän: debug
. Esimerkiksi, systemd-networkd taustaprosessin suoritukseen debug tilassa:
Lisää Drop-in tiedosto palvelulle lisäämällä kaksi riviä:
[Service] Environment=SYSTEMD_LOG_LEVEL=debug
Tai vastaavasti aseta alusta muuttuja manuaalisesti:
# SYSTEMD_LOG_LEVEL=debug /lib/systemd/systemd-networkd
sitten käynnistä uudelleen systemd-networkd ja katso lokikirjaa palvelulle jossa on -f
/--follow
asetus.
Sammutus/uudelleen käynnistys vie älyttömästi aikaa
Jos sammuttus prosessi vie paljon aikaa (tai vaikuttaa jäätyvän) todennäköisesti jokin palvelu jota ei ole olemassa on syynä. systemd odottaa jonkin aikaa jokaista palvelua lopettamaan ennenkuin systemd katkaisee sen toiminnan. Jos haluat tietää onko oma järjestelmäsi tämän vaikutuksen alaisena, katso tämä artikkeli.
Katso myös
- Wikipedia:systemd
- Virallinen nettisivu
- Manuaali
- Muut jakelut
- Lennartin blogi tarina, päivitys 1, päivitys 2, päivitys 3, yhteenveto
- Debuggaa Systemd Palveluita
- systemd järjestelmän hallinnoinnille (PDF)
- Kuinka Käyttää Systemctl:ää Systemd Palveluiden ja Yksiköiden Hallintaan
- Tilan hallinta systemd-logind avulla
- Emacs Syntaksin maalaaminen Systemd tiedostoille
- Kaksi osainen selvitys artikkeliin The H Open lehdessä.