3. Betölthető modulok

Mindenki, aki használta a "betölthető modulokat", igazán "megszerette" őket! Szeretem a modulokat, mivel agyafúrt dolgok, és a nagyobb feladatokat kicsi, kezelhető részekre szedik szét. Ha elkezded használni, fogadok, hogy megszereted őket! A modulok csak a Linuxra jellemzőek. Ez volt a világ első olyan operációs rendszere, ami bemutatta a betölthető modulok fogalmát. Egyetlen más operációs rendszer sem rendelkezik ezzel a fogalommal, de a közeljövőben más rendszerek is megvalósíthatják.

A betölthető modulok memóriát spórolhatnak, és megkönnyítik a beállítást. A modulok hatóköre magában foglalja a fájlrendszereket, ethernet kártyák, szalagos meghajtók, nyomtatók és mások eszközmeghajtóit.

A modulok a rendszermag kódjának darabjai, amelyeket nem csatoltak (foglaltak bele) közvetlenül a bele. Az ember lefordíthatja őket elkülönítve is, és beillesztheti vagy eltávolíthatja a futó rendszermagból majdnem bármikor. Rugalmasságából kifolyólag nem ajánlott bizonyos rendszermag-jellemzőket beléjük kódolni. Sok népszerű eszközmeghajtó, mint például a PCMCIA és a QIC-80/40 szalagos eszközmeghajtók, betölthető modulok.

Olvasd el a Module-HOWTO (Modul HOGYAN) doksit: "http://www.tldp.org/HOWTO/Module-HOWTO" .

Olvasd el ezeket a kézikönyv-oldalakat is:

	bash# rpm -i /mnt/cdrom/Redhat/RPMS/modutils*.rpm
	bash# man lsmod
	bash# man insmod
	bash# man rmmod
	bash# man depmod
	bash# man modprobe
      
Például, ha be akarod tölteni a /lib/modules/2.4.2-2/kernel/drivers/block/loop.o modult, tedd ezt:

	bash# man insmod
	bash# modprobe loop
	bash# insmod loop
	bash# lsmod 
      
Az insmod keresési útvonalát (PATH) az /etc/modules.conf fájlban állíthatod be.

3.1. A modulok segédprogramjainak telepítése

A modulok segédeszközeinek RPM csomagját így telepítheted:

	bash# rpm -i /mnt/cdrom/Redhat/RPMS/modutils*.rpm
        

Az insmod beilleszti a modult a futó rendszermagba. A modulok általában a .o kiterjesztéssel rendelkeznek; a példaként említett neve drv_hello.o , így ennek beillesztéséhez kiadjuk az: " insmod drv_hello.o " parancsot. A rendszermag által jelenleg használt modulok listájához használd az lsmod parancsot. A kimenet valami ilyesmi: blah# lsmod Module: #pages: Used by: drv_hello 1 " drv_hello " a modul neve, egy lapnyi (4k) memóriát használ, és jelenleg nincs más modul, ami tőle függ. Eltávolításához használd az " rmmod drv_hello " parancsot. Figyeld meg, hogy az rmmod egy modulnevet, nem pedig egy fájlnevet igényel; ezt kinyerheted az lsmod listájából. A többi modul-segédeszköz céljait a kézikönyv-oldalaik írják le.

3.2. A rendszermaggal szállított modulok

A 2.0.30-as verziótól kezdve, majdnem minden elérhető betölthető modul formájában. A használatukhoz először bizonyosodj meg, hogy nem állítod be őket a rendes rendszermagban; tehát nem válaszolsz y -el ezekre a " make config " alatt. Fordíts egy új rendszermagot és indítsd el. Aztán: cd az /usr/src/linux könyvtárba ismét, és: " make modules ". Ez lefordítja az összes modult, amit nem adtál meg a rendszermag konfigurációjában, és hivatkozást (link) készít hozzájuk az /usr/src/linux/modules könyvtárba. Használhatod őket egyenesen abból a könyvtárból vagy hajtsd végre a " make modules_install " parancsot, ami telepíti őket a /lib/modules/x.y.z könyvtárba, ahol x.y.z a rendszermag verziója.

Ez főleg a fájlrendszereknél lehet kényelmes. Valószínűleg nem használod gyakran a minix vagy a msdos fájlrendszert. Például, ha belebotlok egy msdos (iszonyat!) hajlékonylemezbe, csak beírom: insmod /usr/src/linux/modules/msdos.o , és aztán rmmod msdos , amikor végeztem. Ez az eljárás körülbelül 50k RAM-ot spórol a rendszermagban a normál működés során. Egy kis megjegyzés kívánkozik ide a minix fájlrendszer kapcsán: mindig közvetlenül a rendszermagba állítsd be, ha "mentőlemezen" akarod használni.

