skoleni:sprava_uzivatelu_a_sluzeb

Toto je starší verze dokumentu!


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).

Užívateľom je jednoducho každý, kto s daným systémom pracuje. Okrem bežných (tzv. human) užívateľov rozlišujeme ešte užívateľov systémových a špeciálny administrátorský (angl. superuser) účet root.

S každým užívateľským účtom je asociovaný nejaký názov, napr. skoleni:

$ whoami
skoleni

a jedinečný číselný identifikátor nazývaný UID. V prípade bežných užívateľov to môže byť taktiež domovský adresár (home) alebo nejaké ďalšie doplňujúce informácie o účte, ktoré súhrnne nazývame GECOS a ktoré vieme získať v zrozumiteľnej podobe programom finger (nie je súčasťou základnej inštalácie).

Na rozdiel od názvu účtu, ktorý slúži pre jednoduchosť zapamätania si, UID nám pomáha rozlíšiť jednotlivé druhy účtov. Všeobecne platí, že UID systémových užívateľov sa pohybuje v rozmedzí 1-999 a bežných potom od 1000 vyššie.

Systémoví užívatelia sú takí uživatelia, ktorí majú typicky jeden dedikovaný účel, pre ktorý existujú, napr. beh webserveru a jeho právomoci (viac o systémových právach v kapitole Práva) budú obmedzené na užívateľa apache. Ako neskôr uvidíme, nie je spravidla taktiež možné sa za nich prihlásiť.

Administrátorský účet root má vždy UID 0 a má plný prístup k celému systému. Z pohľadu bezpečnosti a ochrany systému platí zásada, že tento účet by mal byť používaný v najnižšej možnej miere, práve kvôli spomínanej skutočnosti.

Hoci je možné sa prepnúť na ľubovoľného užívateľa (s patričnou dávkou autentizácie a s výnimkou systémových užívateľov), najčastejšie to bude účet root pre potrebu administratívnych úkonov (správa služieb, správa užívateľov, aktualízacie, atď.). K tomu existuje príkaz su:

$ su -
Password:
[root@localhost]#

prípadne za iného užívateľa:

$ su - skoleni
Password:
[skoleni@localhost ~]$

Zaujímavosť: Všimnime použitie voliteľného parametru -. Jeho použitie bolo zámerné pre demonštráciu dobrých administrátorských návykov, pretože tento parameter zaručí nové čisté prostredie shell (angl. login shell), a teda eliminujeme akékoľvek potenciálne riziká v podobe vedľajších účinkov spôsobených zachovaním nastavení pôvodného prostredia. Bližšie uvidíme efekt tohto parametru pri rozširovaní skupín o nových uživateľov.

Každý užívateľský účet je v systéme nejakým spôsobom uložený. Filozofiou UNIXových systémov je fakt, že „všetko je súbor“, preto aj definície účtov nájdeme v špeciálnom súbore /etc/passwd. Po nahliadnutí do tohto súboru

$ cat /etc/passwd | tail -n 2
skoleni:x:1000:1000:Skoleni Linuxu,Red Hat,0123456789,,:/home/skoleni:/bin/bash

uvidíme na prvý pohľad mätúci formát definujúci užívateľský účet, pozrime sa teda bližšie na jednotlivé položky oddelených znakom :

názov účtu
    |  heslo je uložené v /etc/shadow
    |   |  UID
    |   |   |  GID
    |   |   |   |    |------------GECOS----------------|
    |   |   |   |                   |                   domovský adresár
    |   |   |   |                   |                           |   login shell
    v   v   v   v                   v                           v         v
skoleni:x:1000:1000:Skoleni Linuxu,Red Hat,0123456789,,:/home/skoleni:/bin/bash

Zaujímavou je rozhodne druhá položka x, ktorá nám vraví, že pre heslo existuje záznam v súbore /etc/shadow ku ktorému má prístup iba užívateľ root. Existencia x v /etc/passwd však neznamená, že nejaké heslo skutočne existuje. Na demonštráciu poslúži náš užívateľ skoleni a systémový užívateľ apache:

# cat /etc/shadow | egrep "apache|skoleni"
apache:!!:17804::::::
skoleni:$6$cloJ.lu4v49Cz7g2$dfLjUkj7yzqQWuUuvxoXmEoMzxkf3LoctZN0EHa/tcJ3BNCY.hqM7XtucDUM.vikvQ.Pv3pDgw.ADEkbA2Xyo0::0:99999:7:::

Ako vidíme, heslo užívateľa skoleni je uložené v podobe hash, naopak u užívateľa apache vidíme namiesto hesla !!, to znamená, že za daného užívateľa nie je možné sa prihlásiť heslom (v našom prípade vôbec, avšak v iných prípadoch by mohlo byť možné použiť alternatívne metódy prihlásenia).

Za zmienku stojí aj posledná položka, ktorá určuje tzv. login shell, ktorý sme si už stručne popísali. Login shell je úplne prvá služba, ktorá sa spustí pri prihlásení užívateľa, vytvorí čisté prostredie a nakonfiguruje ho podľa požiadavkov, ktoré sú nad rámec tohto kurzu. Čo je ale dôležité si pamätať, že existuje špeciálna hodnota pre položku login shell nazývaná /sbin/nologin, ktorá zamietne akýkoľvek pokus o prihlásenie za daného užívateľa. Spravidla to nájdeme u systémových užívateľov. Na ukážku sa pozrime na záznam užívateľa apache v /etc/passwd:

$ cat /etc/passwd | grep apache
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

Manuálové stránky

  • passwd (5)
  • pwconv (5)
  • shadow (8)

Skupiny slúžia na združovanie užívateľských účtov podľa ich právomocí (napr. učitelia vs študenti, učitelia môžu pridávať a modifikovať študijné materiály, študenti ich naopak môžu iba čítať). Rovnako ako v prípade užívateľov, každá skupina má svoje meno a unikátny identifikátor zvaný GID. Každý užívateľ je členom aspoň jednej skupiny (tú potom nazývame primárnou) a pokiaľ neuvedieme inak, vytvorí sa v tomto prípade automaticky nová skupina s identickým názvom. Pre súhrnné informácie o spomínaných identifikátoroch, ako aj ohľadom členstva užívateľov v skupinách použijeme príkaz id nad aktuálnym užívateľom:

$ id
uid=1000(skoleni) gid=1000(skoleni) groups=1000(skoleni)

prípadne nad iným uživateľom:

$ id root
uid=0(root) gid=0(root) groups=0(root)

Ako si môžeme všimnúť, užívateľ skoleni je aktuálne členom iba jednej skupiny skoleni, ktorá je zároveň jeho primárnou skupinou (druhý stĺpec - gid). Taktiež si všimnime, že v prípade, že ak parametre užívateľa nemodifikujeme, GID a UID bude rovnaké.

