Systemd – Linux init sistem – deo I

Na svakom linux sistemu postoji init proces sa identifikatorom 1 koga pokreće kernel operativnog sistema prilikom „podizanja“ operativnog sistema računara i koji predstavlja init sistem. Init je deamon proces tj. proces koji radi u pozadini i radi sve dok se ne isključi sistem. Zadužen je za upravljanje svim ostalim procesima na sistemu, kao i za upravljanje celog sistema.

Do pre nekoliko godina, većina linux sistema je koristila SysVinit init sistem, koji je nastao 1980. godine. SysVinit koristi shell skripte za rad sa procesima i zahteva da procesi rade u pozadini kako bi mogao da upravlja njima. Koristi koncept runlevel-a tj. stanja u kojima se sistem može naći.

SysVinit ima sledeće nedostatke:

  • Fragmentacija Linux sistema – Svaka Linux distribucija je imala svoje init skripte i zbog toga je dolazilo do razlike između distribucija, što je značajno otežavalo prelazak sa jedne distribucije na drugu.
  • SysVinit nije koristio sve nove mogućnosti Linux kernela – Linux je vremenom dobio nove mogućnosti u pogledu paralelizaćije i iskorišćenja resursa koje SysVinit nije mogao da isprati

Da bi se rešili ovi nedostaci, u međuvremenu su razvijene alternative kao što su:

  • Upstart
  • OpenRc
  • Systemd

Systemd

Systemd je sistemski i servisni menadžer za Linux operitivni sistem, a sam naziv predstavlja skraćenicu od system deamon – sistemski servis. Osnivač systemd-a je Lenart Potering, a inicjalna verzija se pojavila 2010. godine. Prva Linux distribucija koja ima systemd kao podrazumevani init sistem je Fedora. Linux distribucija Debian je započela izradu svog init sistema (Upstart) 2013. godine a godinu dana kasnije se glasalo između nekoliko init sistema i pobedio je systemd, pa je stoga Debian odustao od Upstart-a a sledeća verzija Debiana je sadržala systemd kao podrazumevani init sistem. Nakon što je Debian odabrao systemd, većina Linux distribucija takođe prelazi na systemd kao podrazumevani init system. Sve veći uticaj systemd-a u Linux svetu je bio praćen kontroverzama i kritikama. Kritičari su zamerali systemd-u to što je dosta kompleksniji od pređašnjeg SysVinit-a, što krši osnovnu filozofiju Unix-a o modularnosti i jednostavnosti postajući sve složeniji.

Systemd jedinica (unit)

Kod systemd-a jedinica(unit) se odnosi na bilo koji resurs kojim sistem zna da upravlja. Jedinice su primarne stvari koje systemd alati „znaju“ kako da kontrolišu. One su definisane u konfiguracionim datotekama koji se nazivaju unit datoteke. Sistemske unit datoteke se u sistemu obično nalate u direktorijumu /lib/systemd/system/. Mogu da se pokrenu i zaustave u bilo kom trenutku tokom trajanja korisničke sesije. Korisnik ne bi trebalo da menja datoteke koje se nalaze u tom direktorijumu. Najbolja lokacija da se to uradi je direktorijum /etc/systemd/system/. Za razliku od SysVinit-a i Upstart-a koji su kontrolisali stanja servisa i procesa koji rade u pozadini preko init skripti, koje su bile u direktorijumu /etc/rc.d/init.d/ i napisane u bash-u, kod systemd-a su te init skripte zamenjene servisnim jedinicama.

Struktura jedinica

Spoljašnja struktura jedinica se odnosi na imenovanje jedinica. Imena unit datoteka moraju da budu u sledećem obliku: unit_ime.tip_ekstenzije, gde unit_ime predstavlja ime jedinice a tip_ekstenzije prestavlja tip jedinice. Unutrašnja struktura jedinica se sastoji iz sekcija. Sekcije su označene parom uglastih zagrada(„[“ i „]“) sa imenom sekcije između njih. Prilikom imenovanja sekcije razlikuju se velika i mala slova, tako da sekcija [„Unit“] nije isto što i sekcija [„UNIT“]. Tri glavne sekcije svake unitdatoteke su:

  1. [Unit] – Sadrži opšte opcije koje ne zavise od tipa jedinice. Ove opcije sadrže opis jedinice, definišu ponašanje jedinice i postavljaju zavisnosti na druge jedinice
  2. [Unit type] – Ako jedinica ima direktive za tip, one su grupisane u sekciji nazvanoj po tipu jedinice
  3. [Install] – Sadrži informacije o instalaciji i pokretanju jedinice

