Cvičení ve 2. týdnu

Vypínání a zapínání systému, startovací scripty, inicializace a ovládání jednotlivých subsystémů, změna úrovně běhu (runlevel).


Start jádra
Operační systém UNIX se startuje v následujících fázích:

V učebně K310 je nainstalován OS Linux, který spolu s emulátorem Xen umí emulovat několik virtuálních PC. Virtuální PC načte do své paměti další jádro Linuxu a předá mu řízení. Jádro nakonec spustí program init. Naším cílem je procvičit fázi startup, tj. fázi zavádění systému po spuštění procesu init.

init
Proces init pouští inicializační scripty podle konfiguračního souboru /etc/inittab s následující strukturou:

id:runlevel:způsob:příkaz

iddvouznakový unikátní identifikátor řádku
rulevelrunlevely, pro které je řádek aktivní - navzájem ničím neoddělené znaky 0-6, S nebo s.
způsoboznačuje způsob spouštění
 respawn Opakované spouštění - po ukončení spustí znova.
wait Jednorázové spuštění, init čeká na dokončení procesu a pak pokračuje dalšími akcemi
once Proces bude spuštěn jednou, při vstupu do daného runlevelu
sysinit Proces se spustí jednou při startu systému
powerfail Proces se spustí, když napájecí jednotka detekuje výpadek napájení
příkazprogram či script, který se má spustit (vč. argumentů)

runlevel
Runlevel je tzv. úroveň běhu systému, kterou můžeme vzdáleně přirovnat k volbě režimů "normální", "nouzový" nebo "jen systém MSDOS" u operačního systému Windows. Zásadní rozdíl je v tom, že runlevel můžeme měnit nejen při startu, ale kdykoliv. Důležitou vlastností je, že můžeme snadno vytvořit další, svůj vlastní runlevel, pokud chceme, nebo jednoduše měnit vlastnosti standardních runlevelů. Běžně bývá k dispozici 7 runlevelů označovaných číslem 0-6 a jeden označen písmenem S. Runlevely s označením písmeny a,b nebo c jsou určeny pro volnou potřebu správce systému.
RunlevelLinuxSolaris
0 ukončení procesů, deaktivace HW, zastavení systému a vypnutí počítače, pokud to HW umožňuje ukončení procesů, deaktivace HW, zastavení systému, přechod do příkazového režimu BOOT-PROM
1 Ukončí daemony, deaktivuje síť a automaticky přejde do runlevelu S Administrativní stav, kdy se uživatelé nemohou přilogovat, ale lokální disky (filesystémy) zůstávají připojeny. Podobný runlevelu S.
2 Multi-user stav, ale neposkytuje služby (DNS, nfs, http, samba, yellow pages, ...) ostatním počítačům. Služby pro vlastní uživatele jsou v provozu (tiskový subs., cron, mail, X font server, ...) Multi-user stav, ale nejsou sdíleny přostředky (nfs, http, ...) ostatním počítačům.
3 Plnohodnotný normální stav Plnohodnotný normální stav
4 Nepoužívá se Nepoužívá se
5 Plnohodnotný stav s grafickou konsolí - ihnet po startu systému startuje X-server, takže přihlašování probíhá graficky v rámci X-Windows Ukončí procesy, zastaví systém, vypne počítač
6 Ukončí procesy, zastaví systém a opět ho restartuje Ukončí procesy, zastaví systém a opět ho restartuje
a,b,c nedefinovány, volné pro potřeby správce nedefinovány, volné pro potřeby správce
s,S tzv. single-user mode. Přihlašování zakázáno, běží jen skutečně nezbytné procesy single-user mode. Přihlašování zakázáno, běží jen skutečně nezbytné procesy, připojené jsou jen nezbytné lokální filesystémy (jen /)

Přepnutí způsobíme programem init, kterému jako parametr předáme požadovaný runlevel (přepnout runlevel může samozřejmě jen root). Např. příkaz init 0 způsobí vypnutí počítače. Účelem runlevelů je zamezit uživatelům v používání těch částí systému, které zrovna správce mění, nebo opravuje. Chce-li administrátor měnit konfiguraci http serveru, měl by přejít např. do runlevelu 2, kde sice mohou uživatelé normálně pracovat, ale jsou pozastaveny nabízené síťové služby. Z našeho hlediska je nejdůležitější runlevel 3 (běžný provoz), 5 (běžný provoz, pokud se chceme přihlašet v grafickém rozhraní - v tomto případě je dobré dát 5 jako default runlevel do souboru inittab - viz položka initdefault) a runlevel S (radikální administrace). Runlevel S je zvláště důležitý pro opravu porušených systémů souborů. Disky lze kontrolovat jen odpojené a odpojit je lze jen, když k danému filesystému nepřistupuje žádný proces. Proto je při opravě disků zcela nezbytné přejít do runlevelu S, kdy se ukončí všechny uživatelské procesy a je možné filesystém odpojit za účelem oprav.

Úkol 1: Zkuste přepnout runlevel na 2 a po nějaké době zpět na 3. Pozorujte změny. Porovnejte běžící procesy.

Při aktivaci runlevelu spouští proces init na základě řádek

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
skript /etc/rc.d/rc s číslem cílového runlevelu jako parametrem.

Úkol 2: Najděte ve skriptu /etc/rc.d/rc část, která spouští startovací skripty jednotlivých subsystémů.

Ovládání jednotlivých subsystémů
Pokud administrátor potřebuje dočasně pozastavit provoz některého ze subsystémů (např. za účelem oprav, či zálohování), může ho ovládat příslušným startovacím skriptem (tzv. rc-skriptem) z adresáře /etc/rc.d/init.d. Skripty reagují na parametry start a stop. Např. příkaz
/etc/rc.d/init.d/sshd stop
způsobí zastavení programu sshd, který umožňuje vzdálené interaktivní přihlášení. Opětovně ho spustíme stejným příkazem, ale s parametrem start.

