15. "A" függelék - initrd.img fájl készítése

Az initrd az "initial ramdisk" (kezdeti RAM-lemez) rövidítése. Egy RAM-lemezen elegendő fájl fér el a szükséges eszközmeghajtók tárolásához. Ezek a meghajtók kellenek ahhoz, hogy a rendszermag fel tudja csatolni a / könyvtárat, és el tudja indítani az init-et. Az initrd-t tipikusan a hardver átmeneti "beindítására" használjuk, ezután a valódi rendszermag (vmlinuz) folytatja a betöltési folyamatot. Például, ha a rendszermag nem tudja olvasni az scsi merevlemezt az scsi eszközmeghajtó betöltése előtt. (Megoldás: tölts be egy initrd rendszermagot, amely majd betölti az igazi rendszermagot és használd az initrd-t az scsi betöltési problémájának megoldására.)

Megszabadulhatsz az "initrd.img" fájltól és nem szükséges akkor, ha az SCSI eszközvezérlőket fixen a rendszermagba fordítod, nem pedig modulba rakod. (Sokan ajánlják ezt).

15.1. Az mkinitrd használata

Az mkinitrd segédprogram készíti el az initrd fájlt, egyetlen paranccsal. Ez a parancs a RedHat jellegzetessége. A Linux többi terjesztéseinél hasonló parancsok létezhetnek. Nagyon kényelmes program.

Olvasd el az mkinitrd kézikönyv oldalát.


	/sbin/mkinitrd --help   # vagy egyszerűen: "mkinitrd --help"
	usage: mkinitrd [--version] [-v] [-f] [--preload <module>]
	       [--omit-scsi-modules] [--omit-raid-modules] [--omit-lvm-modules]
	       [--with=<module>] [--image-version] [--fstab=<fstab>] [--nocompress]
	       [--builtin=<module>] [--nopivot] <initrd-image> <kernel-version>
	       (example: mkinitrd /boot/initrd-2.2.5-15.img 2.2.5-15)
	# olvasd el a kezikonyv oldalt .....
	man mkinitrd
	su - root
	# Az alábbi parancs elkészíti az initrd fájlt
	mkinitrd  ./initrd-2.4.18-19.8.0custom.img   2.4.18-19.8.0custom
	ls -l initrd-2.4.18-19.8.0custom.img
	-rw-r--r--    1 root     root       127314 Mar 19 21:54 initrd-2.4.18-19.8.0custom.img
	cp  ./initrd-2.4.18-19.8.0custom.img   /boot
        

A következő fejezetekben olvashatsz arról, hogyan kell kézzel elkészíteni az initrd fájlt.

15.2. Rendszermag-dokumentációk

A /boot/initrd.img elkészítéséről szól az /usr/src/linux/Documentation/initrd.txt leírás, valamint a Loopback-Root-mini-HOWTO .

15.3. Linuxman Book

Egy részlet a "http://www.linuxman.com.cy/rute/node1.html" 31.7. fejezetéből.

Az SCSI telepítésének buktatói és az initrd

A következő leírás némelyike nehezen lesz érthető anélkül, hogy tudnál valamit a rendszermag-modulokról, amiket a 42. fejezetben mutat be. Később térj vissza erre a fejezetre.

Képzeljünk el egy rendszert, amiben egyetlen IDE lemez sincs, csak egy SCSI lemez tartalmazza a telepített Linuxot. Vannak az SCSI lemezt olvasó BIOS megszakítások, ugyanúgy, mint az IDE-hez, tehát a LILO vígan hozzá tud férni egy SCSI partíción lévő rendszermaghoz. Azonban a rendszermag "el fog veszni" a rendszermag-modulok nélkül [lásd 42. fejezet. A rendszermag magától nem tudja az összes létező hardver elemet támogatni. Ez általában egy fő részre (a rendszermag fájlra, amit ebben a fejezetben tárgyalunk) és modulok százaira (betölthető részek, amik a /lib/modules alatt találhatók) tagolható szét [ amik támogatják a sokféle típusú SCSI, hálózati, hangeszközt stb. ], amely képes vezérelni azt a bizonyos SCSI meghajtót. Így bár a rendszermag be tud töltődni és el tud indulni, de nem tudja felcsatolni a gyökér fájlrendszert az SCSI modul előzetes betöltése nélkül. Viszont a modul maga a gyökér fájlrendszeren foglal helyet a /lib/modules-ban. Ez egy trükkös helyzet, és kétféle módon lehet megoldani: (a) vagy előre engedélyezett (preenabled) SCSI támogatású rendszermagot, vagy (b) egy initrd előzetes gyökér fájlrendszernek nevezett fájlt használunk.

Az első módszert ajánlom. Magától értetődő (bár időigényes) folyamat egy olyan rendszermag elkészítése, ami beépített támogatást nyújt az SCSI kártyádhoz (és nem egy külön modulban). A beépített SCSI és hálózati meghajtók legtöbbször automatikus detektálást is végeznek, lehetővé téve az eszközhöz való időközbeni hozzáférést - mindenféle kapcsoló megadása nélkül működnek. [lsqb ] A 42. fejezet tárgyalja.] és ami még fontosabb, anélkül, hogy olvasnod kéne a beállításukról. Ennek befordított hardvertámogatás a neve (a modulos támogatással szemben). Az így készült rendszermag a modul méretével lesz nagyobb. A 42. fejezet taglalja az ilyen fajta programfordítást.

A második módszer gyorsabb, de trükkösebb. A Linux támogat egy olyan dolgot, amit initrd (initial RAM disk) néven ismernek. Ez egy kicsi, +1.5 MB méretű fájlrendszer, amit a LILO tölt be, és a rendszermag a valódi gyökér fájlrendszer helyett csatol fel. A rendszermag RAM-lemezként csatolja fel ezt a fájlrendszert, végrehajtja a /linuxrc fájlt, majd felcsatolja a valódi fájlrendszert.