Podobne ako pri užívateľoch, aj skupiny sú v systéme uložené v špeciálnom súbore /etc/group:

$ cat /etc/group | tail -n 1
skoleni:x:1000:

Význam jednotlivých položiek je analogický k /etc/passwd:

názov skupiny
    |  heslo je uložené v /etc/gshadow v podobe hash
    |   |  GID
    |   |   | zoznam členov skupiny
    v   v   v  v
skoleni:x:1000:

Napriek tomu, že reprezentácia skupín v systéme je temer identická s užívateľmi, v praxi skupinové heslá majú použitie len v ojedinelých prípadoch, navyše značné množstvo systémových administrátorov túto funkcionalitu ani nepozná.

Manuálové stránky

  • group (5)
  • grpconv (8)
  • gpasswd (8)

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 užívateľov.

Najzákladnejším úkonom správy užívateľov je zmena hesla užívateľa. Každý užívateľ má právo zmeniť svoje vlastné heslo (na zmenu hesla iných užívateľov je pochopiteľne potrebný root). Na zmenu použijeme príkaz passwd:

$ passwd
Changing password for user skoleni.
Current password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

Hoci passwd ponúka pre roota ďalšie parametre, tieto sú spoločné pre viacero nástrojov, z ktorých sa my budeme venovať tým v praxi najpoužívanejším.

Existuje mnoho nadstavieb shell prinášajúcich rôzne vychytávky a užívatelia majú preto rôzne preferencie a preto majú možnosť si svoj login shell sami zmeniť. Na zmenu sa používa príkaz chsh, ktorý vie taktiež vypísať zoznam dostupných shell-ov. Zmeňme login shell pre užívateľa skoleni na /bin/sh

$ chsh -s /bin/sh skoleni

Je asi zrejmé, že k vytvoreniu nového užívateľa bude potrebné byť prihlásený ako root, následne použijeme príkaz useradd. Stručný prehľad parametrov pre príkaz useradd použijeme parameter –help:

# useradd --help

Ako praktickú ukážku vytvorme užívateľa ucitel s UID 5000 a primárnou skupinou skoleni.

# useradd -u 5000 -g skoleni
# id ucitel
uid=5000(ucitel) gid=1000(skoleni) groups=1000(skoleni)

Všimnime si, že sme pri vytváraní účtov nešpecifikovali heslo. Ak nazrieme do /etc/shadow (ako root), uvidíme niečo podobné:

# cat /etc/shadow | tail -n 1
ucitel:!!:17806:0:99999:7:::

V sekcii o užívateľoch sme si povedali, že !! namiesto hesla znamená, že prihlasovanie heslom je pre daný účet zakázané, v našom prípade jednoducho preto, že sme žiadne nenastavili. Nastavme teda novému užívateľovi heslo ucitel (opäť ako root):

# passwd ucitel

Následne sa už môžeme úspešne za daného užívateľa prihlásiť do systému za použitia hesla.

Veľmi častým úkonom je pridanie užívateľa do ďalších sekundárnych skupín, prípadne zmenu primárnej skupiny, expirácia hesiel a expirácia celých účtov a ich následné mazanie. Na nasledujúce úkony budeme využívať nástroje usermod a chage a na všetko bude potrebný root.

Skupiny

Predtým než sa pustíme do samotných nastavení, vytvorme si testovacieho užívateľa test s heslom test:

# useradd test
# passwd test

V novej záložke terminálu (alebo v novom okne) a prihlásme sa za užívateľa test a zistime informácie o jeho identite:

$ id test
uid=1001(test) gid=1001(test) groups=1001(test)

Prepneme späť na roota a pridajme užívateľa test do skupiny skoleni za pomoci príkazu usermod:

# usermod -a -G skoleni test

Dôležitý je parameter -a, ktorý hovorí, že zoznam skupín daných -G má byť pridaný do už existujúceho zoznamu skupín, ktorých je test členom.

Zaujímavosť: Ak teraz prepneme naspäť na užívateľa test a spustíme id, tak skoleni v zozname skupin neuvidime:

$ id test
uid=1001(test) gid=1001(test) groups=1001(test)

Je tomu tak preto, že tieto zmeny vyžadujú nové prihlásenie (nový login shell). Zmenu primárnej skupiny na skoleni vykonáme nasledovne:

# usermod -g skoleni test
# id test
uid=1001(test) gid=1000(skoleni) groups=1000(skoleni),1001(test)

Politika hesiel

Existujú bezpečnostné politiky, ktoré vyžadujú pravidelnú zmenu hesla inak dôjde k uzamknutiu a následnej expirácii užívateľského účtu, účet síce nezanikne, ale o jeho opätovnú aktiváciu bude užívateľ musieť požiadať administrátora. Správu hesiel a platnosť účtov riešime za pomoci príkazu chage a taktiež z pochopiteľných dôvodov potrebujeme práva root. Pred praktickými ukážkami sa však najprv pozrime na možnosti tohto príkazu:

# chage -h
Usage: chage [options] LOGIN

Options:
  -d, --lastday LAST_DAY        set date of last password change to LAST_DAY
  -E, --expiredate EXPIRE_DATE  set account expiration date to EXPIRE_DATE
  -h, --help                    display this help message and exit
  -I, --inactive INACTIVE       set password inactive after expiration
                                to INACTIVE
  -l, --list                    show account aging information
  -m, --mindays MIN_DAYS        set minimum number of days before password
                                change to MIN_DAYS
  -M, --maxdays MAX_DAYS        set maximum number of days before password
                                change to MAX_DAYS
  -R, --root CHROOT_DIR         directory to chroot into
  -W, --warndays WARN_DAYS      set expiration warning days to WARN_DAYS

Začnime povinnou zmenou hesla po prvom prihlásení. Použijeme k tomu užívateľa ucitel, ktorému sme nastavili predvolené heslo ucitel a použijeme parameter -d

# chage -d 0 ucitel

Učiteľ bude následne po prvom prihlásení vyzvaný na zmenu hesla:

$ su - ucitel
Password:
You are required to change your password immediately (administrator enforced)
Current password:
New password:

Ďalej by sme chceli, aby si ho ucitel z bezpečnostných príčin pravidelne menil, takže musíme nastaviť maximálny počet dní od poslednej zmeny hesla (v našom prípade raz za mesiac):

# chage -M 30 ucitel

Ďalším častým úkonom, ktorý si ukážeme je expirácia účtov. Pri voľbe dátumu expirácie nám systém dáva hodne veľkú flexibilitu v tom ako dátum špecifikovať, ukážeme si preto aj jednoduchší, ale aj komplexnejší prístup. Expirácia ku konkrétnemu dátumu 13.1.2019 by vyzerala nasledovne:

