Inspekce hardware
Cílem tohoto kroku je zjistit, které moduly ovladačů zařízení musíme zahrnout do konfigurace jádra, aby jádro bylo schopné obsluhovat HW pokusného počítače.
Než však začneme se zkoumáním vnitřností pokusného počítače, musíme si trochu užít nakupování. Náš ”nákupní” seznam potřebných věcí obsahuje tyto položky:
- Jakékoliv nepoužívané PC, které obsahuje funkční CDROM/DVDROM mechaniku a paralelní port. Bylo by dobré, kdyby jeho konfigurace nebyla nijak výstřední ve smyslu použitých komponent. Dostupný seznam komponent a manuál k základní desce a případně i dalším komponentám jsou výhodou.
- Stáhnout a vypálit si na CD/DVD malou šikovnou distribuci Linuxu. V dalším textu budeme předpokládat mini live distribuci INSERT CDhttp://www.inside-security.de/insert_en.html.
Šroubovák do ruky
Nejsnazší cestou jak zjistit, co staré PC obsahuje, je rozdělat jej. Ano, v této fázi se bez šroubováku neobejdeme.
Takže rozděláme počítač, který bude předmětem našich hrátek s Linuxem a ovladači, a opíšeme si typ základní desky (pokud je někde na desce k nalezení), protože manuál k základní desce bude cenným zdrojem informací použitém o chipsetu, o CPU a případně i o integrovaném grafickém čipu.
Potom si opíšeme typy čipů na grafické kartě a na síťové kartě. U grafické karty může překážet chladič. Ten sundávat nebudeme, zkusíme si informace najít jinou cestou. Často bývá typ grafické karty vytištěn na jejím plošném spoji, takže s pomocí internetu lze dohledat i typ grafického čipu. Mimo to lze obecně řadu údajů o dané komponentě zjistit i vyhledáním jejího tzv. part numberu (PN) na internetu. Pokud je ovšem na plošném spoji dané komponenty uveden.
Typ procesoru (CPU) zjistíme snadno - během startu počítače z hlášení BIOSu. Typ harddisku a jeho kapacitu zjistíme také při startu BIOSu nebo v jeho nastavení pomocí autodetekce harddisků. Nebo případně přímo z popisku harddisku.
Kromě jiného je vhodné si poznamenat i další periférie dostupné na základní desce. Zdrojem informací bude opět manuál k základní desce anebo samotný BIOS, resp. jeho nastavení. Důležité je i zjištění informací ohledně podpory power managmentu, resp. standardu APM případně novějšího ACPI.
Inspekce našeho pokusného PC dopadla takto:
Komponenta | Výrobce | Typ, model | Zdroj informací |
CPU | Intel | Pentium II - 266Mhz | BIOS |
Základní deska | FIC | VL-601 | Popis na plošném spoji |
Chipset | Intel | 440LX (AGPset) | Manuál k desce |
Grafická karta | ATI | 3D Rage PRO AGP 2x | Popisek čipu |
Síťová karta | ??? | Realtek RTL8139D | Popisek čipu |
HDD | Seagate | ST320011A, 20GB, PATA | Popisek harddisku |
DVD-RW | Samsung | CD/DVDRW SH-S182D | Popisek DVD-RW |
Periférie základní desky | — | 2x sériové porty | Manuál k desce |
1x paralelní port | Manuál k desce | ||
2x USB port | Manuál k desce | ||
podpora APM | Manuál k desce |
Live CD do CDROM
Po základním, řekněme hrubém průzkumu hardware pokusného počítače, nás čeká další fáze. Spuštění live distribuce s jejíž pomocí budeme pátrat po potřebných ovladačích jádra.
Spustíme pokusný počítač a z nabootujeme z DVD-ROM mechaniky. Live distribuce INSERT CD naběhne do grafického režimu s X-windows. Pravověrní vyznavači příkazové řádky se do textové konzole mohou přepnout kombinací kláves Ctrl+Alt+F1, ostatní si kliknutím pravého tlačítka kdekoliv na ploše spustí kontextové menu a z něj pak emulátor terminálu.
Protože budeme potřebovat přenášet data mezi pracovním (s mateřskou distribucí Debian 6.0 Squeeze) a pokusným počítačem, zprovozníme si sdílení dat pomocí protokolu NFS. Pracovní počítač bude sloužit jako NFS server, pokusný pak bude NFS klient.
Postup:
- Na pracovní počítač nainstalujeme službu NFS serveru (jako root):
# apt-get install nfs-kernel-server nfs-common
- V pracovním počítači si vytvoříme si adresář /home/emlin/nfs-share, který bude sdílený pomocí protokolu NFS.
- Do souboru /etc/exports v pracovním počítači vložíme záznam, který pokusnému počítači (s IP adresou 192.168.1.121) povolí přístup přes NFS ke sdílenému adresáři /home/emlin/nfs-share v pracovním počítači:
/home/emlin/nfs-share 192.168.1.121(rw,sync,no_subtree_check,no_root_squash)
Upozorním jen na volbu no_root_squash, která se běžně nepoužívá, ale nám pomůže. Normálně má totiž root na počítači s NFS klientem přístupová práva ke sdíleném adresáři na stejné úrovni jako uživatel nobody na straně NFS serveru. Což znamená, že může data jen číst. To nám nehraje do not, protože my budeme do sdíleného adresáře v pokusném počítači ukládat např. výpisy programů apod. Proto tuto bezpečnostní ochranu vypneme a root na pokusném počítači se bude chovat jako root i na straně NFS serveru. - Resetujeme službu NFS serveru kvůli načtení upraveného souboru /etc/exports:
# service nfs-kernel-server restart
Odteď je adresář /home/emlin/nfs-share na pracovním počítači přístupný přes NFS. - Na pokusném počítači, kde běží live distribuce, si vytvoříme adresář, kam budeme připojovat sdílený adresář, např. adresář /mnt/nfs. Sdílený adresář pracovního počítače (s IP 192.168.1.120) připojíme na straně pokusného počítače (NFS klienta) příkazem:
# mount -o nolock -t nfs 192.168.1.120:/home/emlin/nfs-share /mnt/nfs
Průzkum skriptem
Nyní si v pracovním počítači vytvoříme ve sdíleném adresáři skript, který nám ulehčí část práce:
#!/bin/sh # # find-modules.sh # for i in $( find /sys/ -name modalias -exec cat {} \; ) do /sbin/modprobe --config /dev/null --show-depends $i; done | rev | cut -f 1 -d ’/’ | rev | sort -u
Skript pustíme na našem pokusném počítači:
$ cd /mnt/nfs $ ./find-modules.sh
Seznam modulů, které skript našel v našem pokusném počítači (odfiltrovali jsme všechny položky začínající na FATAL:) je v tabulce 1.2.
Takže (menší) část modulů máme nalezených.
Průzkum ručně
Zbývající moduly nalezneme ručně procházením adresáře /sys/bus, kde se nalézají podadresáře s názvy jednotlivých typů sběrnic. V každém z nich je pro nás zajímavý podadresář devices/, kde jsou adresáře pro jednotlivá zařízení. Ty postupně projdeme a budeme se zajímat o symbolický odkaz driver (pokud je přítomen). Ten odkazuje na soubor, jehož název je jméno modulu (tak jak se prezentuje v adresáři /sys), který obsluhuje dané zařízení (ukázka viz obrázek 1.4). Vyjímečně (především u zařízení na USB sběrnici) odkazuje symbolický odkaz driver na adresář, který obsahuje další symbolický odkaz module. Teprve ten pak odkazuje na soubor, jehož název je jméno modulu (viz obrázek 1.5).
U PCI zařízení (u těch, kde byl symbolický odkaz driver přítomen), je vhodné si poznamenat i dvě hexadecimální čísla: vendorID a deviceID. Ta jsou uložena v souborech vendor a device umístěných v adresáři daného zařízení. Tyto hodnoty se nám budou ještě hodit.
Poznámka: Údaje o zařízení na sběrnici PCI lze získat příkazem lspci. Podobně lze postupovat i pro sběrnici USB (příkaz lsusb). Výpis zařízení na mém pokusném PC je obrázku 1.6.
V tabulce 1.3 je seznam názvů modulů, které jsme našli v našem pokusném PC. Záměrně nepíšeme seznam modulů, nýbrž jen jejich názvů. To může být rozdíl, protože soubor modulu se může jmenovat jinak, než jak se modul prezentuje v systému, resp. v adresáři /sys.
Poznámka: Modul s názvem parport_pc nezahrneme do konfigurace jádra, protože pokusné PC bude sloužit především pro hrátky s HW přípravkem připojeným přes paralelní port. Tento přípravek budeme ovládat námi vytvořeným modulem. Proto v jádře nesmí být zaveden žádný jiný modul pro obsluhu paralelního portu než náš vlastní modul.
Konfigurační volby
Máme seznam modulů nebo jejich názvů. To je sice fajn, ale my potřebujeme vědět, která konfigurační volba v konfigurátoru jádra odpovídá danému modulu. Jinak nebudeme s to zahrnout modul do konfigurace jádra. Proto se pokusíme ke každému modulu nalézt ve zdrojových kódech jádra odpovídající symbolickou konstantu ve tvaru CONFIG_NECO. Při znalosti této konstanty lze pak v konfigurátoru jádra snadno najít odpovídající konfigurační volbu. Takže výsledkem naší snahy bude seznam symbolických konstant, ke kterým během konfigurace jádra nalezneme příslušné konfigurační volby.
Postup hledání konstant CONFIG_NECO je tento:
- Přepneme se do adresáře linux-2.6.35.13/drivers, kde se nalézají zdrojové kódy modulů jádra.
- Přes název modulu se pokusíme najít konstantu CONFIG_NECO v některém ze souborů makefile:
$ find -type f -name Makefile | xargs grep -i nazevmodulu.o
kde nazevmodulu je název modulu bez přípony *.ko, např. floppy. - Jestliže byl název modulu v nějakém makefile nalezen, zapíšeme si konstantu, která zajišťuje jeho kompilaci, např. CONFIG_BLK_DEV_FD pro modul floppy.ko, a pokračujeme v hledání pro další modul.
- Pokud modul v žádném makefile nenajdeme, zkusíme hledat obecnější název modulu, např. floppy.* nebo .*floppy.* - používáme regulární výrazy.
- Pokud se ani při obecnějším hledání nepovedlo najít odpovídající konstantu CONFIG_NECO, musíme bohužel podrobně projít konfiguraci jádra, přečíst si pečlivě nápovědu k jednotlivým volbám konfigurátoru a na základě znalostí o HW počítače zkusit odhadnout správnou konfiguraci.
V případě modulů, pro které se nám nepodařilo najít symbolické konstanty CONFIG_NECO, můžeme zkusit použít tento postup:
- V souboru linux-2.6.39.3/include/linux/pci_ids.h najdeme pro čísla vendorID a deviceID odpovídající symbolické konstanty (direktivy #define). Např. pro modul agpgart-intel (vendorID: 0x8086, deviceID: 0x7180) to provedeme takto (adresář linux-2.6.35.13 je aktuálním adresářem):
$ grep -i 0x8086 include/linux/pci_ids.h $ grep -i 0x7180 include/linux/pci_ids.h
Takže pro modul agpgart-intel jsou definovány definována symbolické konstanty PCI_VENDOR_ID_INTEL a PCI_DEVICE_ID_INTEL_82443LX_0. - Pak zkusíme nalézt takový modul, v jehož zdrojovém kódu bude uvedena alespoň konstanta pro deviceID. V případě shody u více modulů, musíme na základě znalostí o HW konfiguraci počítače odhadnout, který je ten správný. Když si nejsme jistí, je vhodné si udělat poznámky a pak zkusit více variant.Hledáme tedy dle konstanty pro deviceID (aktuální adresář je linux-2.6.35.13/drivers):
$ grep -Rl PCI_DEVICE_ID_INTEL_82443LX_0 *
Zjistili jsme, že názvu modulu agpgart-intel odpovídá soubor intel-agp. - Vrátíme se úplně na začátek a ve makefilech jádra budeme hledat soubor intel-agp. Úspěch! Symbolická konstanta pro modul agpgart-intel je CONFIG_AGP_INTEL.
Jednou z věcí, kterou je třeba mít na paměti je to, že moduly, které hledáme byly zavedeny požitou live distribucí. Novější jádra nebo jiné live distribuce by možná zavedly jiné moduly. Proto není dobré se získaného seznamu modulů držet za každou cenu. Tento seznam má být spíše vodítkem spolu s se všemi informacemi o HW počítače, které jsme nashromáždili. Zdravý selský rozum, pečlivé čtení nápovědi a experimentování s několika konfiguracemi nás vždy dovedou k cíli.
Další podstatnou skutečností je fakt, že naším cílem není zcela optimálně nakonfigurované jádro, ale ”jen” stabilně fungující jádro. Budeme si hrát, ne provozovat vytížený server.