31.6 fejezet initrd fájl készítése

Kezdjük egy kis fájlrendszer elkészítésével. Készíts egy könyvtárat [nbsp ]/initrd néven és másold át a következő fájlokat oda:


	drwxr-xr-x    7 root     root         1024 Sep 14 20:12 initrd/
	drwxr-xr-x    2 root     root         1024 Sep 14 20:12 initrd/bin/
	-rwxr-xr-x    1 root     root       436328 Sep 14 20:12 initrd/bin/insmod
	-rwxr-xr-x    1 root     root       424680 Sep 14 20:12 initrd/bin/sash
	drwxr-xr-x    2 root     root         1024 Sep 14 20:12 initrd/dev/
	crw-r--r--    1 root     root       5,   1 Sep 14 20:12 initrd/dev/console
	crw-r--r--    1 root     root       1,   3 Sep 14 20:12 initrd/dev/null
	brw-r--r--    1 root     root       1,   1 Sep 14 20:12 initrd/dev/ram
	crw-r--r--    1 root     root       4,   0 Sep 14 20:12 initrd/dev/systty
	crw-r--r--    1 root     root       4,   1 Sep 14 20:12 initrd/dev/tty1
	crw-r--r--    1 root     root       4,   1 Sep 14 20:12 initrd/dev/tty2
	crw-r--r--    1 root     root       4,   1 Sep 14 20:12 initrd/dev/tty3
	crw-r--r--    1 root     root       4,   1 Sep 14 20:12 initrd/dev/tty4
	drwxr-xr-x    2 root     root         1024 Sep 14 20:12 initrd/etc/
	drwxr-xr-x    2 root     root         1024 Sep 14 20:12 initrd/lib/
	-rwxr-xr-x    1 root     root           76 Sep 14 20:12 initrd/linuxrc
	drwxr-xr-x    2 root     root         1024 Sep 14 20:12 initrd/loopfs/
        

Az én rendszeremen, a initrd/bin/insmod fájl statikusan linkelt [ami azt jelenti, hogy nem igényel megosztott könyvtárakat ], a /sbin/insmod.static fájlból - ez a modutils-2.3.13 csomag része. Az initrd/bin/sash egy statikusan linkelt parancsértelmező a sash-3.4 csomagból. Az insmod-ot újra is fordíthatod forrásból, ha nincs statikus verziód. Esetleg másold be a szükséges DLL-eket a /lib-ből az initrd/lib könyvtárba. (A szükséges DLL-ek listáját megkapod, ha az "ldd /sbin/insmod" parancsot kiadod. Ne felejtsd el átmásolni a szimbolikus linkeket sem, valamint futtatni a "strip -s {lib}" parancsot, a DLL-ek méretének csökkentéséhez.

Most másold át az initrd/lib/ könyvtárba a szükséges SCSI modulokat. Például, ha egy Adaptec AIC-7850 SCSI adaptered van, akkor az aic7xxx.o modul kell a /lib/modules/{version}/scsi/aic7xxx.o fájlokból. Ezek után rakd be ezt a initrd/lib/ könyvtárba.


	-rw-r--r--    1 root     root       129448 Sep 27  1999 initrd/lib/aic7xxx.o
        

Az initrd/linuxrc fájlnak egy szkriptet kell tartalmaznia, hogy betöltse az összes modult a rendszermag számára, hogy hozzáférhessen az SCSI partícióhoz. Ebben az esetben, csak az aic7xxx modul kell [ az insmod az eszköz IRQ-ira és IO-címeire vonatkozó paramétereket is megkaphat, lásd a 42. fejezetet.]:


	#!/bin/sash
	 
	aliasall
	 
	echo "Loading aic7xxx module"
	insmod /lib/aic7xxx.o 
        

Alaposan ellenőrizd az összes jogosultságot, majd futtasd a chroot parancsot a fájlrendszer teszteléséhez.


	chroot ~/initrd /bin/sash
	/linuxrc
        

Ezután készíts egy "fájlrendszer-fájlt" (file system image), hasonlóan a 19.9 fejezetben leírtakhoz:

	dd if=/dev/zero of=~/file-inird count=2500 bs=1024
	losetup /dev/loop0 ~/file-inird
	mke2fs /dev/loop0
	mkdir ~/mnt
	mount /dev/loop0 ~/mnt
	cp -a initrd/* ~/mnt/
	umount ~/mnt
	losetup -d /dev/loop0
        

Végül tömörítsd össze a fájlrendszert a gzip programmal, valamilyen néven:

	gzip -c ~/file-inird > initrd-<kernel-version>
        

31.7 fejezet A lilo.conf módosítása az initrd használatához

A lilo.conf fájlt annak megfelelően kell megváltoztatni, hogy az initrd fájlrendszert töltse be. Egyszerűen add hozzá az initrd kapcsolót. Például:


	boot=/dev/sda
	prompt
	timeout = 50
	compact
	vga = extended
	linear
	image = /boot/vmlinuz-2.2.17
	        initrd = /boot/initrd-2.2.17
	        label = linux
	        root = /dev/sda1
	        read-only
        

Figyeld meg a "linear" kapcsoló használatát. Ez egy BIOS trükk, amiről a lilo(5) kézikönyv oldalán olvashatsz. Ez gyakran szükséges, viszont azt eredményezheti, hogy az SCSI lemezek nem lesznek átvihetők különböző BIOS-al rendelkező gépekre (azt jelenti, hogy újra le kell futtatni a lilo-t, ha egy másik gépbe rakod át a lemezt).