# chage -E 01/13/2019 ucitel

Na expiráciu napr. o 42 dní od aktuálneho dátumu by sme už museli použiť kombináciu s príkazom date:

# chage -E $(date +42days) ucitel

Súhrn našich dosavadných zmien si môžeme pozrieť s parametrom -l:

# chage -l ucitel
Last password change  : password must be changed
Password expires      : password must be changed
Password inactive     : password must be changed
Account expires       : Nov 14, 2018
Minimum number of days between password change      : 0
Maximum number of days between password change      : 30
Number of days of warning before password expires   : 7 

Keďže pri expirácii môžeme špecifikovať aj počet dní (od epochy 1.1.1970), pre okamžitú expiráciu jednoducho použijeme 0:

# chage -E 0 ucitel

Zaujímavosť: Hoci je možné účet uzamknúť aj za pomoci passwd -l alebo usermod -L, tieto metódy majú efekt IBA na autentizáciu heslom do systému, pričom dovoľujú alternatívne metódy prihlásenia, napr. použitím SSH prístupu a autentizácie verejným kľúčom. Preto sme si ukázali príkaz chage, ktorý nám pri zaručí, že účet bude skutočne nedostupný.

Odstránenie účtu

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, ktorí mohli domovský adresár zdieľať! Ďalším problémom mazania účtov sú súbory, ktoré po danom užívateľovi zostali a ktoré je nutné dodatočne dohľadať a zmazať, nakoľko userdel zmaže iba domovský adresár, užívateľský mailový inbox a skupinu s rovnomenným názvom. Preto dopredu zvážme, či nie je pre nás výhodnejšie účet expirovať. Ak sme sa predsa rozhodli účet a všetko s ním súvisiace zmazať, nezabudnime najprv účet expirovať, zabezpečiť, že daný užívateľ je odhlásený a že domovský adresár, skupina a mailový inbox nie sú zdieľané s inými užívateľmi. Následne užívateľa zmažeme:

# userdel -r <uzivatel>

Manuálové stránky

  • useradd (1)
  • usermod (1)
  • chage (1)
  • chsh (1)
  • userdel (1)

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ú nad rámec tohto školenia, pre záujemcov sú nižšie uvedené manuálové stránky.

Vytvorenie novej skupiny v systéme

Novú skupinu vytvoríme príkazom groupadd nasledovne:

# groupadd bar

Zmena primárnej skupiny užívateľa

Zmenu skupiny sme si už ukázali v sekcii o užívateľoch. Na trvalú zmenu sme potrebovali práva administrátora. Tu si ukážeme ako si užívateľ dokáže primárnu skupinu dočasne zmeniť sám, pokiaľ už je danej skupiny členom.

Príklad: Vytvorme užívateľa foo a pridajme mu sekundárnu skupinu bar:

# useradd foo -u 10000 -G bar
# passwd fo na zopakovanio
# id foo
uid=10000(foo) gid=10000(foo) groups=10000(foo),1002(bar)

Za užívateľa foo si teraz v aktuálnom prostredí zmeníme primárnu skupinu na bar:

$ newgrp bar
$ id
uid=10000(foo) gid=1002(bar) groups=1002(bar),10000(foo)

Ak by foo na začiatku nebol členom skupiny bar, operácia by vyžadovala heslo do skupiny, pokiaľ žiadne neexistuje, sú potrebné práva administrátora!

  1. vytvorte skupinu ucitele s GID 5001 a pridajte do nej užívateľa ucitel
  2. vytvorte skupiny matematika a fyzika
  3. vytvorte užívateľov honza, pepa, petr a nastavte im ako primárnu skupinu studenti, petr patrí aj do skupiny matematika, domovské adresáre studentov nájdeme pod /home/studenti
  4. každý nový študent má predvolené heslo student, ktoré si musí pri prvom prihlásení zmeniť
  5. nové nariadenie školy taktiež prikazuje z bezpečnostných dôvodov meniť študentom heslo každý mesiac
  6. honza a pepa patria do skupiny fyzika
  7. honza sa rozhodol prestúpiť z fyzikálneho do matematického krúžku, vykonajte príslušnú zmenu v skupinách
  8. pepa je krutoprísny a rád by si nastavil login shell na /sbin/nologin
  9. petr prestúpil na inú školu, preto je treba jeho účet bezpečne invalidovať, a následne zmazať, vykonajte všetky potrebné kroky

Práva v Linuxu

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, a podobně. V případě, že nějaký uživatel nemá k určité činnosti práva, systém mu nepovolí tuto činnost vykonat. V zásadě má však každý uživatel dostatek práv na to, aby mohl se systémem smysluplně pracovat a nebyl zbytečně omezován. Pokud náhodou by během své práce potřeboval získat dočasně práva vyšší, je to otázka několika sekund, takže není většinou nutné se přihlašovat jako jiný uživatel a střídat účty. U některých jiných operačních systémů nelze lehce získat práva k administraci systému a to nutí uživatele kvůli lenosti pracovat neustále pod plnými právy administrátora. To je však veliké bezpečnostní riziko. V Linuxu toto není nutné, protože také aplikace velmi dobře pracují v rámci omezených práv a obvykle se nestává, že by aplikace měla s omezenými právy omezenou funkcionalitu. Fakt, že uživatelé a jimi spouštěné aplikace a programy mají omezená práva, a že není potřeba tyto práva nikterak navyšovat pro běžný uživatelský provoz, je jedním z důvodů, proč je operační systém Linux robustní a bezpečný operační systém.

Všechny procesy, zařízení a data v Linuxu jsou v systému reprezentovány odkazy, které se chovají jako běžný soubor, dále tedy budeme hovořit převážně o právech, které nastavujeme uživateli vzhledem k souboru. Tyto základní práva jsou tři:

  • právo číst ze souboru (read, r)
  • právo zapisovat do souboru (write, w)
  • právo spouštět soubor (eXecute, x)

Tato základní práva lze nastavit pro tři různé „úrovně“ přístupu pro:

  • jednoho konkrétního uživatele, také nazýván vlastník souboru (zpravidla ten, kdo soubor vytvořil)
  • jednu konkrétní skupinu uživatelů (např. studenti)
  • všechny ostatní

Takto lze například nastavit, aby vlastník souboru (ucitel) mohl ze souboru číst a také do něj zapisovat, všichni jeho žáci ze skupiny studenti z něj mohli číst, ale nemohli do něj zapisovat, a všichni ostatní (další žáci školy) k němu neměli žádná práva. Vzápětí si vysvětlíme, jak toho dosáhnout.

Jaká práva který soubor má, si můžeme lehce zobrazit pomocí příkazu ls -l. Podívejme se na následující výstup:

-rw-rw-r--. 1 teacher students 1220 Jul 24 18:10 find.py

