Dokumentáció/SL9.3/Rendszer/A kezdeti memóriaeszköz: initrd

Icon-initrd.png A Linux-kernel betöltését és a gyökérkönyvtár (/) csatolását követően betöltődhetnek különböző programok és további, kiegészítő funkciókat biztosító kernelmodulok integrálódhatnak. A gyökérkönyvtár csatolásához azonban bizonyos feltételeknek teljesülniük kell. A kernelnek szüksége van a megfelelő (legfőképpen az SCSI-) illesztőprogramokra, hogy kezelni tudja az eszközt, amelyen a gyökér fájlrendszer található. A kernelben meg kell lennie annak a kódnak is, amellyel el tudja olvasni a különféle fájlrendszereket (ext2, reiserfs, romfs stb). Ha pedig a gyökérkönyvtár titkosított, akkor jelszó szükséges a fájlrendszer csatolásához.

Bevezetés

A SCSI-illesztőprogramok problémájára több különböző megoldás is szóba jöhet. A kernel tartalmazhatná éppen az összes lehetséges illesztőprogramot, de ez nem szerencsés, hiszen az egyes illesztőprogramok zavarhatják egymást. No és persze a kernel is borzasztó nagyra nőne ettől. Megint csak egy másik lehetőség többféle kernel biztosítása, amelyek mindegyike csupán egy vagy néhány SCSI-illesztőprogramot tartalmaz. Ezzel az a probléma, hogy nagyon sokféle kernelre lenne szükség, amelyet tovább bonyolítanak a különböző optimalizálási igények (például Athlon processzorhoz vagy SMP-rendszerekhez optimalizálás). Az SCSI-illesztőprogram modulként betöltése azt az általános problémát veti fel, amelyet a kezdeti memóriaeszköz segítégével lehet feloldani: hogyan lehet felhasználói területeket programokat futtatni úgy, hogy a gyökér fájlrendszer még fel sincs kapcsolva?

A kezdeti memóriaeszköz (más néven initdisk vagy initrd) pontosan ezt a problémát oldja meg. A Linux-kernel leheővé teszi egy kis fájlrendszer RAM-ban létrehozását és programok futtatását onnan addig, amíg a tényleges gyökér fájlrendszer felcsatolásra nem kerül. Az initrd betöltését a rendszertöltő (GRUB) végzi. Az A GRUB rendszerindító menü bemutatja, hogyan van beállítva a rendszertöltő a kernel és az initrd betöltésére.

A rendszerindítási folyamat initrd-vel

Minden rendszerindítási folyamat első lépései a rendszer BIOS-ában zajlanak. Ezek a rutinok gondoskodnak a rendszertöltő elindításáról. A rendszertöltő ezután meghatározza az elindítandó operációs rendszert, és hogy milyen adatokat kell betölteni a rendszerindító adathordozóról. Ez a betöltési folyamat teljes egészében lekezelhető a BIOS-rutinokkal, nincs szükség semmilyen speciális illesztőprogramra.

A rendszertöltő betölti a kernelt és az initrd-t a memóriába, majd elindítja a kernelt. A rendszertöltő ezután értesíti a kernelt arról, hogy létezik egy initrd és hogy az hol található a memóriában. Ha az initrd tömörített volt (általában ez a helyzet), akkor a kernel kibontja az initrd-t és felcsatolja ideiglenes fájlrendszerként. Ezután elindul egy linuxrc nevű program. Ez a program már mindent el tud végezni, amire a megfelelő gyökér fájlrendszer felcsatolásához szükség van.Az initrd-n futó linuxrc-vel kapcsolatos megkötések, hogy a linuxrc speciális nevet kell viselnie, az initrd gyökérkönyvtárában kell, hogy legyen, valamint a kernel végre kell, hogy tudja hajtani. Ez azt jelenti, hogy a linuxrc lehet dinamikusan láncolt is. Ebben az esetben a /lib megosztott könyvtárainak teljes mértékben elérhetőnek kell lenniük az initrd-ben. A linuxrc lehet akár egy parancsfájl is. Ehhez viszont egy parancsértelmezőnek is léteznie kell a /bin könyvtárban. Röviden, az initrd-nek tartalmaznia kell egy minimális Linux-rendszert, amely lehetővé teszi a linuxrc program futtatását. A SUSE LINUX telepítésekor egy statikusan láncolt linuxrc szolgál az initrd méretének minimalizálására. A linuxrc root jogosultságokkal fut.

Ahogy leáll a linuxrc, az initrd lecsatolásra és eldobásra kerül, a rendszerbetöltési folyamat folytatódik, és a kernel felcsatolja a valódi fájlrendszert. Ami gyökér fájlrendszerként van felcsatolva, arra hatással lehet a linuxrc. Ehhez az kell, hogy felcsatolja a /proc fájlrendszert, és írja ki a valódi gyökér fájlrendszer értékét numerikus formában a /proc/sys/kernel/real-root-dev fájlba.

Az initrd a SUSE rendszerben

