Sessió 3. Compilació del kernel
16-01-2008
L'objectiu podria ser col.locar un driver que no tenim
- obtenció
- configuració
- compilació
- instal.lació
Per saber el número de ditribució del kernel:
$ uname -a
Linux ali15 2.6.18-3-686 #1 SMP Mon Dec 4 16:41:14 UTC 2006 i686 GNU/Linux
-> això vol dir que és la distribució 2.6
hi ha un salt brutal de la distribució 2.4 a 2.6. Per ex, política de dispositius (hi ha hotplug, posada en calent de dispositius, i una configuració dinàmica dels dispositius)
Les distribucions parelles (2.4, 2.6 són estables).
Les imparelles són de testing.
aptitude search linux | grep 2.6
obtenció del kernel
obtenim els fonts a kernel.org o a linux.org -> ho obtindrem amb format tar.gz (tgz) o tar.bz2
(empaquetament i compressió, sense patent, i comprimeixen millor que les eines amb patent)
una altra possibilitat és anar a la distribució Debian (paquet .deb)
$ aptitude search linux-source
-> linux-source-2.6.18
Entrem com a root (su, pwd: ice)
$ aptitude install linux linux-source-2.6.18
es connecta a rediris
Debian, les fonts les posa en el directori:
cd /usr/src
Ens hem descarregat el fitxer linux-source-2.6.18.tar.bz2 (és el font)
Hi ha una sèrie de guions-scripts que ens poden ajudar:
aptitude search kernel-package aptitude install kernel-package
el kernel-package té la missió en integrar els esforços que fem de compilar el nucli i convertir-ho en un paquet deb.
el kernel-package fa el make config (configuració), make install (compilació),... que farem manualment, i a més els guions de debian que ens portaran a què això sigui un paquet de Debian.
Ara hem de desplegar tot l'arbre del Kernel des d'aquesta arrel (descomprimir i desplegar):
si hagués vingut en format tar per descomprimir seria:
$ tar zxf linux-source-2.6.18.tar.bz2
- z: descomprimir coses que estiguin en format tar
- x: extreure
- f: a fitxer
però com que està en format tar.bz2 l'ordre és:
$ tar jxf linux-source-2.6.18.tar.bz2
(no he ficat l'opció v de verbose)
aquesta descompressió omple uns 200MB
Recordem que estem baixant els fonts, no els binaris.
Ara estem copiant els fonts al disc.
cd /usr/src/linux-source-2.6.18
en aquest directori tenim els fonts
Configuració
s'ha de fer make config, però hi ha el problema que és que s'ha de contestar centenars de preguntes
una altra possibilitat és partir d'una configuració de kernel que ja existeix.
$ ls /boot
aquí hi ha els fitxers de config que podem fer servir per a la configuració
mirar que hi ha dins de config-2.6.18-3-686 (cat)
copiem el fitxer al nostre directori:
$ cp /boot/config-2.6.18-5-686 .config $ cat .config | more
(el fitxer, com que té punt, vol dir que és ocult)
per saber quantes línies té:
wc -l .config
-> més de 3000 línies-etiquetes, de les quals la majoria són preguntes
$ make config -> no el farem, ens faria unes 3500 preguntes $ make xconfig -> accedim a les etiquetes que ens interessen
Em dóna un problema, falten les llibreries de QT (que ens portaria a una interfície gràfica)
anem allà on s'ha instal.lat la documentació
pushd /usr/share/doc/linux-source-2.6.18 (es torna al directori inicial amb popd)
podem llegir el readme
make menuconfig #->també falla.
Solució:
$ aptitude search ncurses
fem una instal.lació de libncurses-dev (de development)
aptitude install libncurses-dev
i ara make menuconfig sí que funciona.
ncurses is a programming library providing an API, allowing the programmer to write text user interfaces in a terminal-independent manner. It also optimizes screen changes, in order to reduce the latency experienced when using remote shells.
També podíem instal.lar les que ens provocaven l'error en make xconfig
aptitude search qt4-dev
busquem un paquet que sigui dev
aptitude install libqt4-dev
sembla ser que qt4 no va, qt3 sí que va
un cop instal.lat, make xconfig
si funciona, tenim dues possibilitats:
$ make xconfig # o bé $ make menuconfig
Abans de fer això, fem
$ make clean $ make menuconfig
per saber quin processador tinc, des d'un altre
terminal:
cat /proc/cpuinfo
seleccionem Pentium 4
Les respostes són tres si (seleccionar), no (no seleccionar), o M (mòdul, el carrega si el necessita en temps d'execució). El ficarem com a mòdul si no sé si el faré servir.
Integrados en la imagen o modulos.
La elección de si debemos marcar algo como módulo o bien integrarlo en la imagen, queda en la mayoría de los casos al libre albedrio de cada individuo, no obstante hay casos en los que solo podemos integrarlo. No es bueno tener todo integrado en la imagen, ya que esto la espesaría hasta tal punto de no caber en un disket o bien, en caso de que excediera mucho el
tamaño "normal", produciría un error al compilarse. Por tanto debemos escojer ciertas cosas como módulos. Claro ejemplo de ello son tarjetas de red, de sonido, soporte para dispositivos USB, SCSI, PCI, Paralelo, AGP, etc. Ya que esto suele ocupar bastante espacio en la imagen.
El Plug&Play el SO competeix amb la BIOS
Block Devices -> són els discs
RAID ann LVM (gestió de volums lògics -> que els diferents discs es vegin com una sola unitat)
Surto i guardo la nova configuració
Compilació
ara ho compilem:
hem de seguir les indicacions que trobem a:
pushd /usr/share/doc/kernel-package/ popd
$ make-kpkg clean $ make-kpkg --initrd --revision=joan1 kernel-image initrd serveix per carregar en memòria un boot d'un disc d'arranc, i permet carregar guions que ens permeten bootar des de, per ex, un dispositiu USB. -> ho hem fet sense initrd per que a l'aula no tenim permís per accedir al boot i ara triga molta estona anem a instal.lar un driver de Nvidia: <pre> $ aptitude search nvidia-kernel-source $ aptitude search ndiswrapper $ aptitude install nvidia-kernel-source
ara trobem a /usr/src el nvidia-kernel-source.tar.gz
$ tar zxf nvidia-kernel-source.tar.gz
ara hi ha un nou directori que es diu modules
/usr/src/modules/nvidia-kernel
i ara podem compilar aquest mòdul
$ aptitude install ndiswrapper-source
ara trobem a /usr/src el ndiswrapper-source.tar.bz2
$ tar jxf ndiswrapper-source.tar.bz2
El ndiswrapper el que fa és agafar un driver de windows i li fa un envoltori per tal que funcioni per a Linux.
lsmod -> podem saber els mòduls carregats en el kernel
la instal.lació d'un driver comporta una entrada en el directori /boot/config
cat /boot/config-2.6.18-5-686 | grep USB | more
(aplico un filtre, hi ha 3500 entrades)
per saber els mòduls que tenim instal.lats
$ ls -R /lib/modules/`uname -r` ls -R /lib/modules/`uname -r` | wc -l -> per saber el número de mòduls instal.lats (2774) això és la biblioteca de mòduls, que no vol dir que estiguin instal.lats -> uname -r ens diu el kernel que tenim instal.lat, per ex 2.6.22.14-generic (Ubuntu). i la instrucció /lib/modules/`uname -r` donaria com a resultat /lib/modules/2.6.22.14-generic ls -R -> recursiu dins dels directoris Per instal.lar un mòdul: <pre> $ modprobe -> prova un mòdul en el kernel per veure si funciona, i si no, ho descarta $ insmod -> instal.la el mòdul
modprobe sound
lsmod sound
operació inversa (remove):
rmmod sound
cat /etc/modules
This file contains the names of kernel modules that should be loaded
- at boot time, one per line. Lines beginning with "#" are ignored.
-> només hi ha el mòdul loop
cd /etc/modutils
Instal.lació
un cop ha acabat la compilació del kernel, i sense fer clean, des de /usr/src/linux-source-2.6.18
make-kpkg modules
per cada mòdul que hem baixat (ndiswrapper, nvidia) crea un paquet deb, que ara els podem instal.lar.
cd /usr/src/modules
i ara dins la carpeta usr/src veig els paquets deb que s'han creat:
nvidia-kernel-2.6.18_1.0.8776-4+joan1_i386.deb
ndiswrapper-modules-2.6.18_1.28-1+joan1_i386.deb
aquests paquets deb s'han d'instal.lar
$ dpkg -i ndiswrapper-modules-2.6.18_1.28-1+joan1_i386.deb <$pre> no em deixa perque hi ha un problema de dependències. Primer s'ha de fer: <pre> aptitude install ndiswrapper-utils-1.9
Nosaltres el ndiswrapper l'hem compilat a partir de les fonts, però evidentment per Inet ens podem baixar directament els .deb.
L'eina ràpida per fer tot això és el module-assistant:
aptitude install module-assistant (ja estava instal.lat) #module-assistant
és una eina que intenta fer les coses de manera més còmode.
Es pot executar des de la consola, o bé amb interfície pseudo-gràfica (igual que aptitude, que si no es posa res apareix la interfície gràfica)
PREPARE -> la únia cosa que necessita per compilar un mòduls són els headers
SELECT -> tot el que apareix aquí són fonts aquí trobem el ndiswrapper i el nvidia-kernel, i els seleccionem
GET -> ha anat molt ràpid perquè ja els teníem
BUILD -> malament, perquè els headers no coincideixen
$ aptitude search header