next up previous
Next: Kořenový systém souborů Up: Jak jsem louskal Previous: Úvod

Moduly

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 gif 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.

Jak kompilovat jádro s podporou pro moduly

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, dialogu nabídne celoobrazovkové barevné menu tak, jak jsme zvyklí u setupu 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ářů.

Příklad, modul lp.o

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.



next up previous
Next: Kořenový systém souborů Up: Jak jsem louskal Previous: Úvod

Michal Kočer
kocer@merlin.pap.univie.ac.at