Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| skoleni:sprava_uzivatelu_a_sluzeb [2018/10/10 10:44] – vbendel | skoleni:sprava_uzivatelu_a_sluzeb [2022/11/14 11:26] (aktuální) – upraveno mimo DokuWiki 127.0.0.1 | ||
|---|---|---|---|
| Řádek 21: | Řádek 21: | ||
| Systémoví užívatelia sú takí uživatelia, | Systémoví užívatelia sú takí uživatelia, | ||
| účel, pre ktorý existujú, napr. beh webserveru a jeho právomoci | účel, pre ktorý existujú, napr. beh webserveru a jeho právomoci | ||
| - | (viac o systémových právach v kapitole | + | (viac o systémových právach v kapitole |
| // | // | ||
| Řádek 343: | Řádek 343: | ||
| === Odstránenie účtu === | === Odstránenie účtu === | ||
| Hoci na sa na prvý pohľad môže zdať, že zmazať účet je triviálnou operáciou, | Hoci na sa na prvý pohľad môže zdať, že zmazať účet je triviálnou operáciou, | ||
| - | nie je tomu celkom tak a treba k tomu pristupovať s maximálnou rozvahou, inak hrozí, že zanecháme systém v nekonzistentnom stave, napr. pokus o zmazanie účtu spolu s domovským adresárom môže ovplyvniť aj iných užívateľov, | + | nie je tomu celkom tak a treba k tomu pristupovať s maximálnou rozvahou, inak hrozí, že zanecháme systém v nekonzistentnom stave, napr. pokus o zmazanie účtu spolu s domovským adresárom môže ovplyvniť aj iných užívateľov, |
| < | < | ||
| Řádek 618: | Řádek 618: | ||
| ===== Procesy ===== | ===== Procesy ===== | ||
| - | Procesy v Linuxe sú vlastne presne také, ako je v dnešných výpočtových systémoch bežné a dá sa očakávať. | + | Termínom proces rozumieme akýkoľvek **bežiaci** program (program, ktorý nebeží nie je nič iné ako súbor inštrukcií uložených na disku) v systéme. Je to teda nejaká abstrakcia, ktorá |
| - | Každý proces | + | |
| + | ==== Vytvorenie procesu ==== | ||
| + | |||
| + | Nové procesy vznikajú výlučne **kopírovaním** existujúceho procesu, ktorý vytvorí nový proces ako svojho potomka. Je to dôsledok toho, že procesy sú v Linuxe usporiadané do stromovej hierarchie, kde budeme v neskôr praktických ukážkach pozorovať vzťah **rodič-potomok** | ||
| + | |||
| + | Čo sa samotného vytvorenia procesu týka, po tom, čo nadradený proces vytvorí svoju identickú kópiu (systémové volanie '' | ||
| + | |||
| + | Vytvorme si teda nejaký proces, napr. príkazom '' | ||
| + | |||
| + | < | ||
| + | |||
| + | Program //ping// vznikol vytvorením kópie //shellu//, v ktorom sme ho spustili. A keďže proces musí mať nejaký PID, tak to overme jednoducho príkazom '' | ||
| + | |||
| + | < | ||
| + | $ pgrep ping | ||
| + | 2633 | ||
| + | </ | ||
| + | |||
| + | V tejto kapitole sme spomenuli, že všetky procesy vytvárajú stromovú hierarchiu s reláciou **rodič-potomok**. Teraz overme, že //shell//, v ktorom sme //ping// spustili je skutočne jeho rodičom. V našom druhom terminále spustime príkaz '' | ||
| + | |||
| + | < | ||
| + | $ pstree -p | grep ping | ||
| + | |-gnome-terminal-(2038)-+-bash(2153)---ping(2633) | ||
| + | </ | ||
| + | |||
| + | Vidíme, že náš //ping// s **PID == 2633** vznikol z nejakého //shellu// (PID == 2153), ktorý zase vznikol ako potomok programu // | ||
| - | Z pohľadu Linuxového kernelu je každý proces (bez rozdielu “vlákien”) iba // | ||
| - | Pri štarte (//boot//) sa vytvorí // | ||
| - | ==== Vytváranie ==== | ||
| - | Nové procesy sa vytvárajú doslova // | ||
| - | Používajú sa k tomu systémové volania: | ||
| - | * '' | ||
| - | * Volajúci proces (// | ||
| - | * Nový proces má vlastnú kópiu pamäte, navzájom si ju s volajúcim procesom neovplyvňujú. | ||
| - | * '' | ||
| - | * Môže naviac definovať napr. zdielanie niektorých vlastností s volajúcim procesom (pamäť, PID, otvorené súbory, …). | ||
| - | * Narozdiel of //fork()//, nepokračuje na tom istom exekučnom mieste, ale spustí parametrom predanú funkciu. | ||
| - | * '' | ||
| - | * Spúšťa nový program prostredníctvom zadaného //mena súboru// a // | ||
| === Manuálové stránky === | === Manuálové stránky === | ||
| - | * '' | + | * '' |
| - | * '' | + | * '' |
| - | * '' | + | ==== Komunikácia/ |
| + | |||
| + | === Úvod === | ||
| + | Komunikáciu v kontexte procesov všeobecne označujeme pojmom **medziprocesová komunikácia** (angl. // | ||
| + | - IPC//) a môže prebiehať na rôznych úrovniach: | ||
| + | * súbory | ||
| + | * signály | ||
| + | * správy (angl. //message passing// | ||
| + | * sokety | ||
| + | * rúry (angl. //pipe//) | ||
| + | * zdieľaná pamäť (angl. //shared memory//) | ||
| + | * iné | ||
| + | |||
| + | Pre potreby systémovej administrácie sa obmedzíme na **signály**, | ||
| + | |||
| + | Taká kontrola bude pravdepodobne najčastejšie spočívať v ukončení procesu, ale vo všeobecnosti plnia signály oznamovaciu funkciu pre daný proces, napr. proces sa pokúsil o neoprávnenú operáciu, nastala zmena vonkajšieho okolia (odpojenie kontrolného terminálu), | ||
| + | |||
| + | |||
| + | === Posielanie signálov procesom === | ||
| + | Samotné signály potom posielame procesom pomocou príkazu '' | ||
| + | * **SIGTERM** - nenásilné ukončenie programu | ||
| + | * **SIGKILL** - násilné ukončenie programu | ||
| + | * **SIGINT** - prerušenie z klávesnice (predvolená akcia je ukončenie) | ||
| + | * **SIGUSR1** - užívateľský signál (angl. // | ||
| + | * **SIGSTOP** - zastavenie procesu (proces existuje, ale nebeží) | ||
| + | * **SIGCONT** - pokračovanie procesu zastaveného SIGSTOP (!pozor, proces bude pokračovať na pozadí) | ||
| + | * **SIGHUP** - signalizácia odpojenia kontrolného terminálu | ||
| + | |||
| + | Syntax príkazu je veľmi jednoduchá: | ||
| + | |||
| + | < | ||
| + | ]$ kill [-signal] < | ||
| + | </ | ||
| + | |||
| + | ===SIGTERM, SIGKILL, a SIGINT=== | ||
| + | |||
| + | Pokiaľ nešpecifikujeme žiaden signál, pošle sa signál SIGTERM, na ktorý proces bežne reaguje tak, že zastaví činnosť, odstráni dočasné zdroje (napr. súbory, ak nejaké vytvoril) a skončí. To, že proces na tento signál po sebe " | ||
| + | |||
| + | Skúsme si teda najprv SIGTERM a SIGKILL. Spustime '' | ||
| + | < | ||
| + | # Terminal 1 | ||
| + | $ ping | ||
| + | |||
| + | # Terminal | ||
| + | $ pkill ping | ||
| + | </ | ||
| + | |||
| + | Proces '' | ||
| + | |||
| + | < | ||
| + | # Terminal 1 | ||
| + | $ ping | ||
| + | |||
| + | # Terminal 2 | ||
| + | $ pstree -p | grep ping | ||
| + | | ||
| + | $ kill 28628 | ||
| + | </ | ||
| + | |||
| + | Očakávaný výsledok je, že sa nestalo vôbec nič, pretože shell, ktorý beží '' | ||
| + | |||
| + | < | ||
| + | $ kill -SIGKILL 28628 | ||
| + | </ | ||
| + | |||
| + | Tentokrát by mal terminál a shell, v ktorom ping bežal, skončiť. Posledný z trojice je SIGINT, s ktorým sme sa už stretli v [[skoleni: | ||
| + | |||
| + | ===SIGUSR< | ||
| + | SIGUSR< | ||
| + | |||
| + | < | ||
| + | # ak nepouzijem ziadne parametre, tak prikaz bude kopirovat 0 do /dev/null (tzv.sink) donekonecna | ||
| + | $ dd if=/ | ||
| + | </ | ||
| + | |||
| + | My by sme ale radi vedeli, koľko dát sme takto už nakopírovali, | ||
| + | |||
| + | < | ||
| + | $ dd if=/ | ||
| + | [1] 30372 | ||
| + | |||
| + | # vyziadajme si statistiku | ||
| + | $ kill -SIGUSR1 30372 | ||
| + | 37224676+0 records in | ||
| + | 37224675+0 records out | ||
| + | 19059033600 bytes (19 GB, 18 GiB) copied, 32.4629 s, 587 MB/s | ||
| + | </ | ||
| + | |||
| + | ===SIGSTOP a SIGCONT=== | ||
| + | SIGSTOP je (ako názov napovedá) veľmi jednoznačný, | ||
| + | |||
| + | < | ||
| + | $ cat & | ||
| + | [1] 31827 | ||
| + | |||
| + | [1]+ Stopped | ||
| + | </ | ||
| + | |||
| + | Náš príkaz '' | ||
| + | |||
| + | < | ||
| + | # Terminal 1 | ||
| + | $ cat | ||
| + | |||
| + | # Terminal 2 | ||
| + | $ kill -SIGSTOP `pgrep cat` | ||
| + | |||
| + | # Terminal 1 | ||
| + | [1]+ Stopped | ||
| + | |||
| + | # Terminal 2 | ||
| + | # obnovme process cat | ||
| + | $ kill -SIGCONT `pgrep cat` | ||
| + | |||
| + | # Terminal 1 | ||
| + | [1]+ Stopped | ||
| + | </ | ||
| + | |||
| + | Náš proces '' | ||
| - | ==== Komunikácia ==== | + | ===SIGHUP=== |
| + | SIGHUP je signál, ktorý proces dostane v prípade, ak bol jeho kontrolný terminál alebo kontrolný proces odpojený. V praxi to znamená asi toľko, že všetky programy, ktoré z daného terminálu spustím (na popredí či na pozadí) skončia v momente keď okno terminálu zavrieme. Táto reťazová reakcia je špecifická pre UNIX shell, ktorý SIGHUP odchytí a všetkým procesom, ktorých je tento shell rodičom SIGHUP prepošle. My by sme ale radi niektoré procesy bežiace na pozadí radi pred SIGHUP zachránili, | ||
| - | Naopak, keď chceme proces // | ||
| < | < | ||
| - | ]$ kill <PID> | + | $ nohup ping mojefedora.cz & |
| + | [1] 588 | ||
| + | nohup: ignoring input and appending output to ' | ||
| </ | </ | ||
| - | Príkaz //kill// takto vlastne pošle terminačný //signál// ('' | ||
| - | Všeobecne sa s procesmi | + | Ak by teraz nadradený shell dostal SIGHUP (zavrieme okno terminálu), |
| - | Príkazom //kill// môžeme poslať v podstate aj ktorýkoľvek iný signál definovaný podľa **POSIX**. | + | |
| === Manuálové stránky === | === Manuálové stránky === | ||
| * '' | * '' | ||
| + | * '' | ||
| * '' | * '' | ||
| - | ==== Informácie a vlastnosti | + | ====Monitorovanie procesov==== |
| - | Z užívateľského prostredia (// | + | V predchádzajúcich sekciách sme načrtli príkaz '' |
| === Príkaz ps: === | === Príkaz ps: === | ||
| Řádek 695: | Řádek 826: | ||
| //Pozn.:// Procesy v hranatých zátvorkách '' | //Pozn.:// Procesy v hranatých zátvorkách '' | ||
| - | * '' | + | **Pozor:** Je rozdiel medzi prepínačmi s pomlčkou '' |
| - | * Zobrazí stromovú štruktúru (prípadne existuje aj '' | + | |
| - | < | + | |
| - | ]$ ps f | + | |
| - | 18653 pts/1 Ss 0:00 bash | + | |
| - | 10155 pts/1 R+ | + | |
| - | 6289 tty2 | + | |
| - | 6600 tty2 | + | |
| - | 7066 tty2 | + | |
| - | 7586 tty2 | + | |
| - | 7590 tty2 | + | |
| - | 7766 tty2 | + | |
| - | 8337 tty2 | + | |
| - | ...[ atď ]... | + | |
| - | </ | + | |
| - | + | ||
| - | **Pozor:** Je rozdiel medzi prepínačmi s pomlčkou '' | + | |
| === Príkaz top: === | === Príkaz top: === | ||
| - | Príkaz '' | + | Príkaz '' |
| - | Existuje mnoho možností, ako upraviť //ktoré// informácie '' | + | |
| < | < | ||
| ]$ top | ]$ top | ||
| Řádek 747: | Řádek 860: | ||
| </ | </ | ||
| - | Ako si môžete všimnúť, okrem informácií o procesoch, zobrazuje aj všelijaké iné informácie, | + | Okrem informácií o procesoch |
| - | Vysvetlenia jednotlivých údajov: | + | **Riadok 1 - uptime a load average** |
| - | | + | |
| - | | + | |
| - | * **S** - //interruptible sleep// - Spiaci | + | * priemerná záťaž systému (angl. |
| - | * **D** - // | + | * záťaž je vyjadrená vždy relatívne voči jednoprocesorovému systému, t.j. záťaž |
| - | * **Z** - //zombie// - Mŕtvy / Dokončený | + | |
| - | | + | |
| - | | + | **Riadok 2 - informácie o procesoch (úlohách)** |
| - | | + | * celkovo 313 procesov |
| - | | + | |
| - | * Treba interpretovať s ohľadom ku počtu aktívnych procesorov | + | |
| - | * '' | + | **Riadok 3 - %CPU - percentuálne vyjadrenie koľko procesorového času využívajú rôzne procesy** |
| + | * **us** - čas strávený behom užívateľských procesov bez priority | ||
| + | * **sy** - čas strávený behom systémových procesov | ||
| + | * **ni** - čas strávený behom už. procesov s prioritou (viď Niceness) | ||
| + | * zvyšok je čas strávený rôznymi druhmi prerušenia, | ||
| + | |||
| + | **Záhlavie procesov**: | ||
| + | * '' | ||
| + | * Tieto stĺpce ukazujú priority daného procesu, prípadne jeho // | ||
| + | |||
| + | * '' | ||
| + | * **R** - // | ||
| + | * **S** - // | ||
| + | * **D** - // | ||
| + | * **Z** - //zombie// - Mŕtvy / Dokončený | ||
| + | * **T** - //stopped / parked// - Zastavený | ||
| + | //Pozn.:// V systémoch UNIX je dobrým zvykom, aby rodičovské procesy čakali na ukončenie svojich potomkov, ak sa tak nestane, tak vznikajú tzv. //zombie// procesy - to sú také procesy, ktoré síce ukončili činnosť, no ich rodičovský proces nepotvrdil či neakceptoval ich ukončenie, a preto zostávajú uvedené v tabuľke procesov a zostanú v nej dovtedy, kým ich ukončenie niekto neprijme (ak by rodičovský proces skončil, prevezme ich automaticky //init// a ihneď prijme všetky ukončené procesy). Zombie procesy síce nespotrebovávajú výpočetné zdroje, ale blokujú dostupný PID, ak je v systéme príliš veľa zombie procesov, skonzumujú všetky možné PIDy a nebude možné vytvoriť nové procesy. | ||
| + | |||
| + | * '' | ||
| * **VIRT** - //virtual memory space (process block)// | * **VIRT** - //virtual memory space (process block)// | ||
| - | * Veškerá pamäť, ktorú má process k dispozícii (zásobník, | + | * Všetka pamäť, ktorú má process k dispozícii (zásobník, |
| * **RES/RSS** - //resident set size// | * **RES/RSS** - //resident set size// | ||
| * Časť (podmnožina) VIRT, ktorá je načítaná v RAM | * Časť (podmnožina) VIRT, ktorá je načítaná v RAM | ||
| * Zvyšok može byť na disku (//swap//) alebo SHR patriace inému procesu. | * Zvyšok može byť na disku (//swap//) alebo SHR patriace inému procesu. | ||
| * **SHR** - //shared memory// | * **SHR** - //shared memory// | ||
| - | * Časť, ktorá patrí tomuto procesu a je zároveň | + | * Časť, ktorá patrí tomuto procesu a je zároveň |
| * **%MEM** | * **%MEM** | ||
| * Koľko percent z celkovej dostupnej pamäte proces používa (RES / RAM) | * Koľko percent z celkovej dostupnej pamäte proces používa (RES / RAM) | ||
| - | * '' | + | Vďaka tomu, že '' |
| - | * Percento, koľko procesorového času tento //PID// využíva. (*) | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | * '' | + | < |
| - | * Tieto stĺpce ukazujú priority daného procesu, prípadne jeho // | + | $ sudo dnf install |
| - | * (O rôznych prioritách sa dočítate nižšie) | + | $ stress --cpu 1 |
| + | stress: info: [22255] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd | ||
| + | </code> | ||
| - | (*) // | + | < |
| + | $ top | ||
| + | |||
| + | top - 22:58:25 up 12 days, 16: | ||
| + | ... | ||
| + | | ||
| + | 22359 skoleni+ | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | Vidíme, že náš nežiadúci proces konzumuje takmer | ||
| + | |||
| + | < | ||
| + | # stlacme ' | ||
| + | ... | ||
| + | MiB Swap: 0.0 total, | ||
| + | PID to signal/kill [default pid = 22359] | ||
| + | ... | ||
| + | |||
| + | # Enter | ||
| + | # zvolme signal, my volime nasilnu cestu - sigkill | ||
| + | ... | ||
| + | Send pid 22359 signal [15/ | ||
| + | ... | ||
| + | |||
| + | # overme, ze proces ' | ||
| + | $ pgrep stress | ||
| + | $ | ||
| + | </ | ||
| === Manuálové stránky === | === Manuálové stránky === | ||
| Řádek 789: | Řádek 942: | ||
| * '' | * '' | ||
| - | Všimnite si, že aj '' | + | ====Pokročilé nástroje monitorovania==== |
| - | Totiž vačšinu dát oboje získavajú z rozhranií, ktoré poskytujú tieto informácie priamo z kernelu | + | ===Nástroj htop=== |
| - | Jedným z týchto rozhraní sú napríklad súbory v ''/ | + | Hoci je '' |
| + | |||
| + | {{: | ||
| + | |||
| + | ===Nástroj glances=== | ||
| + | '' | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ===Iné nástroje=== | ||
| + | * '' | ||
| + | * rozšírenie '' | ||
| + | * '' | ||
| + | * komplexný monitoring v rozhraní ncurses, jednotlivé aspekty systému sa dajú vypínať a zapínať podľa potreby, výstup je v podobe grafov | ||
| + | * '' | ||
| + | * v podstate '' | ||
| + | |||
| + | ==== Priorita a " | ||
| + | V predchádzajúcich sekciách boli spomenuté termíny ako // | ||
| + | |||
| + | === Plánovanie procesov === | ||
| + | Plánovanie je druh aktivity, ktorá nám dovoľuje multitasking, | ||
| + | |||
| + | ===Priority=== | ||
| + | Linux rozoznáva 140 priorít v 2 rôznych | ||
| + | * [1,99] pre // | ||
| + | * pre // | ||
| + | * [100,139] - interval pre normálne (// | ||
| + | |||
| + | **Niceness (NI)** | ||
| + | * hodnota v // | ||
| + | * rozsah [-20,19] - čím menšie číslo, tým väčšia priorita procesu | ||
| + | * NI slúži len ako váha pre plánovač, aby určil skutočnú prioritu PR | ||
| + | * na výpočet skutočnej priority sa používa vzťah: | ||
| + | < | ||
| + | |||
| + | My sa teraz zamierame na to, ako hodnoty //" | ||
| + | |||
| + | Spustime opäť '' | ||
| < | < | ||
| - | ]$ ls /proc/9629/ (PID 9629 bol vtedy môj //bash//) | + | $ nice -5 dd if=/dev/zero of=/dev/null & |
| - | attr coredump_filter | + | $ top |
| - | autogroup | + | 5537 skoleni |
| - | auxv cwd latency | + | 1437 skoleni |
| - | cgroup | + | ... |
| - | clear_refs | + | |
| - | cmdline | + | |
| - | comm fdinfo | + | |
| </ | </ | ||
| - | Nájdete tu napríklad '' | + | |
| - | Niektoré sú prezentované docela čitateľne: | + | Vidíme, že hoci sme spustili |
| < | < | ||
| - | ]$ cat / | + | $ stress |
| - | 56372e85a000-ffffffffff601000 | + | $ top |
| - | Rss: 5848 kB | + | 11361 skoleni |
| - | Pss: 3082 kB | + | 11360 skoleni |
| - | Shared_Clean: 3308 kB | + | 11362 skoleni |
| - | Shared_Dirty: | + | 11356 skoleni |
| - | Private_Clean: 48 kB | + | 11354 skoleni |
| - | Private_Dirty: 2492 kB | + | 11363 skoleni |
| - | Referenced: 5848 kB | + | 11358 skoleni |
| - | Anonymous: 2492 kB | + | 5537 skoleni |
| - | LazyFree: | + | 1437 skoleni |
| - | AnonHugePages: | + | |
| - | ShmemPmdMapped: | + | |
| - | Shared_Hugetlb: | + | |
| - | Private_Hugetlb: | + | |
| - | Swap: 0 kB | + | |
| - | SwapPss: | + | |
| - | Locked: 0 kB | + | |
| </ | </ | ||
| - | Iné sú však predané v neupravenom (tzv. //raw//) stave: | + | |
| + | Stress test nám nám úspešne vyťažuje celý systém. Skúsme niektorým z procesov '' | ||
| < | < | ||
| - | ]$ cat / | + | $ top |
| - | 9629 (bash) | + | PID USER PR NI VIRT RES SHR S |
| + | 11360 skoleni | ||
| + | 11361 skoleni | ||
| + | 11376 skoleni | ||
| + | 11363 skoleni | ||
| + | 11356 skoleni | ||
| </ | </ | ||
| - | ==== Monitorovanie ==== | + | Program '' |
| - | V prípade, keď chcete niektorý proces (alebo skupinu procesov monitorovať), | ||
| - | K tomu existuje program '' | ||
| < | < | ||
| - | ]$ pidstat | + | $ renice |
| - | Linux 4.17.7-100.fc27.x86_64 (dhcp-26-154.brq.redhat.com) 10/07/2018 _x86_64_ (4 CPU) | + | $ top |
| - | 09:09:11 PM | + | PID USER PR NI VIRT RES SHR S %CPU |
| - | 09:09:12 PM 1000 9629 0.00 0.00 124376 | + | 11361 skoleni |
| - | 09:09:13 PM 1000 9629 0.00 0.00 124376 | + | 11376 skoleni |
| - | 09:09:14 PM 1000 9629 | + | 11356 skoleni |
| - | 09:09:15 PM 1000 9629 0.00 0.00 124376 | + | 11363 skoleni |
| - | 09:09:16 PM 1000 9629 0.00 | + | 11360 skoleni |
| - | 09:09:17 PM 1000 9629 0.00 0.00 124376 | + | |
| - | ^C | + | |
| </ | </ | ||
| - | //Pozn.:// Legendy ku jednotlivým stĺpcom sú popísané | + | |
| + | Čo ak by sme naopak chceli prioritu zvýšiť (napr. pre program '' | ||
| + | < | ||
| + | $ renice 0 11376 | ||
| + | renice: failed to set priority for 11376: Permission denied | ||
| + | </code> | ||
| + | |||
| + | Vidíme, že na zvýšenie priority je potreba práva | ||
| + | |||
| + | //Úloha:// Skúste zvýšiť prioritu procesu s právami roota. | ||
| === Manuálové stránky === | === Manuálové stránky === | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| - | * '' | ||
| + | ===== Služby ===== | ||
| + | Službou v Linuxe nazývame aplikáciu (proces) alebo súbor aplikácií tvoriacich logický celok, ktoré bežia na pozadí a typicky čakajú na príchodzie požiadavky, | ||
| - | ==== Pokročilé nastavenia | + | ====Systemd units==== |
| + | Systemd nespravuje iba služby. Podobne ako plánovač v kerneli pristupuje k procesom a vláknam transparentne a jednotne ich nazýva //tasks//, systemd dokáže spravovať aj sokety, mount pointy, časovače ('' | ||
| + | //Pozn.//: všetky typy **// | ||
| - | === Priority a plánovanie === | + | Vstupnou bránou do správy //systemd// je príkaz '' |
| - | Vyššie ste mohli vidieť, že každý proces má svoju prioritu. Linux poskytuje 3 typy plánovačov (**// | + | Vypíšme si teda, aké jednotky v systéme vôbec máme. |
| - | Okrem priorít, poskytujú plánovače aj niekoľko rôznych plánovacích //tried// / // | + | < |
| + | $ systemctl list-units | ||
| + | </ | ||
| + | Príkaz nám vrátil zoznam úplne všetkých jednotiek, o ktorých systemd vie. Keďže my sa venujeme službám, tak pridaním prepínača sa obmedzíme iba na služby | ||
| - | | + | < |
| - | * Priorita vždy 0. | + | $ systemctl list-units -t service |
| - | * Použiva 40 tzv. //" | + | |
| - | * Cím // | + | abrt-journal-core.service |
| - | * Poskytuje 3 //triedy//: | + | ... |
| - | * **SCHED_OTHER** - úplne bežná trieda | + | upower.service |
| - | * **SCHED_IDLE** - bežia **iba** ak nie je žiadny ďalší process, ktorý by mohol | + | user-runtime-dir@1000.service |
| - | * **SCHED_BATCH** - vhodný pre dávkové alebo dlho-počítajúce processy | + | |
| + | | ||
| - | | + | LOAD |
| - | * Používa 99 priorít v rozsahu [1 .. 99]. | + | ACTIVE = The high-level unit activation state, i.e. generalization of SUB. |
| - | | + | SUB = The low-level unit activation state, values depend on unit type. |
| - | * Procesy s '' | + | |
| - | * Poskytuje 2 typy algoritmu: | + | |
| - | * **SCHED_FIFO** - proces beží pokiaľ neskončí alebo nejde späť | + | |
| - | * **SCHED_RR** - procesy sa striedajú podľa časového kvanta | + | |
| - | * '' | + | 61 loaded units listed. Pass --all to see loaded but inactive units, too. |
| - | * Používa špeciálny algoritmus: | + | To show all installed unit files use 'systemctl list-unit-files' |
| - | * **SCHED_DEADLINE** | + | </code> |
| - | * Na základe pridaných informácií o danom procese dokáže plánovať | + | |
| - | //Pozn.:// Všimnite si, že '' | + | Ako nám povedala nápoveda na konci, zoznam obsahuje iba aktívne služby, pre vypísanie úplne všetkých služieb by sme museli pridať parameter |
| - | Hodnoty //" | ||
| < | < | ||
| - | ]# renice | + | $ systemctl list-unit-files -t service |
| - | 9629 (process ID) old priority 0, new priority | + | |
| - | + | UNIT FILE | |
| - | ]# renice 25 9629 | + | abrt-ccpp.service |
| - | 9629 (process ID) old priority | + | abrt-journal-core.service |
| + | abrt-oops.service | ||
| + | abrt-pstoreoops.service | ||
| + | abrt-vmcore.service | ||
| + | ... | ||
| </ | </ | ||
| - | //Pozn.:// Všimnite si, že je poreba superužívateľské práva. | + | Vďaka týmto 2 veľmi podobným príkazom môžeme pozorovať základné vlastnosti každej služby, ktoré nám hovoria niečo o ich stave: |
| + | * **loaded** - konfiguračný súbor služby bol vporiadku načítaný | ||
| + | * **active** - tzv.//high-level// | ||
| + | * **sub** - tzv. //low-level// aktivačný stav, popisuje, či aplikácia reálne beží, skončila úspešne alebo s chybou | ||
| + | * **enabled** - značí, že služba má bežať po štarte systému | ||
| + | * **disabled** - značí, že služba nemá bežať po štarte systému, beží teda na vyžiadanie | ||
| + | |||
| + | Keď už sme si povedali, v akých stavoch sa služby môžu nachádzať, | ||
| - | Plánovací algoritmus sa určuje podľa plánovacej triedy a spolu s prioritami sa nastavujú napíklad príkazom '' | ||
| < | < | ||
| - | ]# chrt --pid 9629 | + | systemctl status sshd |
| - | pid 9629's current scheduling policy: SCHED_OTHER | + | ● sshd.service |
| - | pid 9629's current scheduling priority: 0 | + | |
| + | | ||
| + | Docs: man:sshd(8) | ||
| + | man:sshd_config(5) | ||
| + | Main PID: 819 (sshd) | ||
| + | Tasks: 1 (limit: 4915) | ||
| + | | ||
| + | | ||
| + | | ||
| + | Apr 21 19:14:04 skoleni systemd[1]: Starting OpenSSH server daemon... | ||
| + | Apr 21 19:14:04 skoleni sshd[819]: Server listening on 0.0.0.0 port 22. | ||
| + | Apr 21 19:14:04 skoleni sshd[819]: Server listening on :: port 22. | ||
| + | Apr 21 19:14:04 skoleni systemd[1]: Started OpenSSH server daemon. | ||
| + | </ | ||
| - | ]# chrt --fifo --pid 99 9629 | + | Z výstupu okrem iného vidíme, že služba '' |
| + | < | ||
| + | (root)$ systemctl start httpd | ||
| + | $ systemctl status httpd | ||
| + | ● httpd.service | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | |||
| + | Apache server síce beží, ale po reštarte už bežať nebude, je potrebné službu povoliť (// | ||
| + | |||
| + | < | ||
| + | (root)$ systemctl enable httpd | ||
| - | ]# chrt --pid 9629 | + | # overte, ze httpd bezi po restarte |
| - | pid 9629's current scheduling policy: SCHED_FIFO | + | $ systemctl status httpd |
| - | pid 9629's current scheduling priority: 99 | + | |
| </ | </ | ||
| - | Taktiež dokážeme | + | //Pozn.//: My sme si ukázali, ako naštartovať a povoliť službu v 2 krokoch, v praxi sa obe operácie dajú spraviť v 1 kroku za použitia '' |
| - | Táto vlastnosť sa najjednoduchšie nastavuje príkazom | + | |
| + | Analogicky by sa použili opačné operácie: | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | ===Manuálové stránky=== | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | |||
| + | ==== Konfiguračné súbory ==== | ||
| + | Konfiguračné súbory služieb môžu byť v systéme uložené hneď na niekoľkých miestach: | ||
| + | * ''/ | ||
| + | * ''/ | ||
| + | * ''/ | ||
| + | |||
| + | Občas ale potrebujeme konfiguráciu nainštalovaných služieb pozmeniť podľa našich požiadavkov. Ak teda nemáme pracovať s konfiguráciami v '' | ||
| + | |||
| + | My si to ukážeme na príklade s '' | ||
| < | < | ||
| - | ]# taskset | + | # najprv simulujme pad httpd bez zmeny nastaveni |
| - | pid 9629's current affinity list: 0-3 | + | (root)$ pkill -SIGSEGV httpd |
| - | pid 9629's new affinity list: 2,3 | + | (root)$ systemctl status httpd |
| + | ● httpd.service | ||
| + | | ||
| + | Drop-In: / | ||
| + | | ||
| + | | ||
| + | Docs: man: | ||
| + | Process: 7177 ExecStart=/ | ||
| + | Main PID: 7177 (code=dumped, signal=SEGV) | ||
| + | | ||
| + | </ | ||
| - | Teraz bude PID 9629 plánovaný iba na logických procesoroch 2 a 3 (CPU) | + | Upravme teda nastavenie '' |
| + | < | ||
| + | (root)$ systemctl edit httpd | ||
| + | [Service] | ||
| + | Restart=on-abnormal | ||
| - | ]# taskset | + | # overme, ze override.conf sa vytvoril nasou zmenou |
| - | pid 9629's current affinity list: 2,3 | + | (root)$ systemctl cat httpd |
| - | pid 9629's new affinity list: 0-3 | + | ... |
| + | # / | ||
| + | [Service] | ||
| + | Restart=on-abnormal | ||
| + | ... | ||
| + | |||
| + | # teraz nastartujme httpd znovu a vyskusajme nasimulovat pad | ||
| + | (root)$ systemctl restart httpd | ||
| + | (root)$ pkill -SIGSEGV httpd | ||
| + | ● httpd.service | ||
| + | | ||
| + | Drop-In: / | ||
| + | | ||
| + | | ||
| + | Docs: man: | ||
| + | Main PID: 7846 (httpd) | ||
| </ | </ | ||
| - | === Manuálové stránky === | + | ===Manuálové stránky=== |
| - | * '' | + | * '' |
| - | * '' | + | * '' |
| - | * '' | + | * '' |
| - | * '' | + | |
| - | * '' | + | |
| - | ==== Bonus: Kontrol-grupy (cgroups) | + | ====Vytvárame systémovú službu==== |
| + | V predchádzajúcej sekcii sme si na príklade ukázali ako zmeniť konfiguráciu existujúcej služby. V tejto sekcii si vytvoríme vlastnú službu úplne od začiatku. V našom prípade pôjde o systémovú službu a preto budú potrebné práva **roota** po celý čas. | ||
| - | Linux kernel poskytuje administrátorom komplexné rozhranie (tzv. //kontrol-grupy// - // | + | Vyrobme službu, ktorá nám zaloguje aktuálny dátum a nazvime ju **mydate.service** a vytvoríme príslušný súbor v '' |
| - | Okrem všetkého čo je spomenuté vyššie, dokážu aj nastaviť pamäťové limity, obmedziť prístup k zariadeniam, | + | |
| - | Sú logicky rozdelené podľa rôznych podsystémov, | + | |
| < | < | ||
| - | ]$ ls /sys/fs/cgroup/ | + | (root)$ cat /etc/systemd/system/mydate.service |
| - | blkio cpuacct | + | [Unit] |
| - | cpu cpu, | + | Description=Ukazem datum |
| + | |||
| + | [Service] | ||
| + | Type=oneshot | ||
| + | ExecStart=date | ||
| </ | </ | ||
| - | Detailné vysvetlenie používania tejto technológie si však vyžaduje podstatne viac znalostí o jednotlivých podsystémoch a nie je predmetom tohoto školenia. | ||
| - | Dokumentáciu | + | Parameter |
| + | K tomu, aby systemd vedel o našej novej službe je potrebné najskôr zabezpečiť, | ||
| + | < | ||
| + | (root)$ ls -lZ /etc/systemd/ | ||
| + | -rw-r--r--. 1 root root unconfined_u: | ||
| + | (root)$ restorecon -FRvv / | ||
| + | Relabeled / | ||
| + | </ | ||
| - | ===== Služby ===== | + | Teraz už môžeme povedať systemd o našej novej službe, to sa robí príkazom '' |
| + | < | ||
| + | (root)$ systemctl daemon-reload | ||
| + | (root)$ systemctl list-unit-files -t service mydate.service | ||
| + | UNIT FILE STATE | ||
| + | mydate.service disabled | ||
| - | Túto časť ešťe | + | </ |
| + | |||
| + | Po naštartovaní služby by sme mali vidieť zmenu v logu: | ||
| + | < | ||
| + | (root)$ systemctl start mydate | ||
| + | (root)$ systemctl status mydate | ||
| + | ● mydate.service - Ukazem datum | ||
| + | | ||
| + | Drop-In: / | ||
| + | | ||
| + | | ||
| + | |||
| + | (root)$ journalctl -e -u mydate | ||
| + | Apr 22 14:01:27 skoleni systemd[1]: Starting Ukazem datum... | ||
| + | Apr 22 14:01:27 skoleni date[8755]: Mon Apr 22 14:01:27 CEST 2019 | ||
| + | Apr 22 14:01:27 skoleni systemd[1]: Started Ukazem datum. | ||
| + | </ | ||
| + | |||
| + | Zároveň vidíme, že tým, že je naša služba nastavená ako // | ||
| + | < | ||
| + | (root)$ systemctl cat mydate.service | ||
| + | |||
| + | # / | ||
| + | [Unit] | ||
| + | Description=Ukazem datum | ||
| + | |||
| + | [Service] | ||
| + | Type=oneshot | ||
| + | ExecStart=date | ||
| + | |||
| + | # / | ||
| + | [Service] | ||
| + | RemainAfterExit=yes | ||
| + | </ | ||
| + | |||
| + | Ďalej by sme chceli, aby sa naša služba púšťala vždy po štarte systému, tak ju skúsme povoliť, ako sme si ukazovali vyššie | ||
| + | |||
| + | < | ||
| + | (root)$ systemctl enable myservice | ||
| + | The unit files have no installation config (WantedBy, RequiredBy, Also, Alias | ||
| + | settings in the [Install] section, and DefaultInstance for template units). | ||
| + | This means they are not meant to be enabled using systemctl. | ||
| + | Possible reasons for having this kind of units are: | ||
| + | 1) A unit may be statically enabled by being symlinked from another unit' | ||
| + | | ||
| + | 2) A unit's purpose may be to act as a helper for some other unit which has | ||
| + | a requirement dependency on it. | ||
| + | 3) A unit may be started when needed via activation (socket, path, timer, | ||
| + | | ||
| + | 4) In case of template units, the unit is meant to be enabled with some | ||
| + | | ||
| + | </ | ||
| + | |||
| + | Systemd nám hneď povie, že s našou konfiguráciou nie je niečo vporiadku. Chýba nám tam totiž sekcia '' | ||
| + | |||
| + | ====Systemd target==== | ||
| + | Systemd **target** je špeciálny druh jednotky, ktorý zoskupuje iné jednotky a vytvára tak určitý synchronizačný // | ||
| + | < | ||
| + | $ systemctl cat httpd | ||
| + | [Unit] | ||
| + | ... | ||
| + | After=network.target remote-fs.target nss-lookup.target httpd-init.service | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | Takýchto synchronizačných bodov je v systemd niekoľko a tie úplne najzákladnejšie korešpondujú s operačnými režimami sytému **SysV**, známymi ako // | ||
| + | Vráťme sa teda k našej službe a nastavme ju ako službu spustiteľnú vrámci '' | ||
| + | |||
| + | < | ||
| + | (root)$ systemctl cat mydate | ||
| + | ... | ||
| + | # / | ||
| + | [Service] | ||
| + | RemainAfterExit=yes | ||
| + | |||
| + | [Install] | ||
| + | WantedBy=multi-user.target | ||
| + | |||
| + | (root)$ systemctl enable mydate | ||
| + | Created symlink / | ||
| + | (root)$ systemctl status mydate | ||
| + | ● mydate.service - Ukazem datum | ||
| + | | ||
| + | ... | ||
| + | </ | ||
| + | ===Manuálové stránky=== | ||
| + | * '' | ||
| + | * '' | ||