Unutar sekcija ponašanje jedinica se definiše korišćenjem prostih direktiva, pomoću formata „ključ-vrednost“ kao u sledećem primeru:

[Section]
Direktiva1 = vrednost1
Direktiva2 = vrednost2

Za svaku direktivu postoje predefinisane vrednosti. Neku sekciju je moguće izostaviti ukoliko nije potrebna u datom slučaju.

Tipovi jedinica

Systemd razvrstava jedinice prema tipu resursa koji opisuju. Najjednostavniji način da se odredi tip jedinice je preko sufiksa, koji se nalazi na kraju naziva datoteke koja upravlja odgovarajućim resursom. Postoji 12 tipova jedinica u systemd-u i oni su:

  1. .service Servisna jedinica opisuje kako se upravlja servisom ili aplikacijom na serveru.
  2. .socket Jedinica soketa opisuje mrežu ili IPC soketili FIFO bafer koji koristi systemd za soket aktivaciju(biće objašnjeno kasnije).
  3. .device Jedinica uređaja se koristi za pristupanje i upravljanje uređajima.
  4. .mount– Ova jedinica definiše i kontroliše tačku montiranja na sistemu.
  5. .automount Konfiguriše tačku montiranja koja će biti automatski montirana. Mora da postoji tačka montiranja na koju će da se odnosi jedinica, kao i odgovarajuča .mount jedinica. Može se koristiti za implementaciju montaže na zahtev, kao i za paralelno pokretanje datoteka.
  6. .swap Opisuje swap prostor na sistemu.
  7. .target Koristi se za pružanje sinhronizacionih tačaka za ostale jedinice kada se pokreće računar ili pri promeni stanja. Mogu takođe služiti da dovedu sistem u novo stanje. Ostale jedinice određuju svoj odnos prema target-ima, da postanu usko povezane sa njihovim operacijama.
  8. .path Definiše putanju datoteke i njoj odgovarajući servis na način, da kada se promeni putanja automatski se poziva odgovarajući joj servis.
  9. .timer Definiše tajmer koji će biti rukovođen od strane systemd-a, kao zamenu za cron posao za odloženo ili zakazano aktiviranje u određenim vremenskim periodima. Odgovarajuća jedinica se pokreće kada se dostigne tajmer.
  10. .snapshot Jedinica za snimanje omogućava rekonstrukciju trenutnog stanja sistema, nakon pravljenja nekih promena
  11. .slice Ova jedinica je odgovorna za kreiranje Linux Control Groups-a dozvoljavajući resursima, kao što su procesor i memorija, da budu ograničeni ili dodeljeni bilo kom procesu koji je povezan sa ovom jedinicom.
  12. .scope Automatski se kreira od strane systemd-a na osnovu informacija koje systemd dobija od svojih magistrala. Koriste se da upravljaju procesima koji su kreirani eksterno.

Funkcionalnosti systemd-a

Systemd omogućava upravljanje servisima, upravljanje deljenim resursima, upravljanje zavisnostima izmedju servisa, logovanje, upravljanje uređajima, itd. Za razliku od SysVinit-a, gde su upotrebljavane shellskripte za pokretanje raznih servisa, kod systemd-a se konfiguracija izvodi deklarativno pomoću tekstualnih datoteka, bez shellskripti, ali systemd zadržava 99% kompatibilnosti sa SysVinit-om.