Seznam práv je uveden hned na začátku řádku a v tomto konkrétním případě se jedná o kombinaci -rw-rw-r–..

Práva jsou u každého souboru zapsána jako kombinace tří tripletů (tedy celkem devíti znaků), které jsou vypsány za sebou v pořadí uživatel, skupina, ostatní. Podíváme-li se podrobněji, zjistíme, že v informačním poli se však nenachází 9 pozic, ale 11 pozic (někdy pouze 10 pozic). Úplně první pozice totiž neukazuje samotná práva, ale informaci, zda se jedná o soubor (-) nebo adresář (d). Poslední pozice ukazuje rozšířená práva ACL, pokud jejich použití je pro daný souborový systém zapnuto. Pokud soubor nemá rozšířená práva, zobrazuje se tam symbol tečky (.), v opačném případě symbol +.

Zaměříme se teda na oněch devět znaků rw-rw-r–*. Z jednotlivých tripletů pak vyplývá, že soubor umožňuje:

  • uživateli soubor číst a zapisovat (rw-)
  • skupině také číst a zapisovat (rw-)
  • všem ostatním pouze číst (r–)

Představme si, že výše uvedený soubor find.py, program v Pythonu, chceme také spouštět. Řekněme, že chceme, aby vlastník měl k souboru veškerá práva, skupina studentů mohla soubor číst a také jej spouštět, a všichni ostatní ho mohli pouze číst. Práva souboru nastavíme pomocí příkazu chmod (change mode). Pro více informací si můžete spustit také nápovědu pro tento program pomocí příkazu man chmod.

  1. Příkazem chmod u+x find.py přidáme právo spouštět soubor. Volba u+x říká: Uživateli (u) přidej (+) právo spouštění (x). Práva číst a zapisovat už uživatel má, tak je nemusíme přidávat.
  2. Příkazem chmod g+x find.py přidáme (+) skupině (g) právo spouštět (x) soubor, ale odebereme (-) právo zapisovat (w) příkazem chmod g-w find.py.

Právo pro ostatní (o) nemusíme nijak upravovat, protože ostatní mohou jenom číst a to chceme.

Když si následně zobrazíme práva pro soubor find.py, dostaneme kombinaci rwxr-xr–, teda všechna práva pro uživatele, práva čtení a spouštění pro skupinu a práva pro čtení pro všechny ostatní. A to je, co jsme chtěli.

Ještě jednou si rozeberme jednotlivé volby příkazu chmod:

  • písmena u, g, o zapínají práva pro uživatele, skupinu, nebo ostatní
  • znaky + nebo - přidávají nebo odebírají příslušná práva
  • písmena r, w, x řídí práva pro čtení, zápis a spouštění. Lze je také kombinovat, tedy je možné napsat rw pro čtení a zápis zároveň, nebo rx pro čtení a spouštění zároveň, ale také rwx pro přidání všech práv.

Někdy nechceme práva nastavovat pro každou úroveň zvlášť, ale potřebujeme rychle nastavit práva pro uživatele, skupinu a ostatní zároveň. To můžeme udělat pomocí číselné kombinace. Na první pohled nemusí být přesně jasné, jak s čísly pracovat, ale pokusme se vysvětlit to na následující ukázce:

  • číslice 0 představuje žádná práva
  • číslice 1 představuje právo spouštění (jako x)
  • číslice 2 představuje právo zápisu (jako w)
  • číslice 4 představuje právo čtení (jako r)

Kombinace různých práv potom vypočítáme jakou součet jednotlivých hodnot, můžeme tedy získat 8 různých kombinaci práv, tedy:

  • číslice 0 představuje žádná práva
  • číslice 1 představuje právo spouštění
  • číslice 2 představuje právo zápisu
  • číslice 3 představuje právo spouštění a zápisu (1+2)
  • číslice 4 představuje právo čtení
  • číslice 5 představuje právo spouštění a čtení (1+4)
  • číslice 6 představuje právo zápisu a čtení (2+4)
  • číslice 7 představuje právo spouštění, zápisu a čtení (1+2+4)

Předcházející úkol bychom tak jednodušše mohli vyřešit pomocí zápisu chmod 754 find.py, kdy první číslo je pro uživatele, druhé pro skupinu, a třetí pro ostatní.

Ne vždycky můžeme nastavit už při vytváření souborů správně práva. Někdy je potřeba později změnit nastavení vlastníka nebo skupiny. Toho dosáhneme pomocí příkazu chown (change owner). V zásadě můžeme tento příkaz použít třemi možnými způsoby:

  1. chown ucitel find.py udělá vlastníkem souboru find.py uživatele ucitel, skupina zůstane nezměněná.
  2. chown :studenti find.py udělá spoluvlastníkem souboru skupinu studenti, vlastník samotný zůstane nezměněn.
  3. chown ucitel:studenti find.py udělá vlastníkem souboru uživatele ucitel a spoluvlastníkem skupinu studenti.

Další použití příkazu chown lze nastudovat z manuálových stránek příkazem man chown.

Práva se týkají také adresářů, ale narozdíl od souborů mají práva u adresářů trochu jiný efekt:

  • právo pro čtení znamená, že dotyčný může zobrazit obsah příslušného adresáře.
  • právo pro zápis znamená, že dotyčný může do adresáře ukládat soubory.
  • právo pro spouštění znamená, že dotyčný může do adresáře vstoupit.

Z toho, co jsme si zatím ukázali, víme, že pro každý soubor lze přístupová práva udělit vlastníkovi, skupině a ostatním. Zatímco u textových souborů skoro ani nic jiného nepotřebujeme, u spustitelných souborů, hlavně těch systémových, to ne vždy stačí. Proč?

Jestliže chci například vytvořit nový adresář, potřebuju k tomu samozřejmě program mkdir. Tento se ve Fedoře nachází v adresáři /usr/bin. Zobrazme si jeho práva příkazem ls -l /usr/bin/mkdir a uvidíme, jak vypadají:

-rwxr-xr-x. 1 root root 109560 Jul 13 01:40 /usr/bin/mkdir

Vidíme, že vlastníky jsou uživatel root a skupina root, ale ostatní také mají povoleno program spouštět (r-x). Co se stane, pokud program spustím jako uživatel ucitel?

Jako ucitel patřím z hlediska tohoto programu do skupiny ostatní. Program mohu spustit, práva mi to dovolují. Program tedy běží pod uživatelem ucitel a tak se na jeho běh vztahují omezení, které v systému má uživatel ucitel.

Nový adresář se mi tak povede vytvořit pouze tam, kde mám právo zápisu a nikoliv jinde. V takovém případě příkaz mkdir /home/ucitel/pisemky bude úspěšný, protože mohu zapisovat do svého domovského adresáře, ale příkaz mkdir /pisemky skončí s chybou, protože moje práva mi neumožňují zapisovat přímo do kořenového adresáře.

