Dynamická konfigurácia jadra operačného systému FreeBSD

Okrem statickej konfigurácie jadra operačného systému FreeBSD pri jeho kompilácii existuje aj možnosť dynamickej zmeny jeho parametrov. Rozhranie, ktoré k tejto dynamickej konfigurácii slúži, sa nazýva sysctl. Pomocou rovnomenného nástroja (sysctl(8)) možno čítať niekoľko stovák parametrov jadra operačného systému FreeBSD a mnoho z nich aj meniť. Žiaľ, zatiaľ neexistuje kompletná dokumentácia, v ktorej by boli popísané všetky sysctl premenné, ich prípustné hodnoty, možnosti zmeny týchto hodnôt a efekty a dôsledky týchto zmien. Je to sčasti zapríčinené tým, že rozhranie sysctl sa nepoužíva na konfiguráciu a ladenie operačného systému v masovom rozsahu; zvyčajne je v každej inštalácii FreeBSD nutné či žiaduce zmeniť cez toto rozhranie iba jednu alebo niekoľko málo hodnôt. Zmena niektorých parametrov môže viesť aj k znefunkčneniu niektorých podsystémov jadra operačného systému, a preto je pri experimentovaní so zmenami parametrov cez sysctl potrebná opatrnosť a neraz hlboké znalosti o fungovaní podsystému, ktorého parametre sa menia.

Niektoré premenné jadra operačného systému FreeBSD je možné cez rozhranie sysctl iba čítať, nemožno ich však meniť. Programy ich používajú na zistenie informácií o operačnom systéme. Pre používateľa – obzvlášť pre administrátorov serverov – sú však zaujímavejšie tie parametre, ktoré je možné meniť a ovplyvniť tak správanie sa operačného systému. Ani zmena týchto meniteľných parametrov však nie je úplne priamočiara: niektoré parametre jadra FreeBSD možno síce meniť, ale nie počas behu systému, ale len pred zavedením jeho jadra a neskôr už musia zostať hodnoty týchto parametrov nemenné. Iné parametre je však žiaduce – a teda i možné – meniť prakticky kedykoľvek počas behu operačného systému. Existuje preto niekoľko rozličných spôsobov nastavovania sysctl parametrov.

Ak je daný parameter možné meniť len pred zavedením jadra operačného systému a počas jeho behu musí zostať nemenný, je potrebné ho nastaviť ešte skôr, ako sa riadenie odovzdá samotnému jadru, t.j. z boot manažéra. Ak sa jedná o jednorazovú zmenu nastavenia parametra, napríklad povolenia režimu Ultra DMA pre CDROM mechaniku počas inštalácie operačného systému z CD média, stačí prerušiť bootovaciu sekvenciu počas na to určenej desaťsekundovej pauzy pred zavedením jadra systému (podrobnosti viď v časti o kompilácii jadra operačného systému FreeBSD) a na príkazový riadok, ktorý sa spustí zadať nasledujúci príkaz:

ok set hw.ata.atapi_dma="1"

a potom obnoviť prerušené bootovanie príkazom:

ok boot

Ak je však žiaduce zapnúť režim Ultra DMA pre CDROM mechaniku pri každom štarte operačného systému FreeBSD – čo pri drvivej väčšine súčasných počítačov žiaduce je – je potrebné zadávanie tohto príkazu nejako zautomatizovať, pretože jeho ručné zadávanie pri každom zapnutí počítača by asi každého veľmi rýchlo omrzelo (FreeBSD z bezpečnostných dôvodov necháva režim Ultra DMA pre ATAPI CDROM mechaniky vypnutý). V takom prípade stačí príslušné meno sysctl premennej spolu s jej hodnotou zapísať do súboru /bool/loader.conf napríklad takto:

# echo 'hw.ata.atapi_dma="1"' >> /boot/loader.conf

na čo samozrejme treba mať rootovské práva. Týmto spôsobom je možné zabezpečiť pohodlnú inicializáciu väčšieho množstva sysctl premenných.

Premenné, ktoré je možné meniť za behu systému, možno zmeniť kedykoľvek pomocou príkazu sysctl(8) z príkazového riadku; samozrejme sú k tomu potrebné rootovské práva. Ako príklad možno použiť binárnu premennú kern.timecounter.method, ktorá môže byť nastavená na hodnoty 0 alebo 1, a určuje, ktorý z dvoch možných algoritmov implementovaných v jadre operačného systému FreeBSD sa bude používať na udržiavanie systémového času. Defaultná hodnota tohto parametra je 0, pri ktorej jadro používa rýchly a na systémové prostriedky nenáročný algoritmus. Niekedy ale môže byť nutné používať na udržiavanie systémového času iný algoritmus, ktorý je náročnejší na systémové prostriedky, ale je presnejší. Použitie tohto algoritmu možno zapnúť práve zmenou premennej kern.timecounter.method kedykoľvek počas behu operačného systému príkazom:

# sysctl kern.timecounter.method=1

na čo jadro zareaguje (okrem zmeny používaného algoritmu) výpisom

Kernel timecounter method: 0 —> 1

