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/05 13:18] – [Mažeme ACL práva] lruzicka | skoleni:sprava_uzivatelu_a_sluzeb [2022/11/14 11:26] (aktuální) – upraveno mimo DokuWiki 127.0.0.1 | ||
---|---|---|---|
Řádek 1: | Řádek 1: | ||
- | ====== Nástřel ====== | ||
- | |||
- | * Uživatelé | ||
- | * Má nějaký název (např. teď jste přihlášeni za uživatele " | ||
- | * Může mít i delší jméno nebo popis (gecos) | ||
- | * Má domovský adresář | ||
- | * Uživatelů ja na každém systému několik | ||
- | * Skupiny | ||
- | * Skupina má název | ||
- | * Každý uživatel je součástí alespoň jedné skupiny | ||
- | * Může být (a zpravidla bývá) součástí skupin více | ||
- | * Identifikátory | ||
- | * Uživatelé mají UID | ||
- | * Skupny mají GID | ||
- | * Uživatelé jsou tudíž asociováni se seznamem GID | ||
- | * Názvy jsou pro jednodušší použití a identifikaci (syntactic sugar), ale hlavní je ID | ||
- | * Jak je to uložené v systému | ||
- | * Vypsat /etc/passwd a /etc/group | ||
- | * Jsou tam vsechny veci o kterych jsme se bavili (uid, gid, home, atd.) | ||
- | * Všimli jste si něčeho zajímavého? | ||
- | * Zajímavosti s vysvétlením (strucnym) | ||
- | * root - administrátor | ||
- | * nejen názvem, ale má speciální práva | ||
- | * UID 0 | ||
- | * Uzivatel " | ||
- | * Spousta uzivatelu s UID <1000 (systemovi) | ||
- | |||
- | * Příkazy | ||
- | * Soubory které jsme si vypsali, tak se zásadné needitují ručně (stačí malá chyba a už se nepřihlásíte) | ||
- | * id, id < | ||
- | * useradd (nefunguje, vypise to chybu) | ||
- | * prepnout na roota (rozdil mezi `su` a `su -`) | ||
- | * useradd | ||
- | * passwd (nastavit mu nejake heslo) | ||
- | * otevrit novou zalozku v teminalu a tam se prepnout (su -) na noveho uzivatele | ||
- | * id | ||
- | * passwd za uzivatele | ||
- | * zpet v prvni zalozce (za roota) | ||
- | * groupadd | ||
- | * usermod (pridat grupu uzivateli, bacha na rozdil mezi `-G` a `-a -G`) | ||
- | * v druhe zalozce (za noveho uzivatele) | ||
- | * id (neni v nove grupe, vysvetlit, ze se to aplikuje az po prihlaseni) | ||
- | * Jak zrušit uzivatele | ||
- | * userdel - používat opatrně, nesmaže všechno co uživatel vlastnil | ||
- | * raději e.g. `chage -E 0` - expirovat ho, pockat nejakou dobu a pak ho smazat pomocit userdel (s parametry pro smazani domovskeho adresare) a pomoci `find` najit vse co vlastnil a smazat (aspon zminit, ze je to dulezite pro konzistenci systemu) | ||
- | * Pravidla pro uzivatele (politiky) | ||
- | * Soubor / | ||
- | * Minimalni/ | ||
- | * Lze pro konkretniho uzivatele menit pomoci chage | ||
- | |||
- | * Práva | ||
- | * Znovu si vypíšeme soubory / | ||
- | * Nikde není uložené heslo | ||
- | * Vypíšeme /etc/shadow | ||
- | * Abysme vytvořili uživatele, tak jsme se museli přepnout na roota, on je totiž vlastníkem těch souborů | ||
- | * ls -l / | ||
- | * "root root" je vlastník uživatel a vlastník skupina | ||
- | * co je ten řetězec na začátku řádku (např. rw-r--r--) | ||
- | * vysvetlit zakladni prava (rwx), zatim vynechat rozdily mezi soubory a adresari | ||
- | * **tady bude v prezentaci kratky kahoot, ktery navede na to, ze si muzeme zmenit heslo, ale pritom nemame pravo zapisovat do toho souboru kde je ulozene** | ||
- | * vysvetlit setuid, setgid, sticky bit | ||
- | * vysvetlit rozdily mezi adresari a soubory (tohle bude muset byt nejspis spojene s predchozim bodem, samostatne to asi nebude davat smysl) | ||
- | * Priklady prav na adresarich | ||
- | * /tmp (sticky bit na adresari) | ||
- | * /home (chybi r i x pro others) | ||
- | * mozna rict, ze kdyz uzivatel A rekne uzivateli B aby si od nej precetl neco z / | ||
- | * ACL | ||
- | * existuji nejake ACL | ||
- | * {get, | ||
- | * priklady: | ||
- | * povoleni vice ruznych skupin | ||
- | * povoleni ruznych lidi co nejsou v nejake skupine | ||
- | * dynamicnost (muzu pridelavat/ | ||
- | * konkretni priklady: | ||
- | * neco kde consolekit pridava prava lokalne prihlasenemu uzivateli (napada me jen /dev/video* zatim) | ||
- | |||
- | |||
- | |||
- | ====== Puvodni osnova (tipy) ====== | ||
- | * uživatelé v Linuxu (root, systémoví uživatelé, | ||
- | * účet superuživatele (root) - jeho vlastnosti, práva a povinnosti | ||
- | * skupina wheel | ||
- | * / | ||
- | * soubory / | ||
- | * UID, GID, EUID, EGID, SETUID (prijit na to pres to jak passwd funguje) | ||
- | * vytváření uživatelů (CLI) | ||
- | * mazání uživatelů (CLI) | ||
- | * nastavování vlastností uživatelům | ||
- | * expirace hesel | ||
- | * expirace účtů (chage/ | ||
- | * domovský adresář, důsledky absence domovského adresáře | ||
- | * přihlašovací shell, / | ||
- | * co si mohou nastavit sami uživatelé, | ||
- | * alternativní způsoby správy uživatelů (GUI, Cockpit, ...) | ||
- | * Skupiny | ||
- | * funkce a vlastnosti | ||
- | * vytváření a mazání | ||
- | |||
- | * Unixová práva v systému | ||
- | * co jsou to práva a proč jsou důležitá? | ||
- | * co to je vlastnictví? | ||
- | * práva vlastníka, skupiny a ostatních | ||
- | * čtení, zápis, spouštění | ||
- | * setuid bit, sticky bit | ||
- | * Nastavování práv | ||
- | * nastavení vlastnictví (chown) | ||
- | * nastavení práv (" | ||
- | * nastavení setuid (" | ||
- | * nastavení setgid (" | ||
- | * sticky bit (" | ||
- | * Tabulečku na efekty | ||
- | * Práva na < | ||
- | * Rozšířená práva (ACL) | ||
- | * Jak fungují rozšířená práva? Jak se doplňují se standardními právy? | ||
- | * Zobrazení ACL práv (getfacl) | ||
- | * Nastavení ACL práv (setfacl) | ||
- | * Zmínit pristup víc skupin | ||
- | |||
====== Správa užívateľov ====== | ====== Správa užívateľov ====== | ||
Existencia a potreba užívateľských účtov je jedným z fundamentálnych predpokladov systémov odvodených z UNIXu. Užívateľské účty tvoria spolu so skupinami bázu pre kontrolu riadenia prístupu k zdrojom (angl. //resource access control//). | Existencia a potreba užívateľských účtov je jedným z fundamentálnych predpokladov systémov odvodených z UNIXu. Užívateľské účty tvoria spolu so skupinami bázu pre kontrolu riadenia prístupu k zdrojom (angl. //resource access control//). | ||
Řádek 139: | Řá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 264: | Řádek 146: | ||
* '' | * '' | ||
- | ===== Príkazy na správu | + | ===== Spravujeme |
V predchádzajúcich sekciách sme získali základné povedomie o užívateľoch a | V predchádzajúcich sekciách sme získali základné povedomie o užívateľoch a | ||
skupinách. Nadobudnuté poznatky teraz využijeme v praktických ukážkach správy | skupinách. Nadobudnuté poznatky teraz využijeme v praktických ukážkach správy | ||
Řádek 461: | Řá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 474: | Řádek 356: | ||
* '' | * '' | ||
- | ===== Príkazy na správu skupín | + | ===== Spravujeme skupiny |
V tejto sekcii si ukážeme ako pridať do systému novú skupinu a ako si za | V tejto sekcii si ukážeme ako pridať do systému novú skupinu a ako si za | ||
bežného užívateľa zmeniť primárnu skupinu. Ostatné operácie nad skupinami sú | bežného užívateľa zmeniť primárnu skupinu. Ostatné operácie nad skupinami sú | ||
Řádek 516: | Řádek 398: | ||
- nové nariadenie školy taktiež prikazuje z bezpečnostných dôvodov meniť študentom heslo každý mesiac | - nové nariadenie školy taktiež prikazuje z bezpečnostných dôvodov meniť študentom heslo každý mesiac | ||
- //honza// a //pepa// patria do skupiny '' | - //honza// a //pepa// patria do skupiny '' | ||
- | - //honza// sa rozhodol prestúpiť z matematického do fyzikálneho krúžku, | + | - //honza// sa rozhodol prestúpiť z fyzikálneho |
- //pepa// je krutoprísny a rád by si nastavil login shell na ''/ | - //pepa// je krutoprísny a rád by si nastavil login shell na ''/ | ||
- //petr// prestúpil na inú školu, preto je treba jeho účet bezpečne invalidovať, | - //petr// prestúpil na inú školu, preto je treba jeho účet bezpečne invalidovať, | ||
Řádek 522: | Řádek 404: | ||
====== Práva v Linuxu ====== | ====== Práva v Linuxu ====== | ||
- | ===== Co jsou to práva? ===== | + | ===== Co jsou to přístupová |
V Linuxu má každý uživatel oprávnění (**právo**) provádět různé činnosti, například procházet adresáře, číst a zapisovat soubory, pracovat se zařízeními a systémovými prostředky, | V Linuxu má každý uživatel oprávnění (**právo**) provádět různé činnosti, například procházet adresáře, číst a zapisovat soubory, pracovat se zařízeními a systémovými prostředky, | ||
Řádek 631: | Řádek 513: | ||
< | < | ||
- | Co ale dělat v případě, že například chceme, aby si každý uživatel mohl sám sobě změnit heslo, aniž by k tomu potřeboval znát heslo správce? Program '' | + | Co ale dělat v případě, že například chceme, aby si každý uživatel mohl sám sobě změnit heslo, aniž by k tomu potřeboval znát heslo správce? Program '' |
< | < | ||
Řádek 729: | Řádek 611: | ||
Pro veškeré další použití můžete přečíst manuálové stránky příkazu '' | Pro veškeré další použití můžete přečíst manuálové stránky příkazu '' | ||
+ | |||
+ | |||
====== Správa služeb a procesů ====== | ====== Správa služeb a procesů ====== | ||
- | * proces | + | ===== Procesy ===== |
- | * co to je | + | |
- | * jak se identifikuji | + | Termínom |
- | * dedicnost | + | |
- | * posilani signalu | + | ==== Vytvorenie procesu ==== |
- | * top | + | |
- | * /proc/PID | + | Nové procesy vznikajú výlučne |
- | * init proces | + | |
- | * co je a na co to je | + | Čo sa samotného vytvorenia procesu týka, po tom, čo nadradený proces vytvorí svoju identickú kópiu (systémové volanie '' |
- | * Typy, historie | + | |
- | * systemd | + | Vytvorme si teda nejaký proces, napr. príkazom '' |
- | * sluzby | + | |
- | * co je to | + | < |
- | * rozdily oproti jinym procesum | + | |
- | * jak se to ovlada | + | 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 '' |
- | * start/stop | + | |
- | * enable/disable | + | < |
- | * list-units | + | $ pgrep ping |
- | | + | 2633 |
- | * isolate | + | </ |
- | * journalctl | + | |
- | * strucny priklad vytvorenia | + | V tejto kapitole sme spomenuli, že všetky procesy vytvárajú stromovú hierarchiu s reláciou |
+ | |||
+ | < | ||
+ | $ 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 // | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | === 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 2 | ||
+ | $ 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 '' | ||
+ | |||
+ | ===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, | ||
+ | |||
+ | < | ||
+ | $ nohup ping mojefedora.cz & | ||
+ | [1] 588 | ||
+ | nohup: ignoring input and appending output to ' | ||
+ | </ | ||
+ | |||
+ | Ak by teraz nadradený shell dostal SIGHUP (zavrieme okno terminálu), | ||
+ | |||
+ | === Manuálové stránky === | ||
+ | | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | ====Monitorovanie procesov==== | ||
+ | V predchádzajúcich sekciách sme načrtli príkaz '' | ||
+ | |||
+ | === Príkaz ps: === | ||
+ | * Vypíše zoznam procesov a informácie o nich. | ||
+ | * Rôzne informácie, | ||
+ | |||
+ | Príklady: | ||
+ | * '' | ||
+ | * Zobrazí procesy spustené aktuálnym užívateľom v aktuálnom termináli. | ||
+ | < | ||
+ | ]$ ps | ||
+ | PID TTY TIME CMD | ||
+ | 8276 pts/1 00:00:00 ps <- tento príkaz “ps” | ||
+ | 18653 pts/1 00:00:00 bash <- tento terminál (bash) | ||
+ | </ | ||
+ | * '' | ||
+ | * Zobrazí všetky procesy vlastnené aktuálnym užívateľom. | ||
+ | < | ||
+ | ]$ ps u | ||
+ | -> Vyskúšajte | ||
+ | </ | ||
+ | * '' | ||
+ | * Zobrazí všetky existujúce procesy na tomto systeme. | ||
+ | < | ||
+ | ]$ ps aux | ||
+ | USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND | ||
+ | root | ||
+ | root | ||
+ | root | ||
+ | root | ||
+ | root | ||
+ | root | ||
+ | root | ||
+ | …[ a veľa ďalších ]… | ||
+ | </ | ||
+ | //Pozn.:// Procesy v hranatých zátvorkách '' | ||
+ | |||
+ | **Pozor:** Je rozdiel medzi prepínačmi s pomlčkou '' | ||
+ | |||
+ | === Príkaz top: === | ||
+ | |||
+ | Príkaz '' | ||
+ | < | ||
+ | ]$ top | ||
+ | top - 17:09:51 up 6 days, 8:29, 1 user, load average: 0.95, 0.86, 0.74 | ||
+ | Tasks: 313 total, | ||
+ | %Cpu(s): | ||
+ | KiB Mem : 11857404 total, | ||
+ | KiB Swap: 6033404 total, | ||
+ | |||
+ | | ||
+ | 8476 user | ||
+ | 23078 user | ||
+ | 17343 user | ||
+ | 8598 user | ||
+ | 8337 user | ||
+ | 6600 user | ||
+ | 8500 user | ||
+ | 477 root | ||
+ | 981 rtkit 21 | ||
+ | 1102 root | ||
+ | 1538 gdm 20 | ||
+ | 8568 qemu | ||
+ | 10653 user | ||
+ | 12428 user | ||
+ | 1 root | ||
+ | 2 root | ||
+ | 3 root 0 -20 | ||
+ | 5 root 0 -20 | ||
+ | </ | ||
+ | |||
+ | Okrem informácií o procesoch nám '' | ||
+ | |||
+ | **Riadok 1 - uptime a load average** | ||
+ | * aktuálny čas a koľko času ubehlo od posledného štartu systému (6 dní). | ||
+ | * počet aktívnych užívateľov v systéme - koľko sedení (angl. // | ||
+ | * priemerná záťaž systému (angl. //load average//) za posledných 1 / 5 / 15 minút | ||
+ | * záťaž | ||
+ | |||
+ | **Riadok 2 - informácie o procesoch (úlohách)** | ||
+ | * celkovo 313 procesov (úloh), 2 aktuálne bežia, 246 sú v spánkovom režime, žiadne procesy nie sú pozastavené ani zombie (viď __Stavy procesu__ nižšie) | ||
+ | |||
+ | **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 | ||
+ | |||
+ | **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)// | ||
+ | * Všetka pamäť, ktorú má process k dispozícii (zásobník, | ||
+ | * **RES/RSS** - //resident set size// | ||
+ | * Časť (podmnožina) VIRT, ktorá | ||
+ | * Zvyšok može byť na disku (//swap//) alebo SHR patriace inému procesu. | ||
+ | * **SHR** - //shared memory// | ||
+ | * Časť, ktorá patrí tomuto procesu a je zároveň zdieľaná. | ||
+ | * **%MEM** | ||
+ | * Koľko percent z celkovej dostupnej pamäte proces používa (RES / RAM) | ||
+ | |||
+ | Vďaka tomu, že '' | ||
+ | |||
+ | < | ||
+ | $ sudo dnf install -y stress | ||
+ | $ stress --cpu 1 | ||
+ | stress: info: [22255] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | $ top | ||
+ | |||
+ | top - 22:58:25 up 12 days, 16: | ||
+ | ... | ||
+ | PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND | ||
+ | 22359 skoleni+ | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | Vidíme, že náš nežiadúci proces konzumuje takmer 100% procesorového času, vráťme sa k interaktívnemu '' | ||
+ | |||
+ | < | ||
+ | # 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 === | ||
+ | | ||
+ | * '' | ||
+ | |||
+ | ====Pokročilé nástroje monitorovania==== | ||
+ | ===Nástroj htop=== | ||
+ | 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 rozsahoch | ||
+ | | ||
+ | * pre // | ||
+ | * [100,139] - interval pre normálne (// | ||
+ | |||
+ | **Niceness (NI)** | ||
+ | * hodnota v // | ||
+ | * rozsah [-20,19] - čím menšie číslo, tým väčšia priorita procesu (štandardne však 0) | ||
+ | * 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äť '' | ||
+ | < | ||
+ | $ nice -5 dd if=/ | ||
+ | $ top | ||
+ | 5537 skoleni | ||
+ | 1437 skoleni | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | Vidíme, že hoci sme spustili '' | ||
+ | < | ||
+ | $ stress -c 5 -m 3 -i 2 & | ||
+ | $ top | ||
+ | 11361 skoleni | ||
+ | 11360 skoleni | ||
+ | 11362 skoleni | ||
+ | 11356 skoleni | ||
+ | 11354 skoleni | ||
+ | 11363 skoleni | ||
+ | 11358 skoleni | ||
+ | 5537 skoleni | ||
+ | 1437 skoleni | ||
+ | </ | ||
+ | |||
+ | Stress test nám nám úspešne vyťažuje celý systém. Skúsme niektorým z procesov '' | ||
+ | |||
+ | < | ||
+ | $ top | ||
+ | PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND | ||
+ | 11360 skoleni | ||
+ | 11361 skoleni | ||
+ | 11376 skoleni | ||
+ | 11363 skoleni | ||
+ | 11356 skoleni | ||
+ | </code> | ||
+ | |||
+ | Program '' | ||
+ | |||
+ | < | ||
+ | $ renice -n 15 11360 | ||
+ | $ top | ||
+ | |||
+ | PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND | ||
+ | 11361 skoleni | ||
+ | 11376 skoleni | ||
+ | 11356 skoleni | ||
+ | 11363 skoleni | ||
+ | 11360 skoleni | ||
+ | </ | ||
+ | |||
+ | Čo ak by sme naopak chceli prioritu zvýšiť | ||
+ | < | ||
+ | $ renice 0 11376 | ||
+ | renice: failed to set priority for 11376: Permission denied | ||
+ | </ | ||
+ | |||
+ | Vidíme, že na zvýšenie priority je potreba práva užívateľa **root**. Je to bezpečnostné opatrenie, aby si aplikácie samy nemohli prioritu zvyšovať a ochromiť celý systém. | ||
+ | |||
+ | //Úloha:// Skúste zvýšiť prioritu procesu s právami roota. | ||
+ | |||
+ | === 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, | ||
+ | |||
+ | ====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 **// | ||
+ | |||
+ | Vstupnou bránou do správy //systemd// je príkaz '' | ||
+ | |||
+ | Vypíšme si teda, aké jednotky v systéme vôbec máme. | ||
+ | < | ||
+ | $ systemctl | ||
+ | </ | ||
+ | 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 | ||
+ | |||
+ | < | ||
+ | $ systemctl list-units -t service | ||
+ | | ||
+ | abrt-journal-core.service | ||
+ | ... | ||
+ | upower.service | ||
+ | user-runtime-dir@1000.service | ||
+ | user@1000.service | ||
+ | wpa_supplicant.service | ||
+ | |||
+ | LOAD = Reflects whether the unit definition was properly loaded. | ||
+ | ACTIVE = The high-level unit activation state, i.e. generalization of SUB. | ||
+ | SUB = The low-level unit activation state, values depend on unit type. | ||
+ | |||
+ | 61 loaded units listed. Pass --all to see loaded but inactive units, too. | ||
+ | To show all installed unit files use ' | ||
+ | </ | ||
+ | |||
+ | 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 '' | ||
+ | |||
+ | < | ||
+ | $ systemctl list-unit-files -t service | ||
+ | |||
+ | UNIT FILE | ||
+ | abrt-ccpp.service | ||
+ | abrt-journal-core.service | ||
+ | abrt-oops.service | ||
+ | abrt-pstoreoops.service | ||
+ | abrt-vmcore.service | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | 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: | ||
+ | | ||
+ | * **active** - tzv.// | ||
+ | * **sub** - tzv. // | ||
+ | * **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ť, | ||
+ | |||
+ | < | ||
+ | systemctl status sshd | ||
+ | ● sshd.service - OpenSSH server daemon | ||
+ | | ||
+ | | ||
+ | Docs: man: | ||
+ | | ||
+ | Main PID: 819 (sshd) | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | 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. | ||
+ | </ | ||
+ | |||
+ | Z výstupu okrem iného vidíme, že služba '' | ||
+ | < | ||
+ | (root)$ systemctl start httpd | ||
+ | $ systemctl status httpd | ||
+ | ● httpd.service - The Apache HTTP Server | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | Apache server síce beží, ale po reštarte už bežať nebude, je potrebné službu povoliť (// | ||
+ | |||
+ | < | ||
+ | (root)$ systemctl enable httpd | ||
+ | |||
+ | # overte, ze httpd bezi po restarte | ||
+ | $ systemctl status httpd | ||
+ | </ | ||
+ | |||
+ | //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 '' | ||
+ | |||
+ | 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 '' | ||
+ | |||
+ | < | ||
+ | # najprv simulujme pad httpd bez zmeny nastaveni | ||
+ | (root)$ pkill -SIGSEGV httpd | ||
+ | (root)$ systemctl status httpd | ||
+ | ● httpd.service - The Apache HTTP Server | ||
+ | | ||
+ | Drop-In: / | ||
+ | | ||
+ | | ||
+ | Docs: man: | ||
+ | Process: 7177 ExecStart=/ | ||
+ | Main PID: 7177 (code=dumped, | ||
+ | | ||
+ | </ | ||
+ | |||
+ | Upravme teda nastavenie '' | ||
+ | < | ||
+ | (root)$ systemctl edit httpd | ||
+ | [Service] | ||
+ | Restart=on-abnormal | ||
+ | |||
+ | # overme, ze override.conf sa vytvoril nasou zmenou | ||
+ | (root)$ systemctl cat httpd | ||
+ | ... | ||
+ | # / | ||
+ | [Service] | ||
+ | Restart=on-abnormal | ||
+ | ... | ||
+ | |||
+ | # teraz nastartujme httpd znovu a vyskusajme nasimulovat pad | ||
+ | (root)$ systemctl restart httpd | ||
+ | (root)$ pkill -SIGSEGV httpd | ||
+ | ● httpd.service - The Apache HTTP Server | ||
+ | | ||
+ | Drop-In: / | ||
+ | | ||
+ | | ||
+ | Docs: man: | ||
+ | Main PID: 7846 (httpd) | ||
+ | </ | ||
+ | |||
+ | ===Manuálové stránky=== | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | ====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. | ||
+ | |||
+ | 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 ''/ | ||
+ | < | ||
+ | (root)$ cat / | ||
+ | [Unit] | ||
+ | Description=Ukazem datum | ||
+ | |||
+ | [Service] | ||
+ | Type=oneshot | ||
+ | ExecStart=date | ||
+ | </ | ||
+ | |||
+ | Parameter '' | ||
+ | K tomu, aby systemd vedel o našej novej službe je potrebné najskôr zabezpečiť, | ||
+ | < | ||
+ | (root)$ ls -lZ / | ||
+ | -rw-r--r--. 1 root root unconfined_u: | ||
+ | (root)$ restorecon -FRvv / | ||
+ | Relabeled / | ||
+ | </ | ||
+ | |||
+ | 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 | ||
+ | |||
+ | </ | ||
+ | |||
+ | 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)$ | ||
+ | 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, | ||
+ | D-Bus, udev, scripted systemctl call, ...). | ||
+ | 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=== | ||
+ | * '' | ||
+ | * '' |