Start jádra
Operační systém UNIX se startuje v následujících fázích:
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
id | dvouznakový unikátní identifikátor řádku | |||||||||||||||
rulevel | runlevely, pro které je řádek aktivní - navzájem ničím neoddělené znaky 0-6, S nebo s. | |||||||||||||||
způsob | označuje způsob spouštění
| |||||||||||||||
příkaz | program č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.
Runlevel | Linux | Solaris |
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 6skript /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.