Nejprve k historii modulů jádra linuxu. První Linux měl všechny potřebné ovladače přímo ve svém kódu. Jaké ovladače budeme chtít použít bylo třeba specifikovat během kompilace jádra. Jestliže si dokoupíme, či půjčíme nějaký hardware, například zipdrive, pro nejž jsme neměli v jádře přikompilovaný ovladač, bylo třeba překládat celé jádro, což není pro mnoho uživatelů Linuxu vůbec jednoduchá záležitost. Na druhé straně, chtěli-li bychom jádro se všemi ovladači, asi by nám v operační paměti moc volného prostoru nezůstalo, zvláště máme-li jí pouze 4MB a mnohé ovladače by si za celou dobu našeho linuxování mnoho nezapracovali.
Proto se hned od počátku vývoje Linuxu
začalo přemýšlet o možném řešení takového omezení a
velice brzy se začala realizovat myšlenka modularizace jádra.
Moduly jádra se do jádra instalovali ručně pomocí programu
insmod(1)
. Modulů tehdy ještě nebylo mnoho.
V současné době je práce s moduly
zautomatizovaná, modul se naistaluje na žádost jádra. Popišme si stručně
jak se tomu děje.
Jestliže jádro dostane požadavek na
akci, pro níž nemá podporu, zašle zprávu daemonu kerneld(1)
se
symbolickým popisem daného problému a kerneld
zařídí
instalaci daného ovladače, či ovladačů; spustí program
modprobe(1)
, ten se podívá do patřičných konfiguračních souborů
a nalezne-li modul odpovídající popisu
spustí insmod(1)
, který ovladač naistaluje s parametry určenými
konfigurací, modprobe
se ukončí a předá zprávu daemonu
kerneld
, že splnil (případně nesplnil) úkol. Jádro systému
pak užívá právě naistalovaného modulu naprosto stejně jako, kdyby bylo
obsaženo v jádře při jeho kompilaci.
Aby i náš systém pracoval podobným způsobem je třeba mít
jádro s podporou modulů a spolupráce s kerneld
, dále je samozřejmě
třeba mít dobře naistalované potřebné moduly odpovídající verze.
Poté je třeba udělat několik drobných úprav v našich bootovacích
rc.*
scriptech.
Většina nových distribucí Linuxu
již vše potřebné
obsahuje a moduly plně využívá. Následující řádky jsou určeny pro ty z vás,
kteří samy
upgradovali na jádro řady 2.0.x a chtějí automatické instalování
modulů využívat.
Abychom mohli používat dymicky instalovaných modulů, je třeba
jádro kompilovat s podporou pro moduly a kerneld
.
V nové řadě jádra linuxu se velice zjednodušila práce s kompilací jádra.
Jsou k dispozici kromě standardního make config
ještě
make menuconfig
či dokonce make xconfig
.
Menuconfig
nám po kompilaci, pro tento účel upraveného,
dialog
u nabídne celoobrazovkové barevné menu tak, jak jsme zvyklí
u setup
u distribuce Slackwaru. Nastavit vše potřebné je teď velice
pohodlné a přehledné, přičemž není potřeba procházet celou nabídku krok po
kroku,
ale stačí nastavit jen to co chceme. Máme možnost si nastavení uložit do
souboru.
Xconfig
je configurační menu založené na Tcl/Tk pro X Window Systém.
Při konfiguraci jádra umožníme loadable module support
a kernel daemon support
, tím si chystáme jádro schopné pracovat
s moduly. Pak v ostatní nabídce zvolíme do hlavního jádra jen to co
opravdu potřebujeme pro nabootování počítače. Vše ostatní co používáme
méně často označíme jako modul (m
).
Co lze používat jako modul? Podpora většiny filesystémů (minix, xiafs, msdos, umdos, sysv, isofs, hpfs, smbfs, nfs), věšina ovladačů SCSI na všech úrovních, většina síťových karet, ovladace CD-ROM a mnohé další ( popora tiskárnu na paralelním portu, podpora ELF, a.out, javy, podpora seriového rozhranní... .
Co a jak necháte v jádře napevno záleží jen na vaší libovůli.
Není dobrým řešením mít vše napevno v jádře, jelikož přicházíme
o paměť, avšak rovněž není řešením mít vše jako automaticky napojovaný
modul, jelikož
pak stále zaměstnáváme kerneld
a paměť ani čas neušetříme.
Jistá vyváženost při výběru modulů bude jistě
namístě.
Máme-li kernel nakonfigurovaný spustíme tradiční:
make dep ; make clean
make zImage
a navíc připojíme
make modules
které kompiluje potřebné moduly do formy objektových souborů
(*.o
) a symbolické linky na tyto soubory ukládá do
/usr/src/linux/modules
. Dopadne-li kompilace modulů dobře
spustíme
make modules_install
které naistaluje objektové soubory modulů do adresáře
/lib/modules/2.0.x
, kde x
je číslo kompilované verze
jádra linuxu. Moduly jsou uspořádány do několika adresářů.
Dejme tomu, že chceme naistalovat jen jeden
modul, například modul lp
pro podporu komunikace s tiskárnou
na paralelním
portu.
Není třeba připonínat, že vše co následuje
provádíme jako systémový administrátor root
v adresáři
/usr/src/linux
.
Pro větší názornost namísto make config
spustíme make menuconfig
. Po kompilaci programu scripts/lxdialog/lxdialog
---
specielně pro konfiguraci kompilace kernelu pravený program dialog
--- se objeví následující nabídka:
Linux Kernel Configuration ------------------------------------------------------------------------------ +------------------------------- Main Menu -------------------------------+ | Arrow keys navigate the menu. <Enter> selects submenus --->. | | Highlighted letters are hotkeys. Pressing <Y> includes, <N> excludes, | | <M> modularizes features. Press <Esc><Esc> to exit, <?> for Help. | | Legend: [*] built-in [ ] excluded <M> module < > module capable | | +---------------------------------------------------------------------+ | | | Code maturity level options ---> | | | | Loadable module support ---> | | | | General setup ---> | | | | Floppy, IDE, and other block devices ---> | | | | Networking options ---> | | | | SCSI support ---> | | | | Network device support ---> | | | | ISDN subsystem ---> | | | | CD-ROM drivers (not for {\sc SI or IDE/ATAPI drives) ---> | | | | Filesystems ---> | | | | Character devices ---> | | | +------v(+)-----------------------------------------------------------+ | +-------------------------------------------------------------------------+ | <Select> < Exit > < Help > | +-------------------------------------------------------------------------+Abychom mohli používat dynamické moduly vybereme položku
Loadable module support
,
ve které pomocí mezerníku označíme Enable loadable module support
a Kernel daemon support
:
Linux Kernel Configuration ------------------------------------------------------------------------------ +------------------------ Loadable module support ------------------------+ | Arrow keys navigate the menu. <Enter> selects submenus --->. | | Highlighted letters are hotkeys. Pressing <Y> includes, <N> excludes, | | <M> modularizes features. Press <Esc><Esc> to exit, <?> for Help. | | Legend: [*] built-in [ ] excluded <M> module < > module capable | | +---------------------------------------------------------------------+ | | | [*] Enable loadable module support | | | | [ ] Set version information on all symbols for modules | | | | [*] Kernel daemon support (e.g. autoload of modules) | | | | | | | +------------v(+)-----------------------------------------------------+ | +-------------------------------------------------------------------------+ | <Select> < Exit > < Help > | +-------------------------------------------------------------------------+Dvakrát stisknuté
escape
nás navrátí do hlavní nabídky, ze které
přejdeme do Character devices
a v této nabídce pak
označíme Parallel printer support
jako modul
vybráním položky a stisknutím M
:
Linux Kernel Configuration ------------------------------------------------------------------------------ +--------------------------- Character devices ---------------------------+ | Arrow keys navigate the menu. <Enter> selects submenus --->. | | Highlighted letters are hotkeys. Pressing <Y> includes, <N> excludes, | | <M> modularizes features. Press <Esc><Esc> to exit, <?> for Help. | | Legend: [*] built-in [ ] excluded <M> module < > module capable | | +---------------------------------------------------------------------+ | | | <*> Standard/generic serial support | | | | [ ] Digiboard PC/Xx Support | | | | < > Cyclades async mux support | | | | [ ] Stallion multiport serial support | | | | < > SDL RISCom/8 card support | | | | <M> Parallel printer support | | | | [ ] Mouse Support (not serial mice) | | | | [ ] Support for user misc device modules | | | | [ ] QIC-02 tape support | | | | < > Ftape (QIC-80/Travan) support | | | | [ ] Advanced Power Management BIOS support | | | +------------v(+)-----------------------------------------------------+ | +-------------------------------------------------------------------------+ | <Select> < Exit > < Help > | +-------------------------------------------------------------------------+V nabídce
General setup
nezapomeneme vybrat optimalizaci
pro náš procesor.
Program ukončíme svěma stisknutími escape
v hlavní nabídce
a potvrzením yes
na otázku zda chceme uložit právě nastavenou
konfiguraci.
Spustíme kompilaci kernelu: make dep; make clean; make zImage
Po úspěšném přeložení kernelu spustíme kompilaci modulů:
make modules
a proběhne-li vše bez problémů spustíme
make modules_install
.
V adresáři /lib/modules
se nám vytvoří adresář s úplným označením
naší verze jádra, řekněme
2.0.17
, a v něm v adresáři misc
by měl být naistalován
modul lp.o
.
Aby nám vše fungovalo jak má je třeba při bootu spustit
daemon kerneld
. Ve Slackwaru po úpravě vypadá
soubor /etc/rc.d/rc.S
takto:
#!/bin/sh # # /etc/rc.d/rc.S: System initialization script. # # Mostly written by: Patrick J. Volkerding, <volkerdi@ftp.cdrom.com> # PATH=/sbin:/usr/sbin:/bin:/usr/bin # enable swapping /sbin/swapon -a # Start update. /sbin/update & # # Nastartování daemonu kerneld, který automaticky načítá do kernelu # potřebné moduly. if [ -x /sbin/kerneld ] then /sbin/kerneld fi #... pokračuje nezměněný
/etc/rc.d/rc.S
if [ -x /etc/rc.d/rc.modules ] then /etc/rc.d/rc.modules else # Konec souboru /etc/rc.d/rc.S
V úvodu scriptu se spouští kerneld
a na konci skriptu
se spouští jiný script /etc/rc.d/rc.modules
,
který v našem případě může vypadat takto:
#!/bin/sh # # Script /etc/rc.d/rc.modules startuje vše potřebné # tak aby automatické natahování modulů fungovalo. # # PATH=/sbin:/usr/sbin:/bin:/usr/bin # Vytvoření potřebného linku na správný adresář z moduly k právě # spuštěnému kernelu ln -snf /lib/modules/`uname -r` /lib/modules/current # Vytvoření souboru závislostí if [ \! -r /lib/modules/current/modules.dep ] then echo "Creating module dependencies" /sbin/depmod -a fi # Konec scriptu rc.modules
No a nyní překopírujeme na správné místo
/usr/src/linux/arch/i386/boot/zImage
, nakonfigurujeme
LILO, či loadlin.exe
tak, aby se při restartu systému použilo
toto námi vytvořené jádro.
Vše ještě jednou překontrolujeme a provedeme restart systému.
Mělo by se použít námi skompilované jádro, spustit
kerneld
, vytvořit link /lib/modules/current
a posléze
soubor závislostí /lib/modules/modules.dep
.
Proběhlo-li vše tak jak má tak by se nám nyní při každém
pokusu přístupu na tiskárnu, například pomocí
příkazu lpr
, mělo ve výpisu načtených modulů (lsmod(1)
)
objevit řádek:
Module: #pages: Used by: lp 2 1 (autoclean)
Tento příklad je velmi zjednodušeným obrazem skutečnoti. Moduly se
dají použít i pro daleko složitější ovladače --- moduly lze spouštět
s parametry
(síťové a zvukové karty) uloženými v konfiguračním souboru
/etc/conf.modules
; moduly lze přihrát napevno (insmod(1)
);
moduly lze připojit
jen dočastě (modprobe(1)
);
modul lze smazat (rmmod(1)
), atd. .
Více se dočtete v dokumentaci ke kernelu v souboru
modules.txt
a v dokumentaci k ovladačům, jichž lze
použít jako modul.
Michal Kočer