Systemd - units & targets

U prošlom smo nastavku spomenuli da su runlevels iz SysVinta zastarjeli. Systemd ih još spominje i podržava, radi "natražnjačke" kompatibilnosti, ali mu oni više nisu važni. U igri su novi termini: units i targets, jedinice i mete, odnosno bolje bi bilo reći ciljevi.

Ukratko, unit je objekt, resurs, koji se dade opisati jednostavnim atributima. Prva asocijacija je da su to servisi. I jesu, ali je to ipak preuska definicija, jer unit može biti i nešto drugo: na primjer uređaj, odnosno datotečni sustav, mount point na koji se nešto montira pri podizanju sustava, ali i onaj koji se montira automatski, kao USB disk i CD/DVD koji se ubaci usred korištenja računala. Može biti socket, swap file ili particija itd. Ukratko, jedinice su svi resursi kojima systemd zna upravljati. Njihove su definicije u konfiguracijskim datotekama, zvanim unit files. Očekivali bismo da njihova imena završavaju na .unit, ali kako postoji više vrsta unita, tako se imena datoteka tvore dodajući im vrstu unita. Potražimo ih u direktoriju /lib/systemd/system.

cups.socket
cron.service
systemd-tmpfiles-clean.timer
acpid.path
proc-sys-fs-binfmt_misc.automount
sys-kernel-config.mount
systemd-networkd.service
systemd-networkd.socket
...

Nabrojat ćemo mogućnosti koje se nude za implementaciju unita.

  • Aktivacija servisa socketima: Socketi koji pripadaju servisima sada su briga system daemona, što donosi niz prednosti. Na primjer, odgađa se start servisa sve dok njegov socket ne bude dostupan, a svi socketi kreiraju se rano u boot procesu pa se servisi mogu podizati paralelno.
  • Aktivacija pomoću busa: Jedinice se aktiviraju kada D-Bus ponudi sučelje.
  • Aktivacija ovisna o stazi: unit se pokreće kada inotify javi da je putanja dostupna, odnosno kada je neki filesystem montiran.
  • Aktivacija po dostupnosti uređaja: Jedinice se pokreću kada je neki hardver dostupan, o čemu javlja udev.
  • Implicitno mapiranje međuovisnosti: systemd kreira stablo ovisnosti među jedinicama, čime se određuje redostlijed pokretanja servisa. Uglavnom je to već podešeno instalacijom, no sistemac može sam intervenirati i mijenjati redoslijed.
  • Instance i predlošci: Unit files mogu se koristiti da se kreiraju višestruke instance istog generičkog unita. Time su omogućene varijacije među instancama.
  • Sigurnosne funkcije: dodavanjem naredbi u konfiguraciji može se odrediti read-only pristup dijelu diska, ograničiti funkcionalnost kernela, dodijeliti zaseban /tmp direktorij za aplikaciju ili zadati privatna mreža.
  • Umetci (drop-ins & snippets): Proširenje funkcionalnosti jedinica dodavanjem koda koji mijenja postavke zadane u sistemskoj konfiguraciji unita.

 Ovo zvuči dobro, mnoštvo je mogućnosti koje donosi systemd.

Prije nego se pozabavimo sadržajem unit datoteka, upoznajmo se s drugom ključnom riječi, targetom.

Target datoteke nalaze se u istom direktoriju, /lib/systemd/system/.

$ ls /lib/systemd/system | grep target
basic.target
basic.target.wants
bluetooth.target
busnames.target
busnames.target.wants
cryptsetup-pre.target
cryptsetup.target
ctrl-alt-del.target
...

Tu su konfiguracijske datoteke u parovima, na pr. basic.target i basic.target.wants. Ono što se na prvi pogled ne vidi jest da su datoteke koje završavaju na .wants zapravo direktoriji u kojima se nalaze druge konfiguracijske datoteke u kojima su zadani servisi koji se najprije moraju podići da bi se pokrenuo unit o kojem brine target datoteka. Tipičan target je na primjer graphical.target, koji je nekadašnji runlevel 5, znači pokrenut networking s mrežnim servisima plus grafičko sučelje.