mkdir: cannot create directory ‘/pisemky’: Permission denied

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 passwd, který se na takovou akci používá, musí změnit systémový soubor /etc/shadow. Podívejme se, jaká má tento soubor práva:

----------. 1 root root 1465 Aug 20 14:07 /etc/shadow

Vidíme, že nikdo, dokonce ani vlastník, nemá právo se souborem cokoliv dělat. Pouze uživatel root může toto přísné nastavení obejít. Kdybychom tedy spustili příkaz passwd jako uživatel ucitel, program by neměl oprávnění se souborem /etc/shadow nákládat a heslo bychom si tedy změnit nemohli. Jak na to?

Řešením je nastavit tzv. uid (uživatel ) nebo gid (skupina) bit, který systému řekne, že program má běžet vždy s právy vlastníka nebo skupiny, ať ho již spouští kdokoliv. Podívejme se na práva programu passwd pomocí ls -l /usr/bin/passwd.

-rwsr-xr-x. 1 root root 34088 Jul 14 23:01 /usr/bin/passwd

Všimněme si, že triplet pro vlastníka je rws. Symbol s právě symbolizuje fakt, že program bude spuštěn s právy vlastníka, tedy uživatele root a tak bude kdokoliv pomocí tohoto programu pracovat se souborem /etc/shadow. Podmínkou je, že program má nastavená spouštěcí práva i pro ostatní, což v tomto případě splněno je.

UID bit nastavíme pomocí příkazu chmod stejně jako bychom nastavovali jiná práva. Můžeme jej nastavit:

  1. pomocí symbolů, tedy chmod u+s find.py
  2. pomocí čísel, tedy chmod 4755 find.py, kdy tento bit je zastoupen číslem 4 před klasickou číselnou trojicí.

V případě, že chceme nastavit práva tak, aby kdokoliv mohl spouštět program jako člen určité skupiny, pak nastavíme GID bit, stejně jako bychom nastavovali UID bit:

  1. pomocí symbolů, tedy chmod g+s find.py
  2. pomocí čísel, tedy chmod 2755 find.py, kdy tento bit je zastoupen číslem 2 před klasickou číselnou trojicí.

Pokud si pohráváte s myšlenkou, že každý takto bude mít právo měnit hesla uživatelům v systému, musím vás zklamat. V takovémto případě si totiž operační systém hlídá také identifikační čísla uživatelů a je si vědom toho, že uživatel ucitel s ID 1000 se pokouší změnit heslo někomu s ID 1001 a to nepovolí. Do větší hloubky v tuto chvíli nepůjdeme.

Sticky bit je označení ochranného štítku, který chrání soubory před smazáním v adresáři, kam má přístup více lidí. Jestliže má adresář nastavený tuto ochranu, potom soubory v něm umístěné může smazat pouze jejich vlastník, vlastník daného adresáře nebo uživatel root. Toto nastavení se často používá ve veřejně přístupných adresářích, jako třeba /tmp.

Všimněme si, že ve výpisu práv je sticky bit zaznačený písmenem t v tripletu pro ostatní:

drwxrwxrwt.  15 root root   320 Oct  5 14:08 tmp

Sticky bit nastavíme opět buď:

  1. pomocí symbolického zápisu příkazem chmod +t adresar, nebo
  2. pomocí číselného zápisu chmod 1755 adresar, kde číslice 1 reprezentuje sticky bit.

Práva ACL (access control list) jsou rozšířená linuxová práva, která umožňují jemnější nastavení přístupu jednotlivým uživatelům a skupinám. Některé souborové systémy v Linuxu nemusí tento způsob práv podporovat. Ve Fedoře je standardně použit souborový systém ext4 se zapnutou podporou ACL.

Zatímco klasická práva nám umožňují, abychom nastavili možnost přístupu vlastníkovi, skupině a ostatním, ACL práva nám dovolují daleko více. Představme si příklad, kdy měl trojici učitelů (lkratky, zpevny, a htrojek), skupinu studentů navštěvujících seminář z IT (itstudenti) a mnoho dalších studentů z celé školy. Kdybychom pro adresář it_seminar chtěli nastavit práva pro čtení, zápis a spouštění všem těmto učitelům, práva pro čtení a spouštění všem studentům semináře a zbytku školy bych jinak chtěl přístup zakázat úplně, šlo by to? Se základními právy těžko. S ACL? Lehce.

Nejprve nastavíme základní práva:

  1. Změníme vlastníka a skupinu tak, abychom si některé požadavky vyřešili pomocí základních práv, příkazem chown lkratky:itstudenti it_seminar se postaráme, že pomocí základních práv budeme schopni vyřešit jednoho učitele, skupinu studentů semináře a všechny ostatní.
  2. Nastavíme přístupová práva, chmod 750 it_seminar, která se postarají o to, že skupina itstudenti bude mít práva ke čtení a spouštění a ostatní nebudou mít práva žádná. Taktéž jeden z učitelů již bude mít potřebná práva nastavená.

Pak pomocí ACL povolíme přístup zbývajícím učitelům. Použijeme k tomu příkazu setfacl:

  1. setfacl -m u:zpevny:rwx it_seminar nastaví práva rwx pro uživatele zpevny.
  2. Stejně nastavíme práva i dalšímu z učitelů.

Potřebujeme-li zjistit, zda nějaký soubor nebo adresář používá ACL práva, podíváme se na výpis práv pomocí ls -l. Jestliže na posledním místě ve výpisu práv vidíme +, pak soubor nebo adresář má nastavená práva ACL, například:

drw-rw-r--+ 3 lkratky itstudenti 4096 Oct  2 21:53 it_seminar

Konkrétní práva zjistíme příkazem getfacl. Takže pro výše uvedný případ, getfacl it_seminar by mohla situace vypadat takto:

# file: it_seminar
# owner: lkratky
# group: itstudenti
user::rwx
user:zpevny:rwx
user:htrojek:rwx
group::r-x
mask::rwx
other::---

Práva se přidávají s volbou -m. Stejnou volbou lze také stávající práva upravit.

Přidání práv uživateli

setfacl -m u:ucitel:rw soubor.txt

Přidání práv skupině

setfacl -m g:studenti:r soubor.txt

Úprava práv pro skupinu

Pokud chceme práva upravit, spustíme příkaz pro přidání práv znovu s novými parametry:

setfacl -m g:studenti:rw soubor.txt

Práva budou přenastavena.

Odebrat můžeme jenom konkrétní právo (volba -x) nebo všechna ACL práva zaráz (volba -b).

Smazání práv konkrétním subjektům

Práva můžu odebrat uživateli i skupině. Pro uživatel platí