A rendszer telepítése

Az initrd már egy ideje használatos a telepítésnél: a felhasználó betölthet modulokat és elkészítheti a telepítéshez szükséges bejegyzéseket. Ezután a linuxrc elindítja a YaST-ot, az pedig végigviszi a telepítést. A YaST befejeződése után megmondja a linuxrc-nek, hogy hol található a frissen telepített rendszer gyökér fájlrendszere. A linuxrc ezt az értéket kiírja a /proc könyvtárba, majd újraindítja a rendszert. Ezután újra a YaST indul el és telepíti a rendszer maradék csomagjait.

A telepített rendszer indítása

A múltban a YaST több mint negyven kernelt kínált a rendszer telepítéséhez. A legnagyobb különbség az volt közöttük, hogy más és más SCSI-illesztőprogramot tartalmaztak. Ez ahhoz kellett, hogy a gyökér fájlrendszert fel lehessen csatolni a rendszer elindítása után. A további illesztőprogramokat később modulokként lehetett betölteni. Most, hogy optimalizált kernelek is vannak már, a fenti módszer nem megfelelő — több mint százfajta kernelre lenne szükség.

Éppen ezért normál esetben most az initrd szolgál a rendszer elindítására. Ennek módja a telepítésnél használt megoldáshoz hasonlít. Az itt használt linuxrc azonban mindössze egy egyszerű parancsfájl, amely betölt egy bizonyos modult. Ez általában egyetlen modul — a gyökér fájlrendszer eléréséhez szükséges SCSI-illesztőprogram.

Initrd létrehozása

Az initrd-t az mkinitrd (korábban mk_initrd) parancsfájl állítja elő. A SUSE LINUX-ban a betöltendő modulokat az /etc/sysconfig/kernel fájl INITRD_MODULES változója adja meg. Telepítés után ez a változó automatikusan beállításra kerüla helyes értékre (a telepítő linuxrc elmenti, hogy melyik modulok lettek betöltve). A modulok pontosan abban a sorrendben kerülnek betöltésre, mint ahogy az INITRD_MODULES változóban láthatók. Ez különösen akkor fontos, ha több SCSI-illesztőprogramot használunk, mivel másképp a merevlemezek neve megváltozik. Szigorúan véve elegendő a gyökér fájlrendszer eléréséhez szükséges illesztőprogramokat betölteni. Azonban az initrd betölti a telepítéshez szükséges összes SCSI-illesztőprogramot, mert később problémát okozhat a betöltésük.
Icon-Important.png Fontos!

Mivel az initrd-t a rendszertöltő tölti be ugyanúgy, ahogy a kernelt magát, (a map fájljában a LILO feljegyzi a fájlok helyét), a rendszertöltő LILO-t ugyanúgy frissíteni kell minden egyes alkalommal, amikor az initrd módosításra kerül. A GRUB esetében erre nincs szükség.

Lehetséges gondok — egyedi kernelek

Egy egyedi kernel gyakran vezethet a következő problémához: a megszokás miatt az SCSI-illesztőprogram be van drótozva a kernelbe, de az initrd változatlan marad. Rendszerindításkor a következő történik: A kernel már tartalmazza az SCSI-illesztőprogramot, ezért a hardvert felismeri a rendszer. Az initrd azonban most megpróbálja betölteni modulként az illesztőprogramot. Egyes SCSI-illesztőprogramok, különösen az aic7xxx esetében ez a rendszer lefagyásához vezet. Szigorúan véve ez egy kernelhiba. Egy már meglévő illesztőprogramot nem szabadna tudni betölteni még egyszer, modulként. A probléma azonban más kontextusból is ismert (ugyanez a helyet a soros csatolóval).

A problémára többféle megoldás is létezik. Állítsa be az illesztőprogramot modulként (hogy helyesen töltődjön be az initrd-ben). Ennek alternatívájaként törölje az /etc/grub/menu.lst vagy /etc/lilo.confinitrd bejegyzését (attól függően, hogy milyen rendszertöltőt használ). Az utóbbi megoldással egyenértékű, ha eltávolítja az INITRD_MODULES változót és utána lefuttatja az mkinitrd parancsfájlt, amelyik felismeri, hogy nincs szükség initrd-re.

Kilátások

Igen valószínű, hogy a jövőben az initrd szerepköre alaposan kibővül, és sokkal kifinomultabb dolgokra is használják majd, mint a / elérése.

  • Gyökér fájlrendszer elérése szoftveres RAID-en (a linuxrc beállítja az md eszközöket)
  • Gyökér fájlrendszer elérése LVM-en
  • Titkosított gyökér fájlrendszer elérése (a linuxrc bekéri a jelszót)
  • Gyökér fájlrendszer elérése egy PCMCIA-adapteren keresztül csatlakozó SCSI-merevlemezen

További információ az /usr/src/linux/Documentation/ramdisk.txt és /usr/src/linux/Documentation/initrd.txt fájlokban, valamint az initrd(4) kézikönyvoldalon olvasható.