Systemd ima mnogo više funkcionalnosti od drugih init sistema. Neke od najznačajnijih su:

  • Funkcionalnost init sistema
  • Funkcionalnost syslog-a (early-logging system) – Pre se loging na Linuxu izvršavao preko dodatnog procesa koji je bio syslog, a sad systemd radi loging.
  • Podiže servise vezane za hardver i drajvere
  • Zamena za cron – Systemd ima mogućnost vremenske aktivacije servisa.
  • Automount – Nekada se radio preko fstab-a(određuje koje se particije diska i kako montiraju na sistem datoteka).
  • Soket aktivacija – Pomoću soket aktivacije systemd postiže agresivnu paralelizaciju, naročito pri pokretanju servisa. Postoje neki servisi koji su zavisni od drugih servisa i umesto da se pokretanje tih servisa radi sekvencijalno, ono se može paralelizovati. Usluge koje servisi, koji se još nisu pokrenuli na soketima nude preuzima systemd, tako da kad imamo neki web server koji traži soket da može da se loguje, systemd mu daje soket i kada se web server konektuje na systemd, systemd baferuje poruke od web servera. Ukoliko se desi da je bafer pun, web server će se blokirati i čekati da se isprazni da bi mogao da nastavi dalje. U međuvremenu systemd paralelno pokreće syslog i kada se syslog pokrene, systemd mu prosleđuje soket i syslog dobija baferovane podatke i nastavlja dalje da radi. Sve ovo se dešava automatski, nevidljivo sa korisničke strane gledišta. Soket aktivacija takođe osigurava da se nijedna poruka ne izgubi, tako što koristi baferovanje. Soket aktivacija omogućava i da systemd pokreće servise samo kada su potrebni, tj. systemd neće pokrenuti neki servis, ako neko pre toga nije zahtevao usluge tog servisa.
  • Aktivacija zasnovana na magistrali – Sistemski servisi koji koriste D-bus za interprocesnu komunikaciju mogu biti pokrenuti na zahtev prvi put, kada klijentska aplikacija pokuša da komunicira sa njima. Systemd koristi D-bus servisne datoteke za aktivaciju zasnovanu na magistrali.
  • Aktivacija zasnovana na uređaju – Sistemski servisi koji podržavaju aktivaciju zasnovanu na uređaju, mogu biti pokrenuti na zahtev kada se priključi ili postane dostupan neki deo hardvera. Systemd koristi jedinicu uređaja za aktivaciju zasnovanu na uređaju.
  • Aktivacija zasnovana na putanji – Sistemski servisi koji podržavaju aktivaciju zasnovanu na putanji, mogu biti pokrenuti na zahtev kada određena datoteka ili direktorijum promeni svoje stanje. Systemd koristi jedinicu putanje za aktivaciju zasnovanu na putanji.
  • Snimanje stanja sistema – Jedna od funkcija systemd-a je snimanje stanja sistema. Systemd može privremeno snimiti stanje svih jedinica i vratiti prethodno stanje sistema iz dinamički kreiranog snimka. Da bi sačuvao trenutno stanje sistema, systemd koristi dinamički kreiranu jedinicu za snimanje sistema.
  • Target-i – Postoji više stanja sistema, koja nude određene usluge korisniku.
  • Linux Control GroupsZa razliku od SysVinita, systemd nudi mogućnost upravljanja resursima kao što su procesor, memorija i disk. To se omogućava preko Linux Control Groups-a tako što se određeni procesi nalaze u određenim grupama kojima možemo zadavati ograničenja za gore pomenute resurse.
  • Dnevnik – Komponenta systemd-a koja je odgovorna za pregledanje i održavanje log datoteka. Podaci za logovanje se skupljaju, smeštaju i procesiraju korišćenjem servisa journald. Journald kreira i održava binarne datoteke koje se zovu dnevnici i koji su bazirani na informacijama o logovanju koje dobija od kernela, korisničkih procesa, standardnog izlaza i standarnog izlaza za greške.

Systemd je preuzeo sve ove funkcionalnosti radi standardizacije Linux sistema, čime rešava problem koji je SysVinit imao – pisanje različitih skripti za različite distribucije.

Systemd alati

Systemd koristi alate kako bi upravljao servisima, procesima i celokupnim sistemom. Centralni alat kod systemd-a je System Control. System Control nudi mogućnost da se vidi koji sve servisi postoje, koji su servisi aktivni, da se pokrene servis, da se zaustavi servis, da se omogući/onemogući rad servisa, da se vidi status servisa itd..System Control se u systemd-u predstavlja komandom systemctl, a u nastavku slede primeri upotrebe ove komande.

Određeni servis se pokreće sledećom komandom:

sudo systemctl start ime_servisa.service

Sudo“ mora da se koristi u ovom slučaju jer se ovom komandom menja stanje operativnog sistema. Systemd može da zaključi da se operiše sa jedinicom tipa service, ako se koristi alat za upravljanje servisa. Iz tog razloga, iz gornje komande može da se izostavi „.service“, jer systemd raspoznaje da se koristi alat systemctl, pa se gornja komanda može napisati ovako:

sudo systemctl start ime_servisa

Da bi bilo jasno kojim se tipom servisa operiše, preporučuje se da se ostavi tip servisa na kraju komande.

Da bi se zaustavio, restartovao, omogućio ili onemogućio rad nekog servisa koriste se sledeće 4 komande koje opisuju ove radnje respektivno.