Neke su datoteke samo linkovi na druge datoteke:

lrwxrwxrwx 1 root root   13 Stu 25  2016 ctrl-alt-del.target -> reboot.target
lrwxrwxrwx 1 root root   16 Stu 25  2016 default.target -> graphical.target

Tako je ctrl-alt-del sinonim za reboot, a default.target je zadani runlevel (po starom), u ovom slučaju Linux boota u grafičko sučelje. Daljnjim pregledom otkrit ćemo i targete koji su tu radi kompatibilnosti sa starim SysVinitom, a zapravo su linkovi na novokomponirane targete.

lrwxrwxrwx 1 root root   15 Stu 25  2016 runlevel0.target -> poweroff.target
lrwxrwxrwx 1 root root   13 Stu 25  2016 runlevel1.target -> rescue.target
drwxr-xr-x 2 root root 4096 Tra 12  2016 runlevel1.target.wants
lrwxrwxrwx 1 root root   17 Stu 25  2016 runlevel2.target -> multi-user.target
drwxr-xr-x 2 root root 4096 Tra 12  2016 runlevel2.target.wants
lrwxrwxrwx 1 root root   17 Stu 25  2016 runlevel3.target -> multi-user.target
drwxr-xr-x 2 root root 4096 Tra 12  2016 runlevel3.target.wants
lrwxrwxrwx 1 root root   17 Stu 25  2016 runlevel4.target -> multi-user.target
drwxr-xr-x 2 root root 4096 Tra 12  2016 runlevel4.target.wants
lrwxrwxrwx 1 root root   16 Stu 25  2016 runlevel5.target -> graphical.target
drwxr-xr-x 2 root root 4096 Tra 12  2016 runlevel5.target.wants
lrwxrwxrwx 1 root root   13 Stu 25  2016 runlevel6.target -> reboot.target

Mogli bismo izvesti zaključak da je target zapravo cilj koji želimo postići: želimo na pr. ugasiti računalo (poweroff.target), a konfiguracijske datoteke opisuju što sve treba uraditi da bi se došlo do tog cilja.

Prije nego se upoznamo sa sastavnicama konfiguracijskih datoteka za unite i targete, trebamo naučiti gdje se konfiguracija nalazi. Upoznali smo direktorij /lib/systemd/system/, ali to nije sve. Očekivali bismo, s pravom, da se konfiguracija nalazi negdje u /etc/, logično bi bilo u /etc/systemd. I zaista:

$ ls -l /etc/systemd
ukupno 40
-rw-r--r--  1 root root  720 Tra 12  2016 bootchart.conf
-rw-r--r--  1 root root 1011 Tra 12  2016 journald.conf
-rw-r--r--  1 root root  986 Tra 12  2016 logind.conf
drwxr-xr-x  2 root root 4096 Tra 12  2016 network
-rw-r--r--  1 root root  610 Tra 12  2016 resolved.conf
drwxr-xr-x 18 root root 4096 Svi  1 06:51 system
-rw-r--r--  1 root root 1537 Srp 12  2016 system.conf
-rw-r--r--  1 root root  534 Tra 12  2016 timesyncd.conf
drwxr-xr-x  2 root root 4096 Tra 12  2016 user
-rw-r--r--  1 root root 1127 Tra 12  2016 user.conf

Na Ubuntuu je sve osim nekoliko .conf datoteka smješteno u direktoriju /etc/systemd/system.

