Práce v prostředí ramdisku

Z DCEwiki
Skočit na navigaci Skočit na vyhledávání

Zavaděč

Start systému začíná zavedením binárního jádra do paměti počítače. O to se stará speciální aplikace - zavaděč. Zavaděč je aplikace, která není závislá na žádném konkrétním operačním systému, ale aby jej mohla spustit, musí být schopna načíst jeho jádro do paměti.

Pokud je toto jádro uloženo lokálně, na fyzickém disku, tak musí být schopen tento disk rozpoznat a data z něj přečíst. K tomu ovšem potřebuje příslušné ovladače.

Nejrozšířenějším linuxovým zavaděčem je v současné době GRUB2, který má oproti staršímu zavaděči LILO výhodu především v tom, že proces zavádění probíhá ve dvou krocích:

  1. Nejdřív se spouští modulární prostředí zavaděče, které má v sobě integrovaný shell
  2. a teprve pak se zavádí operační systém

Způsob jakým funguje GRUB je velmi podobný tomu, jak funguje zavádění linuxového systému. Ostatně inspirace linuxovým prostředím je u tohoto zavaděče víc než zřejmá.

Zavádění linuxového systému

Zavaděč načte z úložiště do paměti soubor s linuxovým jádrem (jeho jméno podle obvyklého úzu začíná řetězcem vmlinuz), spustí ho a předá mu příslušné konfigurační volby.

Spuštěné jádro se pokusí identifikovat a připojit zařízení, na kterém má být uložen systém a z něj spustit spouštěč dalších procesů - init. Aby to bylo možné, musí mít zakompilované všechny potřebné ovladače. U distribucí, které si kompilují jádro podle aktuální konfigurace stroje, s tím obvykle není problém. Ale u distribucí které mají fungovat univerzálně, by optimální konfigurace takového jádra mohla představovat neřešitelný problém. Proto vužívají modulární jádro, které při zavádění využívá tzv. RAM disk.

Poznámka Monolitické jádro, tj. to které je kompilované na míru, má výhodu v tom, že může být lépe optimalizované a tím pádem i o něco výkonnější.

RAM disk

Je čistě technicky vzato další kus operační paměti (odtud RAM disk), kam zavaděč vybalí z komprimovaného cpio archívu minimalistické linuxové prostředí. Jádro s ním pak pracuje jako by šlo o normální systémový disk. Tzn. že si jej připojí, a spustí z něj init. V tomto případě však nejde o binární spouštěč procesů, ale shellový skript co postupně spouští další skripty. Skript init obsahuje podmínky, které umožňují proces zavádění cíleně přerušit.

K takovému přerušení zaváděcího procesu obvykle dojde, když některý ze skriptů vrátí chybu. Prostředí a nástroje v ramdisku, umožňují zjistit příčinu chyby a případně provést její opravu. Někdy ale může být v okamžiku selhání pozdě na to zjišťovat, kde je problém, proto je dobré vědět jak takovou situaci navodit a co se dá dělat.

Přerušení zaváděcího procesu lze záměrně docílit tím, že se přes zavaděč předá jádru před jeho zavedením volba break. Nemá-li tato volba uveden žádný další parametr, dojde k přerušení ve fázi #premount - tj. před připojením kořenového souborového systému.

Že jsme v prostředí ramdisku se pozná tak, že se místo obvyklého přihlášení rovnou objeví textová konzole

(initramfs)

Pokud konzoli opustíme příkazem exit, bude zaváděcí proces dál pokračovat.

Poznámka Skript init, který je v kořeni ramdisku, se generuje na základě konfigurace v souboru /etc/initramfs-tools/initramfs.conf při sestavení souboru initrd. Ostatní skripty, které má ramdisk v adresáři /scripts. Se při jeho sestavení, či aktualizaci kopírují z adresáře /etc/initramfs-tools/scripts.

top

Parametr #top přeruší zaváděcí proces před spuštěním prvního skriptu. Jediná operace, která se realizuje dřív, je načtení obsahu paměti z disku, pokud byl systém při předchozím spuštění uspán na disk.

Během této fáze jádro provádí inicializaci existujících fyzických zařízení. Ty se přitom ohlašují svým specifickým kódem, na jehož základě jádro provádí identifikaci a natažení příslušného ovladače.

Poznámka Tabulka, podle které jádro provádí tuto identifikaci se generuje před(!) sestavením, či aktualizací ramdisku příkazem depmod

modules

Parametrem #modules se zavádění předtím, než init zavolá funkci load_modules. Ta zavádí další uživatelsky definované jaderné moduly, které nejsou bezprostředně vázané na konkrétní hardware, ale mohou být nezbytné pro další zavádění systému.

Kromě jaderných modulů a skriptů, které řídí zaváděcí proces, obsahuje ramdisk také nástroje a utility, co umožňují zavést systém ze sdíleného NFS adresáře, sestavit RAID pole, nahodit LVM skupinu, používat kryptovaný souborový systém, opravit poškozený souborový systém aj.

premount

Po načtení všech potřebných modulů se spouští skripty, které zpřístupní blokové zařízení, na kterém má být uložen kořenový adresář zaváděného systému. Které to je, jádru zavaděč předá při spuštění jako parametr volby root=. Skript init předanou hodnotu uloží do proměnné ${ROOT}, a lze ji přes echo vypsat.

Protože zde při zavádění nečastěji bývá problém, je parametr #premount výchozí pro volbu break, je-li uvedena bez parametru.

Jeví-li se obsah proměnné ${ROOT} v pořádku, je třeba zjistit výpisem přes ls, zda-li se příslušné zařízení v adresáři /dev skutečně vyskytuje. Pokud ne, tak to může znamenat že..

  • jádru chybí potřebný ovladač (po kompilaci modulu nebyl aplikován depmod a zaktualizován příslušný ramdisk)
  • nebo došlo k přejmenování zařízení (kupř. po přidání dalšího blokového zařízení do počítače, či při změně pořadí diskových oddílů)
  • nebo z nějakého důvodu nedošlo k sestavení příslušného blokového zařízení (v případě RAID pole či LVM skupiny)
Poznámka Některé zavaděče, jako např. GRUB, umožňují přepsat ještě před spuštěním zaváděcího procesu, ale jsou situace, kdy to udělat nelze.

mount

K přerušení zavádění může dojít i v případě, že je chyba v souboru /etc/fstab.

bottom

Většinu souborových systémů nelze opravit, pokud se s nimi pracuje. Systém uložený v ramdisku je tak ideálním prostředím pro takové operaci, protože

init