setfacl -x u:zpevny it_seminar

a pro skupinu

setfacl -x g:itstudenti it_seminar

Smazání všech ACL práv

Všechna práva najednou mohu odstranit použitím volby -b.

setfacl -b find.py

Pro veškeré další použití můžete přečíst manuálové stránky příkazu setfacl.

Správa služeb a procesů

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á má určité charakteristiky, medzi ktoré patrí jednoznačný číselný identifikátor PID (angl. process ID), virtuálne namapovaný pamäťový priestor (angl. virtual address space), stav procesu, rôzne behaviorálne vlastnosti ako zdieľanie zdrojov, obsluha signálov, komunikácia s inými procesmi atď.

Nové procesy vznikajú výlučne kopírovaním existujúceho procesu, ktorý vytvorí nový proces ako svojho potomka (v závere sekcie si povieme, že toto je pravda iba čiastočne). 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 uvidíme jeho význam. To znamená, že v systéme existuje proces, ktorý je nadradený všetkým procesom, jeho PID == 1 a historicky sa nazýval init, ktorý pri štarte systému spušťal ďalšie skripty a služby, aby systém naštartoval do stavu, v ktorom s ním môžeme pracovať. Na väčšine významných distribúcií (vrátane Fedory) dnes túto úlohu plní systemd, ktoré je v porovnaní s pôvodným init komplexný subsystém, ktorý nám okrem iného poskytuje mechanizmy na správu ďalších služieb a o ktorom si povieme viac neskôr.

Čo sa samotného vytvorenia procesu týka, po tom, čo nadradený proces vytvorí svoju identickú kópiu (systémové volanie fork), tento novovytvorený proces spustí nami požadovaný program (systémové volanie execve). Detailný popis toho, čo vytvorenie procesu obnáša na pozadí je nadrámec tohoto školenia a dá sa dohľadať v literatúre.

Kernel a jeho procesy

Na začiatku sme si povedali, že všetky procesy vznikajú kopírovaním existujúcich procesov a že rodičom všetkých procesov je proces s PID 1. Toto platí pre všetky užívateľské procesy, avšak situácia pre kernel je mierne odlišná. Kernel totiž pre svoje potreby vytvára ďalšie procesy, ktoré sa označujú ako služby a ich vytvorenie prebieha inak než u užívateľských procesov, preto ani nepodliehajú stromovej hierarchii, a teda nemajú spoločného predka.

Manuálové stránky

  • fork (2)
  • clone (2)
  • execve (2)

Naopak, keď chceme proces zastaviť (zrušiť), môžeme jednoducho použiť príkaz kill:

]$ kill <PID>

Príkaz kill takto vlastne pošle terminačný signál (SIG_TERM == 15), na ktorý proces bežne reaguje tak, že zastaví činnosť a skončí (pamäť uvoľní kernel).

Všeobecne sa s procesmi bežne komunikuje prostredníctvom signálov. Príkazom kill môžeme poslať v podstate aj ktorýkoľvek iný signál definovaný podľa POSIX.

Manuálové stránky

  • kill (1)
  • signal (7)

Z užívateľského prostredia (user-space) sa najbežnejšie získavajú informácie o existújucich procesoch pomocou príkazov: ps a top.

Príkaz ps:

  • Vypíše zoznam procesov a informácie o nich.
  • Rôzne informácie, množiny a zobrazenia pomocou prepínačov.

Príklady:

  • ps (bez parametrov)
    • 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)
  • ps u
    • Zobrazí všetky procesy vlastnené aktuálnym užívateľom.
]$ ps u
-> Vyskúšajte
  • ps aux
    • Zobrazí všetky existujúce procesy na tomto systeme.
]$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0 229808 10496 ?        Ss   Oct01   1:04 /usr/lib/systemd/systemd --system --deserialize 165    
root         2  0.0  0.0      0     0 ?        S    Oct01   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        I<   Oct01   0:00 [rcu_gp]
root         5  0.0  0.0      0     0 ?        I<   Oct01   0:00 [kworker/0:0H]
root         7  0.0  0.0      0     0 ?        I<   Oct01   0:00 [mm_percpu_wq]
root         8  0.0  0.0      0     0 ?        S    Oct01   0:10 [ksoftirqd/0]
root         9  0.0  0.0      0     0 ?        I    Oct01   0:42 [rcu_sched]
…[ a veľa ďalších ]…

Pozn.: Procesy v hranatých zátvorkách [] sú systémové procesy (tzv. kernel-threads)

  • ps f
    • Zobrazí stromovú štruktúru (prípadne existuje aj pstree)
]$ ps f
18653 pts/1    Ss     0:00 bash
10155 pts/1    R+     0:00  \_ ps f
 6289 tty2     Sl+    0:01  \_ /usr/libexec/gnome-session-binary
 6600 tty2     Sl+  140:05      \_ /usr/bin/gnome-shell
 7066 tty2     Sl+   28:35      |   \_ /usr/bin/Xwayland :0 -rootless -terminate -core -listen 4 -listen 
 7586 tty2     Sl     0:06      |   \_ ibus-daemon --xim --panel disable
 7590 tty2     Sl     0:00      |   |   \_ /usr/libexec/ibus-dconf
 7766 tty2     Sl     0:00      |   |   \_ /usr/libexec/ibus-engine-simple
 8337 tty2     Sl+  155:42      |   \_ /usr/lib64/firefox/firefox
...[ atď ]...

Pozor: Je rozdiel medzi prepínačmi s pomlčkou - a bez, napr. ps -aux a ps aux!

Príkaz top:

Príkaz top sa v základe spustí vo svojom interaktívnom móde, v ktorom periodicky obnovuje zobrazované dáta v reálnom čase.
Existuje mnoho možností, ako upraviť ktoré informácie top zobrazuje, avšak my si ukážeme iba základné zobrazenie:

]$ top
top - 17:09:51 up 6 days,  8:29,  1 user,  load average: 0.95, 0.86, 0.74
Tasks: 313 total,   2 running, 246 sleeping,   0 stopped,   0 zombie
%Cpu(s):  3.0 us,  1.0 sy,  0.0 ni, 95.6 id,  0.1 wa,  0.2 hi,  0.1 si,  0.0 st
KiB Mem : 11857404 total,   511728 free,  7916376 used,  3429300 buff/cache
KiB Swap:  6033404 total,  4828844 free,  1204560 used.  4494984 avail Mem

  PID USER   PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                              
 8476 user   20   0 3167768 0.983g  85780 S   3.3  8.7  91:59.69 Web Content                          
