Ve chvíli, kdy máte již nabootován linuxový kernel a přimountován kořenový filesystém (/), programy mohou běžet a můžete začít nahrávat další moduly do kernelu, tak aby v systému šlo provozovat dodatečné funkce. Aby mohl být přimountován kořenový souborový systém, musí být splněny další podmínky. Kernel potřebuje odpovídající ovladač pro přístup k zařízení, kde je umístěn kořenový souborový systém (zvláště v případě SCSI ovladačů). V kernelu musí být taktéž přítomen kód, který umožní čtení ze souborového systému (ext2, reiserfs, romfs, atd.). Může se stát, že je souborový systém šifrován. V tom případě budete potřebovat heslo k tomu, abyste jej namountovali.
Problémy s SCSI ovladači je možné řešit několika způsoby. Kernel by teoreticky mohl obsahovat všechny možné ovladače, ale z důvodů častých konfliktů mezi nimi tomu tak není. Také by pak byl kernel příliš velký. Jinou možností řešit tento problém je vydání různých jader, každé s jedním nebo několika málo SCSI ovladači. Věc by pak komplikoval nárůst množství kernelů, což by bylo ještě prohloubeno rostoucím množstvím optimalizovaných jader (optimalizace pro Athlon, SMP). Myšlenka nahrávání SCSI ovladače vede k obecnému úskalí, které překonáváme v rámci konceptu init ramdisk: tedy metodou spouštění programů uživatelského režimu ještě předtím, nežli je namountován kořenový souborový systém.
Init ramdisk (také bývá nazýván initdiskem nebo initrd) řeší přesně problém, který jsme popisovali výše. Linuxové jádro dodržuje zásadu malého souborového systému, který je nahrán na RAM disk a spouští programy ještě předtím, nežli je přimountován vlastní kořenový souborový systém. Nahrání initrd je obslouženo zavaděčem startu systému (GRUB, LILO, atd.). Zavaděč bootu vystačí s rutinami BIOSu proto, aby nahrál data z bootovaného média. Jestliže je zavaděč startu systému schopen nahrát kernel, pak je také schopen nahrát init ramdisk. Speciální ovladače pak nejsou potřeba.
Zavaděč bootu nahraje jádro a initrd do paměti a jádro nastartuje. Také informuje jádro o existenci initrd, a kde se soubor nachází. V případě, že byl initrd komprimován (což je obvyklé), kernel jej rozbalí a připojí jako dočasný kořenový souborový systém. Pak je nastarován program linuxrc. Tento program se postará o vše potřebné k tomu, aby byl namountován skutečný kořenový souborový systém.
Jakmile linuxrc ukončí svou činnost, odmountuje se dočasný initrd a proces bootu pokračuje normálně s mountováním skutečného kořenového souborového systému. Mountování initrd a spouštění linuxrc je v podstatě velmi krátkou mezihrou před normálním procesem bootu.
Kernel se pokusí znovu namountovat initrd do /initrd ihned poté, co nabootuje aktuální kořenová partišna. Jestli to selže například z toho důvodu, že bod pro přimountování /initrd neexistuje, jádro se pokusí odmountovat initrd. Jestli toto nefunguje, pak je systém sice plně funkční, ale paměť zabranou initrd není možné odemknout a nebude k dispozici.
Požadavky pro program linuxrc v initrd jsou následující: musí mít své vlastní jméno linuxrc, musí se nacházet v kořenovém adresáři souboru initrd, a musí být spustitelný jádrem. To znamená, že soubor linuxrc lze dynamicky nalinkovat. V našem případě sdílené knihovny v adresáři /lib musí být všechny dostupné přes initrd. linuxrc může být také shellový skript. Aby fungovala tato varianta, musí být shell umístěn v adresáři /bin. Stručně řečeno initrd musí obsahovat minimální linuxový systém, který umožní běh programu linuxrc. Když instalujete SUSE LINUX je staticky linkovaný linuxrc a initrd je udržován jako co nejmenší. linuxrc je spouštěn s právy superuživatele root.
Jakmile linuxrc ukončí svou činnost,, initrd je odmountován a zrušen, proces startu systému pokračuje jako normálně a jádro mountuje skutečný souborový systém. Co bude takto mountováno jako kořenový souborový systém můžeme ovlivnit díky linuxrc. Stačí pouze mountovat /proc souborový systém a zapsat hodnotu skutečného souborového systému v numerické podobě do /proc/sys/kernel/real-root-dev.
Většina zavaděčů, včetně GRUB, LILO, a syslinux, si s initrd umí poradit. Jednotlivým zavaděčům předejte instrukce pro přístup k initrd následujícím způsobem:
Napište řádek do souboru /boot/grub/menu.lst:
initrd (hd0,0)/initrd
Adresa pro nahrání initrd se zapíše do spuštěného obrazu jádra a příkaz initrd musí následovat po příkazu kernel.
Pro zavaděč napište následující řádek zde /etc/lilo.conf:
initrd=/boot/initrd
Následující zapište do souboru syslinux.cfg:
append initrd=initrd
Můžete zde přidat další parametry.
initrd se využívá již delší dobu při instalaci: uživatel může nahrát moduly a zapsat vstupy nutné pro správný průběh instalace. linuxrc pak startuje YaST, který převezme řízení instalace. Když YaST dokončí svoji práci, sdělí programu linuxrc, kde se nachází kořenový souborový systém nově nainstalovaného systému. linuxrc pak zapíše tuto hodnotu do /proc a rebootuje systém. Pak YaST nastartuje znovu a instaluje zbývající balíčky systému.
V minulosti YaST nabízel přo instalaci systému více než čtyřicet druhů jádra. Hlavním rozdílem mezi jádry byla přítomnost specifických SCSI ovladačů. To bylo nezbytné proto, aby po bootu došlo k připojení kořenového souborového systému. Další ovladače už posléze bylo možné načítat jako moduly. Nyní se koncepce změnila, k dispozici jsou optimalizovaná jádra, koncepcei není možné déle ovládat programem — protože bychom k tomu potřebovali něco kolem stovky druhů obrazů jádra.
To je důvodem proč používáme initrd dokonce v případě běžného startu systému. Způsob jakým je program využíván se podobá metodě instalace. Linuxrc, který používáme v tomto případě, je ovšem jednoduchým shellovým skriptem s definovanou úlohou nahrát příslušný modul. Typicky jde o jeden modul —, který je potřeba pro přístup SCSI ovladače ke kořenovému souborovému systému.
Soubor initrd vytváří skript mkinitrd (v minulosti nazývaný mk_initrd). V systému SUSE LINUX jsou nahrávané moduly definovány proměnnou INITRD_MODULES v souboru /etc/sysconfig/kernel. Po instalaci je této proměnné automaticky přiřazena správná hodnota (instalace linuxrc zjistí, které moduly byly nahrány). Moduly jsou nahrávány ve stejném pořadí, v jakém se objevují v INITRD_MODULES. To je užitečné v případě používání několika SCSI ovladačů, protože jinak by hrozilo přejmenování hardisků. Když bychom chtěli být velmi přesní, stačilo by nahrát jen ovladače nutné k přístupu do kořenového souborového systému. Ovšem všechny SCSI ovladače nutné k instalaci jsou obvykle nahrávány pomocí initrd, protože pozdější nahrávání by mohlo být tak či onak problematické.
![]() | Důležité |
|---|---|
Aby byl nahrán initrd zavaděčem bootu systému stejným způsobem, jakým je nahráváno jádro (jde o soubor map LILO který sleduje umístění souborů), musíte updatovat zavaděč startu systému LILO pokaždé, kdy modifikujete initrd. Toto není nezbytné v případě zavaděče GRUB. | |
Upravená jádra často mají následující problém: SCSI je nekonvenčně tvrdě slinkován s jádrem, ale existující initrd zůstane v nezměněné podobě. Když nabootujete, stane se následující: Jádro již obsahuje ovladač SCSI a hardware je detekován programem initrd, ovšem zkouší nahrát ovladač jako modul. Některé SCSI ovladače, zvláště pak řady aic7xxx, uzamknou systém. V podstatě jde o chybu jádra. Již zavedený ovladač by neměl být znovu nahráván jako modul. Problém se projevuje i v jiném kontextu - při instalaci sériových ovladačů.
Existuje několik možných řešení. Nakonfigurujte ovladač jako modul (pak bude správně nahrán do initrd. Alternativou je odstranění vstupu do initrd ze souboru /etc/grub/menu.lst nebo /etc/lilo.conf, což závisí na typu zavaděče systému. Ekvivalentní je odstranění proměnné INITRD_MODULES při spouštění mkinitrd, který si uvědomí, že potřebuje soubor initrd.
Je zcela možné, že v budoucnu dojde k posílení vlivu souboru initrd, a že bude používán mnohem více a pro mnohem složitější úlohy, nežli jen k nahrávání modulů nutných pro přístup k /.
Kořenový souborový systém na softwarovém RAIDu (linuxrc nastavuje zařízení md)
Kořenový souborový systém na LVM
Šifrovaný kořenový souborový systém (linuxrc vyžaduje heslo)
Kořenový souborový systém na SCSI hardisku s PCMCIA adaptérem
Pro více informací nahlédněte /usr/src/linux/Documentation/ramdisk.txt, /usr/src/linux/Documentation/initrd.txt, a manuálové stránky initrd.