$ ls -l /etc/systemd/system
ukupno 68
drwxr-xr-x 2 root root 4096 Srp 19  2016 bluetooth.target.wants
lrwxrwxrwx 1 root root   37 Kol  1  2016 dbus-org.bluez.service -> /lib/systemd/system/bluetooth.service
lrwxrwxrwx 1 root root   40 Kol  1  2016 dbus-org.freedesktop.Avahi.service -> /lib/systemd/system/avahi-daemon.service
lrwxrwxrwx 1 root root   40 Kol  1  2016 dbus-org.freedesktop.ModemManager1.service -> /lib/systemd/system/ModemManager.service
lrwxrwxrwx 1 root root   53 Kol  1  2016 dbus-org.freedesktop.nm-dispatcher.service -> /lib/systemd/system/NetworkManager-dispatcher.service
lrwxrwxrwx 1 root root   36 Kol  1  2016 dbus-org.freedesktop.thermald.service -> /lib/systemd/system/thermald.service
drwxr-xr-x 2 root root 4096 Srp 19  2016 default.target.wants
lrwxrwxrwx 1 root root   35 Tra  6 06:36 display-manager.service -> /lib/systemd/system/lightdm.service
drwxr-xr-x 2 root root 4096 Srp 19  2016 display-manager.service.wants
drwxr-xr-x 2 root root 4096 Srp 19  2016 getty.target.wants
drwxr-xr-x 2 root root 4096 Kol  1  2016 graphical.target.wants
drwxr-xr-x 2 root root 4096 Srp 19  2016 hibernate.target.wants
drwxr-xr-x 2 root root 4096 Srp 19  2016 hybrid-sleep.target.wants
lrwxrwxrwx 1 root root    9 Svi  1 06:51 ModemManager.service -> /dev/null
drwxr-xr-x 2 root root 4096 Srp 12 17:33 multi-user.target.wants
drwxr-xr-x 2 root root 4096 Srp 19  2016 network-online.target.wants
drwxr-xr-x 2 root root 4096 Srp 19  2016 paths.target.wants
drwxr-xr-x 2 root root 4096 Srp 19  2016 printer.target.wants
drwxr-xr-x 2 root root 4096 Srp 19  2016 shutdown.target.wants
drwxr-xr-x 2 root root 4096 Kol  1  2016 sockets.target.wants
drwxr-xr-x 2 root root 4096 Srp 19  2016 suspend.target.wants
drwxr-xr-x 2 root root 4096 Kol  1  2016 sysinit.target.wants
lrwxrwxrwx 1 root root   35 Kol  1  2016 syslog.service -> /lib/systemd/system/rsyslog.service
-rw-r--r-- 1 root root  451 Sij 14  2017 teamviewerd.service
drwxr-xr-x 2 root root 4096 Kol  9  2016 timers.target.wants

Neke su datoteke samo linkovi na konfiguracijske datoteke u /lib/systemd/system. No tu su i direktoriji s dodatkom .wants, gdje je dodatna konfiguracija. Što će učiniti system daemon ako nađe konfiguraciju na oba mjesta? Hoće li tu nastati konfilikti, ako se konfiguracije razlikuju? Neće! U /lib/systemd/system nalazi se defaultna, sistemska konfiguracija, koja treba raditi na svim inačicama i izdanjima Linuxa. Tu ne treba ništa mijenjati ni dirati. Ako želite unijeti svoje izmjene, da biste prilagodili ponašanje sustava, onda to obavite u /etc/systemd/system direktoriju. Sve što je tu zapisano ima prednost i prepisuje (overrides) sistemsku konfiguraciju. Tu ćete smjestiti  i drop-in datoteke, snippete, za daljnje prilagodbe, samo što za njih treba napraviti poddirektorije koji završavaju na .d, na primjer printer.target.d, a u njih smjestite datoteke koje završavaju na .conf.

Dakle da biste našli gdje je zadana neka konfiguracija, morat ćete se naraditi. Srećom, postoji prečica. Iskoristimo naredbu systemctl da bismo otkrili što sve zahtijeva, "wants" grafički target da bi mogao raditi:

$ systemctl show --property "Wants" graphical.target
Wants=lightdm.service irqbalance.service grub-common.service apport.service hddtemp.service systemd-update-utmp-runlevel.service accounts-daemon.service speech-dispatcher.service ondemand.service ureadahead

Toliko za sada. Systemd je presložen da bismo ga savladali odjednom. U narednom nastavku proučit ćemo postavke koje zadajemo u unit i target datotekama.

Kategorije: 
Vote: 
0
No votes yet