23078 user   20   0 2872300 654080 160476 S   3.3  5.5  63:57.09 Web Content                          
17343 user   20   0 2976872 997.8m  97636 S   2.3  8.6 117:51.18 Web Content                          
 8598 user   20   0 3423596 1.208g 112256 R   2.0 10.7 188:21.10 Web Content                          
 8337 user   20   0 10.332g 1.188g 282536 S   1.7 10.5 160:51.69 firefox                              
 6600 user   20   0 4329020 628316 118748 S   1.0  5.3 143:07.66 gnome-shell                          
 8500 user   20   0 1323312 101940  45948 S   1.0  0.9   0:45.07 virt-manager                         
  477 root   -2   0       0      0      0 S   0.3  0.0   0:38.68 i915/signal:0                        
  981 rtkit  21   1  183884     20      0 S   0.3  0.0   0:01.89 rtkit-daemon                         
 1102 root   20   0 1737932  25908   8584 S   0.3  0.2   2:41.29 libvirtd                             
 1538 gdm    20   0  841364  10168   5168 S   0.3  0.1   0:53.87 gsd-color                            
 8568 qemu   20   0 6451560 1.199g  24940 S   0.3 10.6   1:14.55 qemu-system-x86                      
10653 user   20   0  790948 103736  31252 S   0.3  0.9  40:17.50 gnome-terminal-                      
12428 user   20   0  152008   3876   3092 R   0.3  0.0   0:00.10 top                                  
    1 root   20   0  229808  10484   6636 S   0.0  0.1   1:06.37 systemd                              
    2 root   20   0       0      0      0 S   0.0  0.0   0:00.36 kthreadd                             
    3 root    0 -20       0      0      0 I   0.0  0.0   0:00.00 rcu_gp                               
    5 root    0 -20       0      0      0 I   0.0  0.0   0:00.00 kworker/0:0H                

Ako si môžete všimnúť, okrem informácií o procesoch, zobrazuje aj všelijaké iné informácie, ako napríklad záťaž systému (load average), stav pamäte, využitie procesorov a ďalšie.

Vysvetlenia jednotlivých údajov:

  • S - State - Stav procesu
    • R - runnable - Pripravený / Bežiaci
    • S - interruptible sleep - Spiaci
    • D - uninterruptible sleep - Čakajúci (väčšinou na dokončenie I/O)
    • Z - zombie - Mŕtvy / Dokončený
    • T - stopped / parked - Zastavený
  • Load average - Záťaž systému
    • Počet bežiacich R a čakajúcich D procesov.
    • Priemer počítaný za posledných 1 / 5 / 15 sekúnd.
    • Treba interpretovať s ohľadom ku počtu aktívnych procesorov (CPU)
  • Memory - Údaje o použití pamäte
    • VIRT - virtual memory space (process block)
      • Veškerá pamäť, ktorú má process k dispozícii (zásobník, halda, exekucný kód, atď.).
    • RES/RSS - resident set size
      • Časť (podmnožina) VIRT, ktorá je načítaná v RAM
      • 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ň zdielaná.
    • %MEM
      • Koľko percent z celkovej dostupnej pamäte proces používa (RES / RAM)
  • %CPU
    • Percento, koľko procesorového času tento PID využíva. (*)
    • Toto percento sa daľej delí na:
      • %usr - užívateľské prostredie (user-space)
      • %sys - systémové prostredie (kernel-space) - systémové volania, obsluha prerušení, správa pamäte
  • PR a NI - priority, nice value
    • Tieto stĺpce ukazujú priority daného procesu, prípadne jeho “nice” hodnotu
    • (O rôznych prioritách sa dočítate nižšie)

(*) Poznámnka: Procesy môžu vtvárať tzv. vlákna (threads), napríklad pomocou clone(), ktoré môžu zdielať rovnaký PID. V bežnom prípade rôzne vlákna bežia na rôznych procesoroch, takže sa može stať, že %CPU presiahne 100%. V jednoduchosti je to súčet času, ktorý spotrebovali vlákna s rovnakým PID na všetkých procesoroch, kde bežali.

Manuálové stránky

  • ps (1)
  • top (1)

Všimnite si, že aj ps aj top poskytujú v podstate rovnaké informácie, akurát v rôznych formátoch s roznymi prepinačmi. Totiž vačšinu dát oboje získavajú z rozhranií, ktoré poskytujú tieto informácie priamo z kernelu (spomínaný task_struct). Jedným z týchto rozhraní sú napríklad súbory v /proc/<PID>/:

]$ ls /proc/9629/		(PID 9629 bol vtedy môj //bash//)
attr        coredump_filter  gid_map    mem         oom_adj        sched         stat           uid_map
autogroup   cpuset           io         mountinfo   oom_score      schedstat     statm          wchan
auxv        cwd              latency    mounts      oom_score_adj  sessionid     status
cgroup      environ          limits     mountstats  pagemap        setgroups     syscall
clear_refs  exe              loginuid   net         personality    smaps         task
cmdline     fd               map_files  ns          projid_map     smaps_rollup  timers
comm        fdinfo           maps       numa_maps   root           stack         timerslack_ns

Nájdete tu napríklad sched, stat, maps, io, stack, smaps[-rollup] a mnoho ďalších (dokonca aj personality :-)).
Niektoré sú prezentované docela čitateľne:

]$ cat /proc/9629/smaps_rollup
56372e85a000-ffffffffff601000 ---p 00000000 00:00 0                      [rollup]
Rss:                5848 kB
Pss:                3082 kB
Shared_Clean:       3308 kB
Shared_Dirty:          0 kB
Private_Clean:        48 kB
Private_Dirty:      2492 kB
Referenced:         5848 kB
Anonymous:          2492 kB
LazyFree:              0 kB
AnonHugePages:         0 kB
ShmemPmdMapped:        0 kB
Shared_Hugetlb:        0 kB
Private_Hugetlb:       0 kB
Swap:                  0 kB
SwapPss:               0 kB
Locked:                0 kB

Iné sú však predané v neupravenom (tzv. raw) stave:

]$ cat /proc/9629/stat
9629 (bash) S 8689 9629 9629 34817 9821 4210688 3851 10920 0 0 5 2 5 12 20 0 1 0 28352 127361024 1462 18446744073709551615 94795003699200 94795004761576 140737358851088 0 0 0 65536 3670020 1266777851 1 0 0 17 2 0 0 0 0 0 94795006860656 94795006907748 94795031584768 140737358858602 140737358858607 140737358858607 140737358860270 0

V prípade, keď chcete niektorý proces (alebo skupinu procesov monitorovať), asi tušíte, že najideálnejsie by bolo sledovať práve dáta z /proc/PID/.
K tomu existuje program pidstat, ktorý podla zadanej periódy a prepínačov pravideľne vypisuje štatistiky:

]$ pidstat -r -p 9629 1
Linux 4.17.7-100.fc27.x86_64 (dhcp-26-154.brq.redhat.com) 	10/07/2018 	_x86_64_	(4 CPU)