sudo systemctl stop ime_servisa.service
sudo systemctl restart ime_servisa.service
sudo systemctl enable ime_servisa.service
sudo systemctl disable ime_servisa.service

AKo je rad nekog servisa omogućen, to znači da se će systemd pri svakom pokretanju računara pokrenuti taj servis.

Ako servis može da „osveži“ neke svoje konfiguracione datoteke(bez restartovanja), može se pokrenuti proces „osvežavanja“ na sledeći način:

sudo systemctl reload ime_servisa.service

Sledeće 4 komande se koriste da bi se proverio status servisa, da li je neki servis pokrenut, da li je rad nekog servisa omogućen i da li postoji neki problem sa servisom respektivno.

systemctl status ime_servisa.service
systemctl is-active ime_servia.service
systemctl is-enabled ime_servisa.service
systemctl is-failed ime_servisa.service

Još jedan značajan alat je i Journal Control. Ovaj alat omogućava da se pristupi datotekama za logovanje. Pomoću ovog alata, sistem administratori mogu na dinamički način da prikazuju logove prema svojim potrebama. To može biti prosto kao pregledanje podataka o pokretanju sistema od pre tri dana ili složenije kao kombinovanje log datoteka dva povezana servisa, kako bi se rešio problem u njihovoj komunikaciji. Systemd pamti podatke u logovima u binarnom formatu.

Da bi video logove koje je napravio servis journald, systemd koristi komandu journalctl.

Kada se koristi samostalno(bez ikakvih argumenata) komanda journalctl, prikazuje sve logove od svih servisa na sistemu. Iako ova komanda daje pristup ogromnoj kolekciji podataka, takvu količinu podataka može biti teško ili nemoguće pregledati i obraditi, pa se zbog toga koriste mogućnosti komande journalctl, da filtrira podatke preko njenih argumenata.

Jedna od osnovnih takvih komandi je

journalctl -b

koja prikazuje sve logove koji su skupljeni od poslednjeg uključivanja računara.

Postoji i način da se prikažu logovi i od prethodnih pokretanja računara, ali se prvo mora omogućiti ova opcija. Postoji dva načina kako može ovo da se uradi.

  1. Kreiranje direktorijuma u kome bi se smestio dnevnik logova. To se može postići korišćenjem sledeće komande:
sudo mkdir -p /var/log/journal
  1. Izmena konfiguracione datoteke dnevnika. Nakon pokretanja komande:
sudo nano /etc/systemd/journald.conf

kod sekcije [Journal] postaviti opciju Storage=persistent čime se omogućava istrajnost logova.

Kada je omogućeno čuvanje logova od prethodnih pokretanja računara, journalctl pruža komande koje mogu manipulisati njima.

Da bi se videli svi logovi prethodnih pokretanja račnara koristi se komanda:

journalctl -list-boots

Ukoliko se žele videti logovi od prethodnog pokretanja računara koristi se sledeća komanda:

journalctl -b -1

Logovi se mogu pregledati i po vremenu koristeći ključne reči --since i --until,koje ograničavaju logove na one posle ili pre određenog vremena respektivno. Da bi se videli svi logovi, npr. od 15. jula 2017. godine od 17:15h koristi se sledeća komanda:

journalctl --since "2015-07-15 17:15:00"

Da bi se videli svi logovi od juče, može se iskoristiti sledeća komanda:

journalctl --since yesterday

Još jedna mogućnost filtriranja podataka odnosi se na systemd jedinice. Koristi se argument -u da bi se izvršila filtriranja po konkretnoj jedinici. Korišćenjem komande:

journalctl -u nginx.service

dobijaju se svi logovi jedinice Nginx na sistemu.

Pomoću argumenata _PID mogu se prikazati svi logovi procesa sa određenim identifikatorom. Ako se žele prikazati logovi procesa sa identifikatorom 8088, koristi se komanda:

journalctl _PID=8088

Takođe se mogu specificirati korisnik i grupa korišćenjem filtera _UID i _GID. Journalctl omogućava i da se pogledaju sve poruke kernela korišćenjem parametra -p. Informacija o tome koliko dnevnik zauzima mesta na disku, se dobija kao izlaz komande:

journalctl -disk-usage

Zaključak

Systemd je postao vodeći init sistem danas u svetu zbog svoje jednostavnosti i mnogih mogućnosti koje nudi. Mada mu neki zameraju da je preuzeo previše stvari na sebe, time kršeći osnovne principe Unix-a, mnogi u njemu vide dobru novinu i možda neki novi pravac u razvoju Linux-a.