Abychom nemuseli pokaždé psát plnou cestu k rc-skriptům existuje v distribuci RedHat příkaz service. Oba následující příkazy aktivují httpd (WWW server) a jsou naprosto ekvivalentní:
/etc/rc.d/init.d/httpd start
service httpd start

Automatické startování subsystémů
Pro každý runlevel je předepsáno, jaké systémy se mají spustit a které se mají zastavit. Předpis je tvořen symbolickými linky z adresářů /etc/rc.d/rc?.d/ zvlášť pro každý runlevel do adresáře /etc/rc.d/init.d/. Podívejte se např pro runlevel 3 do adresáře /etc/rc.d/rc3.d/: jsou tam jednak linky začínající písmenem K určující, které systémy mají být zastaveny při vstupu do runlevelu 3, a jednak začínající písmeny S, které definují startovací akce. Dvojčíslí ve jméně linku určuje pořadí provádění. Všiměte si, že existují např. linky S10network a S11portmap - síťový program portmap se spustí až po inicializaci síťových adaptérů, které používá. Nechcete-li automaticky spouštět některý subsystém, stačí daný link smazat, nebo přejmenovat na link s prvním písmenem K.

chkconfig
Administraci startovacích scriptů a vytváření příslušných symbolických linků z adresářů /etc/rc.d/rc?.d do /etc/rc.d/init.d usnadňuje v Linuxu program chkconfig, který umí naplánovat či zrušit provádění určitého subsystému v daném runlevelu, případně vypsat nastavení.

Úkol 3: Prostudujte startovací skript /etc/init.d/crond. Použijte tento skript k ručnímu zablokování pravidelně naplánovaných úloh a ověřte, že pravidelně plánované úlohy se přestaly spouštět. Poté subsystém crond opět odstartujte.

Singleuser mode
Při závažnějších poruchách systému se může stát, že některý startovací skript uvázne, systém nedokončí startup proceduru a uživatel, ani root se nemůže přihlásit, aby problém odstranil. V takových případech je možné restartovat systém do runlevelu S, kdy se spouští jen minimum startovacích skriptů a je tedy větší šance, že systém dovolí správci přihlášení a tím analyzovat a opravit poruchu. Při bootu lze v bootmanageru zadat parametr jádra S, který způsobí start přímo do runlevelu S.

Úkol 4: Přejděte nyní do runlevelu S (na Linuxu přes runlevel 1) příkazem init 1. Pozor! V runlevelu 1 nepracuje síťový subsystém a nepoběží vám SSH. V praxi budete ovládat stroj z konzole (v linuxu znakový režim). V učebně K310 použijte příkaz xm console ke zpřístupnění konzole virtuálního počítače. Zpět se vrátíte příkazem init 3 nebo init 5.

Přepnutí runlevelu může sloužit rovněž k restartu či vypnutí počítače. Restart resp. zastavení systému lze provést příkazem init 6 resp. init 0. Běžně se však zastavuje či restartuje systém příkazem shutdown, který umožní poslat přihlášeným uživatelům varování a odložit na stanovenou dobu spuštění init 0, aby uživatelé stihli ukončit svou práci. Podívej te se na man shutdown a vyzkoušejte příkaz shutdown -r +1 "Server bude restartovan".

Jak obejít init
Pokud je porucha systému tak závažná, že systém nenaběhne ani do runlevelu S, můžeme předat z bootmanageru jádru Linuxu parametr init=/bin/bash. V tom případě jádro nespouští ani proces init a místo něj spustí uvedený program. Je třeba vědět, že v tomto režimu sice může administrátor zadávat jakékoli příkazy (dokonce se nemusí ani přihlašet - vhodné např. k vymazání zapomenutého hesla administrátora), ale operační systém není vůbec inicializován, tedy krom jádra. Prakticky řečeno - máme k dispozici jen 1 terminál, připojený je JEN kořenový systém souborů (dokonce nemusí být ani /proc nebo /dev, které jsou nutné pro některé programy) a to jen v režimu read-only, neběží žádný jiný proces, není inicializována síť, není aktivní oblast swap, není nastaveno hostname, nemáme řádné prostředí procesů (proměnné PATH, UNAME, LOGNAME, TERM, atd), nefungují jmenné služby (DNS, nis, ldap, ...). V tomto režimu administrátor provede jen nejnutnější zásah (např. fsck nebo vi /etc/inittab, aby mohl restartovat alespoň do runlevelu S nebo dokonce 3, kde pak dokončí opravu. Typické příkazy zadané administrátorem mohou vypadat například takto:

bash# PS1='# '                          # nastavení promptu
# TERM=linux                            # nastavení známého terminálu
# export TERM                           # export nastavení i pro potomky
# mount /proc
# fsck /                                # kontrola kořenového systému souborů
# mount -o remount -w -n /              # změna připojení na read/write
# vi /etc/inittab                       # oprava chyby v konfiguračním souboru
# mount -o remount -r -n /              # změna na read/only
# sync                                  # uložení diskové cache
# reboot -f                             # "tvrdý" reboot

Úkol 5: Zkuste nastartovat systém bez procesu init. Pokud vám virtuální PC nedovolí předávat parametry jádru, přejmenujte program /sbin/init a místo něj nakopírujte /bin/bash. Zkuste opravit zapomenuté heslo administrátora.

V případě ještě závažnější chyby (porušené jádro, nečitelný systém souborů, přepsaný shell, aj.) je nutné nastartovat systém z jiného média (nejčastěji CDROM či síť) a lokální systém souborů připojit do volného adresáře, aby bylo možné chybu nalézt a opravit.