09:09:11 PM   UID       PID  minflt/s  majflt/s     VSZ     RSS   %MEM  Command
09:09:12 PM  1000      9629      0.00      0.00  124376    5876   0.05  bash
09:09:13 PM  1000      9629      0.00      0.00  124376    5876   0.05  bash
09:09:14 PM  1000      9629      0.00      0.00  124376    5876   0.05  bash
09:09:15 PM  1000      9629      0.00      0.00  124376    5876   0.05  bash
09:09:16 PM  1000      9629      0.00      0.00  124376    5876   0.05  bash
09:09:17 PM  1000      9629      0.00      0.00  124376    5876   0.05  bash
^C

Pozn.: Legendy ku jednotlivým stĺpcom sú popísané u každého prepínača v manuálových stránkach.

Manuálové stránky

  • pidstat (1)

Priority a plánovanie

Vyššie ste mohli vidieť, že každý proces má svoju prioritu. Linux poskytuje 3 typy plánovačov (scheduler), každý s vlastním rozsahom priorít.
Okrem priorít, poskytujú plánovače aj niekoľko rôznych plánovacích tried / algoritmov:

  • CFS - completely fair scheduler - Férový plánovač
    • Priorita vždy 0.
    • Použiva 40 tzv. „nice“ hodnotu s rozptylom [-20 .. 19].
    • Cím nižšia hodnota (-20), tým častejšie je proces naplánovaný pre exekúciu.
    • Poskytuje 3 triedy:
      • SCHED_OTHER - úplne bežná trieda
      • SCHED_IDLE - bežia iba ak nie je žiadny ďalší process, ktorý by mohol
      • SCHED_BATCH - vhodný pre dávkové alebo dlho-počítajúce processy
  • RT - real-time - Prednostný plánovač
    • Používa 99 priorít v rozsahu [1 .. 99].
    • Proces s vyššou prioritou je preferovanejší.
    • Procesy s RT prioritou sú majoritne uprednostňované pred „nice“ procesmi
    • Poskytuje 2 typy algoritmu:
      • SCHED_FIFO - proces beží pokiaľ neskončí alebo nejde späť
      • SCHED_RR - procesy sa striedajú podľa časového kvanta
  • DL - deadline - Limitový plánovač
    • Používa špeciálny algoritmus:
      • SCHED_DEADLINE
    • Na základe pridaných informácií o danom procese dokáže plánovať optimálne.

Pozn.: Všimnite si, že RT procesy majú vždy prirodzene vyššiu prioritu.

Hodnoty „nice“ sa dajú špecifikovať pri spustení programu príkazom nice alebo zmeniť existujúcim procesom príkazom renice:

]# renice -5 9629	
9629 (process ID) old priority 0, new priority -5
 
]# renice 25 9629
9629 (process ID) old priority -5, new priority 19

Pozn.: Všimnite si, že je poreba superužívateľské práva.

Plánovací algoritmus sa určuje podľa plánovacej triedy a spolu s prioritami sa nastavujú napíklad príkazom chrt:

]# chrt --pid 9629
pid 9629's current scheduling policy: SCHED_OTHER
pid 9629's current scheduling priority: 0

]# chrt --fifo --pid 99 9629

]# chrt --pid 9629
pid 9629's current scheduling policy: SCHED_FIFO
pid 9629's current scheduling priority: 99

Taktiež dokážeme špecifikovať, aby boli určité procesy plánované len na určitej podmnožine procesorov (tzv. smp_affinity alebo cpu_affinity).
Táto vlastnosť sa najjednoduchšie nastavuje príkazom taskset:

]# taskset --pid --cpu-list 2,3 9629
pid 9629's current affinity list: 0-3
pid 9629's new affinity list: 2,3

Teraz bude PID 9629 plánovaný iba na logických procesoroch 2 a 3 (CPU)

]# taskset --pid --cpu-list 0-3 9629
pid 9629's current affinity list: 2,3
pid 9629's new affinity list: 0-3

Manuálové stránky

  • sched (7)
  • nice (1)
  • renice (1)
  • chrt (1)
  • taskset (1)

Linux kernel poskytuje administrátorom komplexné rozhranie (tzv. kontrol-grupy - control-groups - cgroups), prostredníctvom ktorého možu specifikovať rôznorodé vlastnosti pre skupiny procesov. Okrem všetkého čo je spomenuté vyššie, dokážu aj nastaviť pamäťové limity, obmedziť prístup k zariadeniam, kontrolovať prácu s diskom a iné.
Sú logicky rozdelené podľa rôznych podsystémov, ktorých vlastnosti alebo správanie upravujú:

]$ ls /sys/fs/cgroup/
blkio  cpuacct      cpuset   freezer  memory   net_cls,net_prio  perf_event  systemd
cpu    cpu,cpuacct  devices  hugetlb  net_cls  net_prio          pids        unified

Detailné vysvetlenie používania tejto technológie si však vyžaduje hlbšie znalosti o jednotlivých podsystémoch a nie je predmetom tohoto školenia.

Dokumentáciu cgroup prípadne nájdete priamo u dokumentácie kernelu, napríklad na stránkach kernel.org1).

Túto časť ešťe pripravujeme.

V dnešních distribucích se většinou setkáme s systemd, které se spouští při bootu se systémem a spouští systémové služby.

(…maybe TODO… víc technicky rozepsat podle freedesktop.org/wiki/Software/systemd)

(*TODO* jednotky možná nebudou nejlepší překlad)

Hlavní příkaz pro správu systemd je systemctl (1).

Zobrazí stav systému:

systemctl status

Vypíše běžící jednotky:

systemctl

nebo:

systemctl list-units

Vypíše pouze selhané jednotky:

systemctl --failed

Spustitelné služby se nachází v /usr/lib/systemd/system/ a /etc/systemd/system/ (tato cesta má vyšší prioritu).

Nainstalované služby lze také vypsat přes:

systemctl list-unit-files

Používání služeb

Služby mají přípony:

  • services (.service)
  • mount points (.mount)
  • devices (.device)
  • sockets (.socket).

Následující příkazy je nutné pouštět jako root, případně přes ověření (TODO)

Okamžitě zapne jednotku:

systemctl start unit

Okamžitě vypne jednotku:

# systemctl stop unit

Restartuje jednotku:

systemctl restart unit

Znovu načtení konfigurace jednotky:

systemctl reload unit

Zobrazí stav jednotky, jestli služba běží nebo ne (není nutné root)

systemctl status unit

TODO:

* enable/disable

* power management suspend, hibernate, poweroff…


1)
https://www.kernel.org/doc/Documentation/ - Dokumentácia Linux kernelu
  • Poslední úprava: 2022/11/14 11:12
  • (upraveno mimo DokuWiki)