A keďže tých sysctl premenných, ktoré možno nastavovať počas behu systému, je veľké množstvo, opäť existuje spôsob, ako ich nastavenie po zavedení operačného systému zautomatizovať. Na tento účel slúži súbor /etc/sysctl.conf, v ktorom sa parametre sysctl a ich hodnoty zadávajú rovnako, ako tomu bolo v prípade tých parametrov, ktoré sa nastavovali pred zavedením jadra operačného systému v súbore /boot/loader.conf, t.j. napríklad pre vyššie zmienenú premennú kern.timecounter.method by sa jej nastavenie na hodnotu 1 po každom štarte operačného systému FreeBSD zabezpečilo zadaním príkazu (opäť s rootovskými právami):

# echo 'kern.timecounter.method="1"' >> /etc/sysctl.conf

Má kľúčový význam vedieť či a kedy je možné tú ktorú sysctl premennú meniť a podľa toho jej hodnotu nastaviť buď v súbore /boot/loader.conf alebo /etc/sysctl.conf. Pokus nastaviť v súbore /etc/sysctl.conf (alebo z príkazového riadku bežiaceho systému) premennú, ktorú možno nastavovať iba pred zavedením jadra operačného systému, skončí chybou, lebo v čase behu operačného systému je už táto premenná určená iba na čítanie. Naopak, ak sa premenná, ktorá sa nastavuje počas behu operačného systému nastaví v súbore /boot/loader.conf, žiadna chyba sa síce nespôsobí, ale pri prechode systému do viacpoužívateľského režimu bude táto premenná opätovne inicializovaná na svoju defaultnú hodnotu, a teda jej nastavenie stratí efekt. Samozrejme, nastavovať kdekoľvek a kedykoľvek hodnoty tých premenných, ktoré sú určené iba na čítanie (napríklad compat.linux), nemá zmysel a jadro operačného systému sa bude zmenám takýchto premenných brániť. A ako by tých komplikácií, výnimiek a odlišností nebolo dosť, tak niektoré sysctl premenné sa nastavujú podľa parametrov uvedených v hlavnom konfiguračnom súbore operačného systému FreeBSD /etc/rc.conf. Medzi takéto sysctl premenné patria napríklad kern.securelevel udávajúca bezpečnostnú úroveň behu systému (pozor, nezamieňať z pojmom runlevel, t.j. úroveň behu systému v operačnom systéme GNU/Linux alebo System V; úrovne behu systému v tomto zmysle operačné systémy BSD nemajú) alebo kern.dumpdev udávajúca BSD partíciu obsahujúcu odkladací priestor (swap), do ktorého sa urobí výpis pamäte v prípade havárie systému.

Všetky sysctl premenné spolu s ich hodnotami možno vypísať na obrazovku príkazom

% sysctl -a

a keďže je ich pomerne hodne (viac ako tisíc), zvyčajne sa výstup programu filtruje programom grep(1) alebo niektorou z jeho alternatív. Z výpisu uvedeného príkazu vidieť, že sysctl premenné tvoria hierarchickú štruktúru, pričom sú roztriedené do skupín podľa toho, k akému podsystému jadra operačného systému sa vzťahujú. Mená premenných nastavujúcich vlastnosti virtuálnej pamäte tak začínajú reťazcom vm., najvnútornejšie jadro operačného systému sa konfiguruje pomocou premenných začínajúcich na kern., virtuálny súborový systém má predponu vfs. a parametre týkajúce sa sieťového podsystému jadra – ktorých je dosť veľa – začínajú celkom očakávane na net..

Namiesto hodnôt jednotlivých sysctl premenných si možno nechať vypísať aj ich krátky popis a to s použitím parametra -d programu sysctl(8). Ďalšie podrobnosti o tomto príkaze sa možno dozvedieť z jeho manuálovej stránky. Popis niektorých sysctl premenných, ktoré má význam nastavovať a ladiť tak svoj operačný systém, sa nachádza v manuálovej stránke

% man 7 tuning

Pekná zbierka laditeľných parametrov spolu s ich krátkym vysvetlením sa nachádza aj v dodatku A k českému prekladu knihy Michaela Lucasa FreeBSD – síťový operační systém.

Pri nastavovaní sysctl premenných nie je dobré experimentovať naslepo a extrapolovať skutočný význam jednotlivých premenných podľa zdanlivého významu ich pomenovaní. Ako príklad možno uviesť premennú kern.randompid s defaultnou hodnotou 0. Zvedavci nech si skúsia jej význam domyslieť a vyskúšať si zmenu jej hodnoty; ak výsledky nesplnia ich očakávania, nech v archívoch elektronických konferencií pohľadajú niektorú z mnohých otázok ohľadom tohto parametra. Možno si potom uvedomia, že bez čítania manuálov to vo FreeBSD jednoducho nejde.

Nakoniec už len jedno upozornenie na studnicu veľmi praktických článkov týkajúcich sa BSD operačných systémov, ktorá sa nachádza – samozrejme v angličtine – na adrese http://www.onlamp.com/bsd/. Vedeli ste, že popri autoroch ako sú Jim Mock alebo Michael Lucas píše jedny z najlepších článkov o operačnom systéme FreeBSD žena s menom Dru Lavigne?

FreeBSD Project Home