101.3 Lekcija 1
Sertifikat: |
LPIC-1 |
---|---|
Verzija: |
5.0 |
Tema: |
101 Arhitektura sistema |
Cilj: |
101.3 Promijeni nivoe / ciljeve butanja i isključi ili ponovno pokreni sistem |
Lekcija: |
1 od 1 |
Uvod
Zajednička karakteristika među operativnim sistemima koji prate Unix principe dizajna je upotreba odvojenih procesa za kontrolu različitih funkcija sistema. Ovi procesi, nazvani daemoni (ili, općenito, services), također su odgovorni za proširene funkcije koje su u osnovi operativnog sistema, kao što su usluge mrežnih aplikacija (HTTP server, dijeljenje datoteka, e-pošta, itd.), baze podataka, konfiguracija na zahtjev, itd. Iako Linux koristi monolitni kernel, na mnoge aspekte niskog nivoa operativnog sistema utiču daemoni, kao što je balansiranje opterećenja i konfiguracija zaštitnog zida.
Koji daemoni treba da budu aktivni zavisi od svrhe sistema. Skup aktivnih daemona bi također trebao biti promjenjiv u vrijeme izvođenja, tako da se usluge mogu pokrenuti i zaustaviti bez ponovnog pokretanja cijelog sistema. Za rješavanje ovog problema, svaka veća distribucija Linuxa nudi neki oblik uslužnog programa za upravljanje servisima koji dalje kontroliraju sistem.
Servisi se mogu kontrolirati pomoću shell skripti ili programa i njegovih pratećih konfiguracijskih datoteka. Prva metoda je implementirana pomoću SysVinit standarda, također poznatog kao System V ili samo SysV. Drugu metodu implementiraju systemd i Upstart. Historijski gledano, menadžeri servisa zasnovani na SysV-u bili su najčešće korišteni u Linux distribucijama. Danas se menadžeri usluga ili servisa zasnovani na systemd-u češće nalaze u većini Linux distribucija. Menadžer usluga je prvi program koji kernel pokreće tokom procesa pokretanja, tako da je njegov PID (identifikacijski broj procesa) uvijek 1
.
Menadžer servisa baziran na SysVinit standardu će obezbijediti unaprijed definirane skupove stanja sistema, nazvane runlevels, i njihove odgovarajuće skriptne datoteke koje treba izvršiti. Nivoi pokretanja su numerisani od 0
do 6
, generalno se dodeljuju u sledeće svrhe:
- Runlevel 0
-
Gašenje sistema.
- Runlevel 1, s or single
-
Jednokorisnički nivo za održavanje, bez mreže.
- Runlevel 2, 3 or 4
-
Višekorisnički nivo. Korisnici se mogu logovati na konzolu ili mrežu. Runlevel 2 i 4 nisu često u upotrebi.
- Runlevel 5
-
Višekorisnički nivo. Jednak nivou 3, poznat još i kao grafički nivo.
- Runlevel 6
-
Restartovanje sistema.
Program odgovoran za upravljanje nivoima pokretanja i povezanim daemonima/resursima je /sbin/init
. Tokom inicijalizacije sistema, program init
identifikuje traženi nivo pokretanja, definisan parametrom kernela ili u datoteci /etc/inittab
, i učitava pridružene skripte navedene tamo za dati nivo pokretanja. Svaki nivo pokretanja može imati mnogo povezanih servisnih datoteka, obično skripti u direktoriju /etc/init.d/
. Kako nisu svi nivoi pokretanja ekvivalentni kroz različite Linux distribucije, kratak opis svrhe nivoa pokretanja može se naći i u distribucijama baziranim na SysV-u.
Sintaksa datoteke /etc/inittab
koristi ovaj format:
id:runlevels:action:process
id
je generički naziv dužine do četiri znaka koji se koristi za identifikaciju unosa. Unos runlevel' je lista brojeva nivoa pokretanja za koje treba izvršiti određenu radnju. Termin `akcija
definira kako će init
izvršiti proces označen terminom proces
. Dostupne radnje su:
boot
-
Proces će se izvršiti tokom inicijalizacije sistema. Polje
runlevels
se zanemaruje. bootwait
-
Proces će se izvršiti tokom inicijalizacije sistema i
init
će čekati dok se ne završi da bi nastavio. Poljerunlevels
se zanemaruje. sysinit
-
Proces će se izvršiti nakon inicijalizacije sistema, bez obzira na nivo pokretanja. Polje
runlevels
se zanemaruje. wait
-
Proces će se izvršiti za date nivoe pokretanja i
init
će čekati dok se ne završi da bi nastavio. respawn
-
Proces će se ponovo pokrenuti ako se prekine.
ctrlaltdel
-
Proces će se izvršiti kada init proces primi signal
SIGINT
, koji se pokreće kada se pritisne sekvenca tipki Ctrl+Alt+Del.
Podrazumjevani nivo pokretanja — onaj koji će biti izabran ako nijedan drugi nije dat kao parametar kernela — takođe je definisan u /etc/inittab
, u unosu id:x:initdefault
. x
je broj zadanog nivoa pokretanja. Ovaj broj nikada ne bi trebao biti 0
ili 6
, s obzirom da bi to uzrokovalo gašenje ili ponovno pokretanje sistema čim završi proces pokretanja. Tipičan /etc/inittab
fajl je prikazan ispod:
# Default runlevel id:3:initdefault: # Configuration script executed during boot si::sysinit:/etc/init.d/rcS # Action taken on runlevel S (single user) ~:S:wait:/sbin/sulogin # Configuration for each execution level l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 # Action taken upon ctrl+alt+del keystroke ca::ctrlaltdel:/sbin/shutdown -r now # Enable consoles for runlevels 2 and 3 1:23:respawn:/sbin/getty tty1 VC linux 2:23:respawn:/sbin/getty tty2 VC linux 3:23:respawn:/sbin/getty tty3 VC linux 4:23:respawn:/sbin/getty tty4 VC linux # For runlevel 3, also enable serial # terminals ttyS0 and ttyS1 (modem) consoles S0:3:respawn:/sbin/getty -L 9600 ttyS0 vt320 S1:3:respawn:/sbin/mgetty -x0 -D ttyS1
Komandu telinit q
treba izvršiti svaki put nakon što se modificira datoteka /etc/inittab
. Argument q
(ili Q
) govori init-u da ponovo učita svoju konfiguraciju. Takav korak je važan kako bi se izbjeglo zaustavljanje sistema zbog neispravne konfiguracije u /etc/inittab
.
Skripte koje koristi init
za postavljanje svake razine ili nivoa pokretanja pohranjene su u direktoriju /etc/init.d/
. Svaki nivo pokretanja ima pridruženi direktorij u /etc/
, pod nazivom /etc/rc0.d/
, /etc/rc1.d/
, /etc/rc2.d/
, itd., sa skriptama koji treba da se izvrši kada se pokrene odgovarajući nivo pokretanja. Kako istu skriptu mogu koristiti različiti nivoi pokretanja, datoteke u tim direktorijima su samo simboličke veze na stvarne skripte u /etc/init.d/
. Nadalje, prvo slovo imena datoteke veze u direktoriju nivoa pokretanja označava da li servis treba pokrenuti ili prekinuti za odgovarajući nivo pokretanja. Ime datoteke veze koje počinje slovom K
određuje da će usluga biti ubijena kada se uđe u nivo pokretanja (kill). Počevši sa slovom S
, servis će biti pokrenut prilikom ulaska u runlevel (start). Direktorij /etc/rc1.d/
, na primjer, imat će mnogo veza ka mrežnim skriptama koje počinju slovom K
, s obzirom na to da je razina pokretanja 1 razina pokretanja jednog korisnika, bez mrežne povezanosti.
Komanda runlevel
pokazuje trenutni nivo pokretanja za sistem. Komanda runlevel
pokazuje dvije vrijednosti, prva je prethodni nivo pokretanja, a druga je trenutni nivo pokretanja:
$ runlevel N 3
Slovo N
u izlazu pokazuje da se nivo pokretanja nije promijenio od posljednjeg pokretanja. U primjeru, runlevel 3
je trenutni nivo pokretanja sistema.
Isti program init
može se koristiti za izmjenu između nivoa pokretanja u sistemu koji radi, bez potrebe za ponovnim pokretanjem. Komanda telinit
se također može koristiti za izmjenu između nivoa pokretanja. Na primjer, komande telinit 1
, telinit s
ili telinit S
će promijeniti sistem u runlevel 1.
systemd
Trenutno, systemd je najrasprostranjeniji skup alata za upravljanje sistemskim resursima i servisima, koje sistemd naziva jedinice (eng. units). Jedinica se sastoji od imena, tipa i odgovarajuće konfiguracijske datoteke. Na primjer, jedinica za httpd serverski proces (kao što je Apache web server) bit će httpd.service
na distribucijama baziranim na Red Hat-u, a njegova konfiguracijska datoteka će se također zvati httpd.service
(na Debian distribucijama ova jedinica je pod nazivom apache2.service
).
Postoji sedam različitih tipova sistemskih jedinica:
service
-
Najčešći tip jedinice, za aktivne sistemske resurse koji se mogu pokrenuti, prekinuti i ponovo učitati.
socket
-
Tip jedinice soketa, koji može biti soket sistema datoteka ili mrežni soket. Svi soketi imaju odgovarajuću servisnu jedinicu, učitanu kada soket primi zahtjev.
device
-
Jedinica uređaja je povezana s hardverskim uređajem koji je identificiran od strane kernela. Uređaj će se uzeti kao sistemska jedinica samo ako postoji udev pravilo za ovu svrhu. Jedinica uređaja se može koristiti za rješavanje konfiguracijskih ovisnosti kada se otkrije određeni hardver, s obzirom da se svojstva iz pravila udev mogu koristiti kao parametri za jedinicu uređaja.
mount
-
Jedinica za montiranje je definicija tačke montiranja (eng. mount point) u sistemu datoteka, slična unosu u
/etc/fstab
. automount
-
Jedinica za automatsko montiranje je također definicija tačke montiranja u sistemu datoteka, ali se automatski montira. Svaka jedinica za automatsko montiranje ima odgovarajuću jedinicu za montiranje, koja se pokreće kada se pristupi tački automatskog montiranja.
target
-
Ciljna jedinica je grupa drugih jedinica kojima se upravlja kao jedna jedinica.
snapshot
-
Jedinica snimka je sačuvano stanje systemd menadžera (nije dostupno na svakoj Linux distribuciji).
Glavna komanda za kontrolu systemd jedinica je systemctl
. Komanda systemctl
se koristi za izvršavanje svih zadataka koji se odnose na aktivaciju, deaktivaciju, izvršavanje, prekid, praćenje itd. Za fiktivnu jedinicu zvanu unit.service
, na primjer, najčešće akcije systemctl
će biti:
systemctl start unit.service
-
Pokreni
unit
. systemctl stop unit.service
-
Zaustavi
unit
. systemctl restart unit.service
-
Restartuj
unit
. systemctl status unit.service
-
Prikaži stanje
unit
, uključujući da li je aktivan ili ne. systemctl is-active unit.service
-
Prikaži active ako je `unit`pokrenut ili inactive ako nije.
systemctl enable unit.service
-
Omogući
unit
, to jest,unit
će biti pokrenut sa sistemom. systemctl disable unit.service
-
unit
se neće pokrenuti sa sistemom. systemctl is-enabled unit.service
-
Provjeri da li će
unit
biti pokrenut sa sistemom. Odgovor je smješten u varijabli$?
. Vrijednost0
prikazuje kako seunit
starta sa sistemom, dok vrijednost`1` prikazuje kakounit
neće biti pokrenut sa sistemom.
Note
|
Novije instalacije systemd-a će zapravo navesti konfiguraciju jedinice za vrijeme pokretanja. Na primjer: $ systemctl is-enabled apparmor.service enabled |
Ako u sistemu ne postoje druge jedinice sa istim imenom, onda se sufiks iza tačke može ispustiti. Ako, na primjer, postoji samo jedna httpd
jedinica tipa service
, tada je samo httpd
dovoljan kao jedinični parametar za systemctl
.
Komanda systemctl
također može kontrolirati sistemske ciljeve. Jedinica multi-user.target
, na primjer, kombinuje sve jedinice koje zahtijeva okruženje višekorisničkog sistema. Slično je nivou pokretanja broj 3 u sistemu koji koristi SysV.
Komanda systemctl isolate
mijenja različite ciljeve. Dakle, da ručno promijenite cilj ili target na multi-user
unosite:
# systemctl isolate multi-user.target
Postoje odgovarajući ciljevi za SysV nivoe pokretanja, počevši od runlevel0.target
do runlevel6.target
. Međutim, systemd ne koristi datoteku /etc/inittab
. Da promijenite zadani sistemski cilj, opcija systemd.unit
se može dodati na listu parametara kernela. Na primjer, da biste koristili multi-user.target
kao standardni cilj, parametar kernela bi trebao biti systemd.unit=multi-user.target
. Svi parametri kernela mogu se učiniti trajnim promjenom konfiguracije bootloadera.
Drugi način da promijenite zadani cilj je modificiranje simboličkog linka /etc/systemd/system/default.target
tako da pokazuje na željeni cilj. Redefiniranje veze se može izvršiti pomoću komande systemctl
sama:
# systemctl set-default multi-user.target
Isto tako, možete odrediti koji je zadani cilj pokretanja vašeg sistema pomoću sljedeće komande:
$ systemctl get-default graphical.target
Slično sistemima koji usvajaju SysV, zadani cilj nikada ne bi trebao pokazivati na shutdown.target
, jer odgovara nivou pokretanja 0 (shutdown).
Konfiguracijske datoteke povezane sa svakom jedinicom mogu se naći u direktoriju /lib/systemd/system/
. Komanda systemctl list-unit-files
navodi sve dostupne jedinice i pokazuje da li su omogućene za pokretanje kada se sistem pokrene. Opcija --type
će odabrati samo jedinice za dati tip, kao u systemctl list-unit-files --type=service
i systemctl list-unit-files --type=target
.
Aktivne jedinice ili jedinice koje su bile aktivne tokom trenutne sistemske sesije mogu se navesti komandom systemctl list-units
. Poput opcije list-unit-files
, komanda systemctl list-units --type=service
će odabrati samo jedinice tipa service
, a komanda systemctl list-units --type=target
će odabrati samo jedinice tipa target
.
systemd je također odgovoran za pokretanje i reagovanje na događaje povezane s napajanjem. Komanda systemctl suspend
će staviti sistem u režim niske potrošnje, zadržavajući trenutne podatke u memoriji. Komanda systemctl hibernate
će kopirati sve memorijske podatke na disk, tako da se trenutno stanje sistema može oporaviti nakon isključivanja. Akcije povezane s takvim događajima definirane su u datoteci /etc/systemd/logind.conf
ili u zasebnim datotekama unutar direktorija /etc/systemd/logind.conf.d/
. Međutim, ova systemd funkcija se može koristiti samo kada na sistemu ne postoji drugi menadžer napajanja, kao što je daemon acpid
. Daemon acpid
je glavni menadžer napajanja za Linux i omogućava finije prilagođavanje radnji nakon događaja povezanih s napajanjem, kao što je zatvaranje poklopca laptopa, slaba baterija ili nivoi punjenja baterije.
Upstart
Inicijalizacijske skripte koje koristi Upstart nalaze se u direktoriju /etc/init/
. Sistemske usluge se mogu izlistati komandom initctl list
, koja također prikazuje trenutno stanje servisa i, ako je dostupno, njihov PID broj.
# initctl list avahi-cups-reload stop/waiting avahi-daemon start/running, process 1123 mountall-net stop/waiting mountnfs-bootclean.sh start/running nmbd start/running, process 3085 passwd stop/waiting rc stop/waiting rsyslog start/running, process 1095 tty4 start/running, process 1761 udev start/running, process 1073 upstart-udev-bridge start/running, process 1066 console-setup stop/waiting irqbalance start/running, process 1842 plymouth-log stop/waiting smbd start/running, process 1457 tty5 start/running, process 1764 failsafe stop/waiting
Svaka akcija Upstart ima svoju nezavisnu komandu. Na primjer, komanda start
se može koristiti za pokretanje šestog virtualnog terminala:
# start tty6
Trenutno stanje resursa može se provjeriti komandom status
:
# status tty6 tty6 start/running, process 3282
A prekid servisa se vrši komandom stop
:
# stop tty6
Upstart ne koristi datoteku /etc/inittab
za definiranje nivoa pokretanja, ali se stare komande runlevel
i telinit
i dalje mogu koristiti za provjeru i izmjenu između nivoa pokretanja.
Note
|
Upstart je razvijen za distribuciju Ubuntu Linuxa kako bi se olakšalo paralelno pokretanje procesa. Ubuntu je prestao da koristi Upstart od 2015. godine kada je prešao sa Upstarta na systemd. |
Shutdown i Restart
Vrlo tradicionalna komanda koja se koristi za gašenje ili ponovno pokretanje sistema ne iznenađuje se naziva shutdown
. Komanda shutdown
dodaje dodatne funkcije procesu isključivanja: automatski obavještava sve prijavljene korisnike porukom upozorenja u njihovim sesijama ljuske i nove prijave su spriječene. Komanda shutdown
djeluje kao posrednik SysV ili systemd procedurama, odnosno izvršava traženu akciju pozivanjem odgovarajuće akcije u menadžeru usluga ili servisa koju je usvojio sistem.
Nakon što se izvrši shutdown
, svi procesi primaju signal SIGTERM
, nakon čega slijedi signal SIGKILL
, a zatim se sistem gasi ili mijenja svoj nivo pokretanja. Prema zadanim postavkama, kada se ne koriste nijedna opcija -h
ili -r
, sistem prelazi na nivo pokretanja 1, odnosno na jednokorisnički način rada. Da biste promijenili zadane opcije za shutdown
, komandu treba izvršiti sa sljedećom sintaksom:
$ shutdown [option] time [message]
Potreban je samo parametar time
. Parametar time
definira kada će se zahtijevana radnja izvršiti, prihvatajući sljedeće formate:
hh:mm
-
Ovaj format navodi izvršavanje vremena u satima i minutama.
+m
-
Ovaj format navodi koliko se minuta čeka prije izvršavanja.
now
or+0
-
Ovaj format pokreće hitno izvršavanje.
Parametar message
je tekst upozorenja poslat na sve terminal sesije logovanih korisnika.
Implementacija SysV dozvoljava ograničavanje korisnika koji će moći ponovo pokrenuti mašinu pritiskom na Ctrl+Alt+Del. Ovo je moguće postavljanjem opcije -a
za komandu shutdown
prisutnu na liniji koja se odnosi na ctrlaltdel
u datoteci /etc/inittab
. Radeći ovo, samo korisnici čija se korisnička imena nalaze u datoteci /etc/shutdown.allow
moći će ponovo pokrenuti sistem kombinacijom tipki Ctrl+Alt+Del.
Komanda systemctl
se takođe može koristiti za isključivanje ili ponovno pokretanje mašine u sistemima koji koriste systemd. Za ponovno pokretanje sistema treba koristiti komandu systemctl reboot
. Da biste isključili sistem, treba koristiti poweroff systemctl poweroff
. Obje komande zahtijevaju root privilegije za pokretanje, jer obični korisnici ne mogu izvoditi takve procedure.
Note
|
Neke Linux distribucije će povezati $ sudo which poweroff /usr/sbin/poweroff $ sudo ls -l /usr/sbin/poweroff lrwxrwxrwx 1 root root 14 Aug 20 07:50 /usr/sbin/poweroff -> /bin/systemctl |
Ne zahtijevaju sve aktivnosti održavanja da se sistem isključi ili ponovo pokrene. Međutim, kada je potrebno promijeniti stanje sistema u jednokorisnički način rada, važno je upozoriti prijavljene korisnike kako ih ne bi oštetio nagli prekid njihovih aktivnosti.
Slično onome što komanda shutdown
radi prilikom isključivanja ili ponovnog pokretanja sistema, komanda wall
može poslati poruku terminalskim sesijama svih prijavljenih korisnika. Da bi to uradio, administrator sistema treba samo da obezbjedi fajl ili direktno napiše poruku kao parametar komandi wall
.
Vođene vježbe
-
Kako se komanda
telinit
može koristiti za ponovno pokretanje sistema? -
Šta će se dogoditi sa uslugama vezanim za datoteku
/etc/rc1.d/K90network
kada sistem uđe u nivo pokretanja 1? -
Koristeći komandu
systemctl
, kako korisnik može provjeriti da li je jedinicasshd.service
pokrenuta? -
U sistemu zasnovanom na systemd-u, koja komanda se mora izvršiti da bi se omogućila aktivacija jedinice
sshd.service
tokom inicijalizacije sistema?
Istraživačke vježbe
-
U sistemu baziranom na SysV-u, pretpostavimo da je podrazumevani nivo pokretanja definisan u
/etc/inittab
3, ali sistem uvek počinje na nivou pokretanja 1. Koji je verovatni uzrok tome? -
Iako se datoteka
/sbin/init
može naći u sistemima baziranim na systemd-u, to je samo simbolička veza do druge izvršne datoteke. U takvim sistemima, koji je fajl ukazuje na/sbin/init
? -
Kako se podrazumjevani sistemski cilj može verificirati u sistemu baziranom na systemd-u?
-
Kako se može otkazati ponovno pokretanje sistema zakazano komandom
shutdown
?
Sažetak
Ova lekcija pokriva glavne uslužne programe koje Linux distribucije koriste kao menadžer usluga. SysVinit, systemd i Upstart uslužni programi imaju svaki svoj pristup kontroli sistemskih usluga i stanja sistema. Lekcija prolazi kroz sljedeće teme:
-
Šta su sistemske usluge i njihova uloga u operativnom sistemu.
-
Koncepti i osnovna upotreba SysVinit, systemd i Upstart komandi.
-
Kako pravilno pokrenuti, zaustaviti i ponovo pokrenuti sistemske usluge i sam sistem.
Komande i procedure koje su korištene:
-
Komande i datoteke koje se odnose na SysVinit, kao što su
init
,/etc/inittab
itelinit
. -
Glavna systemd komanda:
systemctl
. -
Upstart komande:
initctl
,status
,start
,stop
. -
Tradicionalne komande za upravljanje napajanjem, kao što su
shutdown
i komandawall
.
Odgovori na vođene vježbe
-
Kako se komanda
telinit
može koristiti za ponovno pokretanje sistema?Komanda
telinit 6
će promijeniti u runlevel 6, to jest, rebootat će sistem. -
Šta će se dogoditi sa uslugama vezanim za datoteku
/etc/rc1.d/K90network
kada sistem uđe u nivo pokretanja 1?Potšo je slovo
K
u upotrebi na početku naziva datoteke, pomenuti servisi će biti zaustavljeni. -
Koristeći komandu
systemctl
, kako korisnik može provjeriti da li je jedinicasshd.service
pokrenuta?Sa komandom
systemctl status sshd.service
ilisystemctl is-active sshd.service
. -
U sistemu zasnovanom na systemd-u, koja komanda se mora izvršiti da bi se omogućila aktivacija jedinice
sshd.service
tokom inicijalizacije sistema?Komanda
systemctl enable sshd.service
, izvršena sa root privilegijama.
Odgovor na istraživačke vježbe
-
U sistemu baziranom na SysV-u, pretpostavimo da je podrazumevani nivo pokretanja definisan u
/etc/inittab
3, ali sistem uvek počinje na nivou pokretanja 1. Koji je verovatni uzrok tome?Parametar
1
iliS
je prisutan na listi kernel parametara. -
Iako se datoteka
/sbin/init
može naći u sistemima baziranim na systemd-u, to je samo simbolička veza do druge izvršne datoteke. U takvim sistemima, koji je fajl ukazuje na/sbin/init
?Glavni systemd binary:
/lib/systemd/systemd
. -
Kako se podrazumjevani sistemski cilj može verificirati u sistemu baziranom na systemd-u?
Simbolički link
/etc/systemd/system/default.target
će pokazivati na jedinični fajl definiran kao zadani cilj ili target. Komandasystemctl get-default
se također može koristiti. -
Kako se može otkazati ponovno pokretanje sistema zakazano komandom
shutdown
?Komanda
shutdown -c
se treba koristiti.