3.3. Hogyan telepítsek csak egyetlen modult?

Tegyük fel, hogy már megcsináltad a "make modules" és "make modules_install" lépéseket. Később pedig még a "make clean"-t is a helyfelszabadítás érdekében. Most pedig változtatni akarsz valamelyik modul egyetlen C fájlján, és újra akarod építeni azt az egy modult, és a modulfájlt bemásolni a /lib/modules alá. Hogyan csinálod? Hiszen nem akarsz egy "make modules" parancsot kiadni, az mindent újraépít és 2-3 óráig tart!

Le tudsz fordítani egyetlen modulfájlt (mondjuk a foo.o-t) és telepítheted is. Ehhez egyszerűen szerkeszd meg a Makefile-t, és változtasd meg a SUBDIRS bejegyzést csakis azokra a könyvtárakra, amik érdekelnek.

Egy jó példa: azt vettem észre, hogy a rendszermagom nem támogatja az NTFS fájlrendszert (persze kiadtam a "make clean"-t a "make modules" után. A francba!). Így elhatároztam, hogy lefordítom az NTFS betölthető modulját. Nem akartam az egész készletet (mivel ez nálam 2 óráig tartana), ezért az alábbi módszert követtem, és csak a fs/ntfs modult fordítottam, majd kiadtam az "insmod ntfs" parancsot. Az egész 5 percig tartott!

Másik példa: ha csak az fs/autofs modul érdekel, akkor a következőket teszem:

	cd /usr/src/linux
	mv Makefile Makefile.original
	cp Makefile.original Makefile.my
	ln -s Makefile.my Makefile   # mivel néhány fájlnak még szüksége lehet a "Makefile"-ra
	vi Makefile.my
	# Megjegyzésekkel láttam el a "SUBDIRS" sorokat, és hozzáadtam azokat a könyvtárakat, amik érdekeltek
	# például a fs/autofs-hez:
		#SUBDIRS	=kernel drivers mm fs net ipc lib abi crypto
		SUBDIRS		=fs/autofs
	# Elmentettem a Makefile.my fájlt és kiadtam a következő parancsot:
	make -f Makefile.my modules
	# Ez megcsinálja az autofs.o modult
	# Most bemásoltam a modul objektumfájlt a célkönyvtárba: /lib/modules
	# VESZÉLYES: NE CSINÁLD EZT: "make -f Makefile.my modules_install" , mivel kitakaríthatja
	# a többi jót is a /lib/modules könyvtárból !! Csak másold be, így:
	cp autofs.o /lib/modules/2.4.18-19.8.0/kernel/fs/autofs
	  
	# Most állítsunk vissza mindent a normál helyzetbe
	rm Makefile  # This is a link to Makefile.my
	ln -s Makefile.original Makefile
	  
	# Rögzítsd a változtatásokat a beállítófájlban a későbbi használat érdekében
	# Szerkeszd az /usr/src/linux/.config fájlt és állítsd be modulként a szolgáltatást
	cd /usr/src/linux
        mkdir /usr/src/kernelconfigs ;
        cp /usr/src/linux/.config  /usr/src/kernelconfigs/.config.save;
	cp /usr/src/linux/.config  /usr/src/linux/configs/.config.save  # Különösen biztonságos
	cp /boot/config*  /usr/src/linux/configs/  # Különösen biztonságos
	vi /usr/src/linux/.config 
	# és változtasd meg a beállító paramétert. Például az én esetemben
	# az ntfs modulnál CONFIG_NTFS_FS=m jelzi, hogy ez modul.
        

Többet is megtudhatsz a Makefile-ról és a make-ről, ha elolvasod a GNU make kézikönyv oldat:

Ismerkedj meg a modulokat elkészítő Makefile-al. A fájlnak van egy "module" sora, mint:

	modules: $(patsubst %, _mod_%, $(SUBDIRS))
        

A patsubst függvény szintaktikája $(patsubst minta,helyettesítés,szöveg). A százalékjelet ([percnt]) ugyanúgy használja, mint a mintaillesztő szabályok - mint egy sztringet, ami illeszkedik a mintában és a helyettesítő szövegben is. Végigkeresi a "szöveg"-et elválasztójellel tagolt szavakért, amik illeszkednek a "mintá"-ra és kicseréli az előfordulásaikat a "helyettesítés"-re.

Ez a Makefile ugyanúgy tartalmaz szabványos shell-függvényeket, mint szabványos make függvényeket. A shell-függvények szintaktikája $(shell parancs). Ez a függvény kimenetét adja vissza (az új sorok kihúzásával).