Compilar un Kernel/Nucleo

De K-DEMar Docs Castellano

Tabla de contenidos

Introducció

Aquest manualensenya com compilar un nucli a la Debian Way. És una manera més fàcil de compilar i gestionar els nuclis instal·lats, utilitzant els paquets .deb, pels sistemes basats en Debian.
Si no s'utilitzés la facilitat de compilar que et dona Debian (Debian Way), el nucli s'hauria d'instal·lar manualment, i no es podría borrar, ni instal·lar, ni gestionar facilment. Debian, però, va crear una sèrie d'utilitats que permeten compilar el nucli, i instal·lar-lo, sense cap mena de complicació per un usuari novell.

Bases

Primerament, haurem de descarregar-nos el nucli que volguem de la pàgina [www.kernel.org] o de qualsevol dels seus miralls.
Un cop això, haurem d'anar a la carpeta on l'hàgim descarregat, i l'haurem de descomprimir. Un cop fet això, tindrem el nucli ja preparat per compilar.

Abans de compilar un nucli propi, en debian, ens haurem d'assegurar que tenim el paquet kernel-package, com a mínim. Per tal de poder configurar el nucli, de manera gràfica, haurem d'instal·lar alguns paquets addicionals.

  • Mínim:
apt-get install kernel-package libc6-dev build-essential


  • Per una configuració gràfica (Recomenat - Opcional):
apt-get install libqt3-mt


  • Per una configuració en mode text (Si ho vols en mode text - Opcional):

Si has instal·lat el paquet per una configuració gràfica, aquest no fa falta.

apt-get install libncurses5-dev

Parxejar (Pegats)

Concepte

Els nuclis estandard són molt complets i molt bons, però, de vegades nosaltres necessitem més funcionalitats, que no estan en la branca "oficial" del nucli. Com, per exemple, fins el 2.6.12, els mòduls de les targes wifi dels portàtils centrino. Llavors, has de mirar quina funcionalitat vols afegir, a través del google, i buscar el pegat que vulguis.

Hi ha dos maneres per afegir mòduls addicionals al nucli.

  • Moduls compilats a part

Aquest tipus de mòdul, has de tenir ja compilat un nucli, i després, compilar el mòdul desitjat. Necessitaràs tenir les headers del teu nucli, per tal de poder-ho fer.
Un exemple d'aquest tipus de compilació pot ser els mòduls de submount.

  • Pegats

Aquest tipus de mòdul s'integra en el nucli, abans de compilar-lo. Un cop integrat, hauràs de anar amb un assistent de configuració, i activar les opcions que el pegat haurà posat noves, i activar-les, al teu gust.
Un exemple d'aquest tipus de compilació pot ser els mòduls de squashfs.

  • Hibrids (permeten tots dos mètodes)

Aquest mòduls permeten tots dos mètodes. Si pots escollir, és millor compilar-los amb el pegat, perquè, així queda dins del fitxer .deb del nucli i no depens de fitxers externs.
Va millor per els desenvolupadors de distros, que així, amb un fitxer del kernel, ja saben que hi és tot. Un exemple d'aquest tipus de compilació pot ser els mòduls de unionfs.

Els pegats que utilitzen les K-DEMar de la branca 2.x i 3.x són:


Els pegats que utilitzen les K-DEMar de la branca 4.x són:


Parxejar un Nucli

Un cop ja hàgim triat quins pegat afegir al nostre nucli, haurem d'anar al directori arrel del nucli, on s'ha descomprimit el fitxer del kernel, baixat anteriorment.

Allà, hauràs de posar el fitxer del pegat/s desitjats. En el nostre cas tindrem el fitxer squashfs2.2-patch Per aplicar-lo al nucli que anem a compilar, ferem això:

patch -p1 < squashfs2.2-patch

O el nom del pegat que nosaltres volguem. Ell retornarà la llista de fitxers que ha parxejat. No hi ha cap mena de cosa a llegir, simplement, continuar amb el següent pegat que volguem incloure, o anar al següent pas.

Hi ha pegats com el cas del unionfs, que no et donen el fitxer, sino un script dins del unionfs-source que es diu patch-kernel.sh. Si executes aquest script, et dirà que li indiquis on està el codi font del nucli. Llavors el tornes a cridar amb el

./patch-kernel.sh /ruta/al/nucli

I ell et dirà que ja l'ha parxejat. En cas de no trobar l'script, doncs, el compilarem com a mòdul independent.


Configurar les opcions del nucli

Fitxer de configuració

Tots els nuclis que s'han instal·lat en el sistema, guarden dins de /boot/config-versió_del_nucli les opcions amb les que aquest s'ha configurat.
Si vas a compilar un nucli, serà un bon punt de partida l'ús d'aquest fitxer, per tal de que, a partir d'aquesta, modificar els aspectes que no vulguis.

Així, a la que engegis el configurador, hauràs de carregar la configuració del nucli, per tal de que, al menys, les característiques del nucli no es rebaixin, i puguis ampliar amb les opcions que tu vulguis. Pots copiar aquest fitxer a una carpeta, o utilitzar-lo directament des del directori /boot

A la que l'assistent de configuració hagi acabat, i desis la configuració; et crearà un fitxer .config en el directori on estiguis treballant. Aquest fitxer .config resultant, és el que realment s'utilitzarà quan compilis el nucli. Si vols utilitzar una configuració ja feta, i no vols haver d'engegar l'assistent de configuració, el pots copiar a la carpeta, amb el nom .config i seguidament, compilar. Ell ja utilitzarà aquesta configuració.


Assistent de configuració

  • Configuració en mode gràfic (recomenat)
make xconfig

Aquest tipus de configuració, mostrarà en pantalla, utilitzant les QT, totes les opcions del nucli. Solament està disponible en la branca de nuclis 2.6 Per utilitzar aquest mètode, necessites tenir instal·lat el paquet libqt3-mt-dev en el sistema


  • Configuració en mode text
make menuconfig

Aquesta és la manera tradicional de sel·leccionar les opcions. És la que tenen per defecte tots els nuclis de la branca 2.4 Els nuclis 2.6.x han deixat una mica de cantó aquest tipus de configuració, i ara, els menus són una mica menys entenedors que amb la branca 2.4 Per utilitzar aquest mètode, necessites tenir instal·lat el paquet libncurses5-dev en el sistema


  • Configuració a pèl
make config

Aquest tipus de configuració, t'anirà demanat pregunta a pregunta totes les opcions del nucli, i l'hi hauràs de respondre, el que vols.
No es GENS recomenable. Però, és la única opció si no t'has instal·lat els paquest per tal de configurar-lo gràficament o en mode text. Per utilitzar aquest mètode, no necessites cap paquet addicional

Les opcions a configurar estan distribuïdes per categories. Així que trobar la opció que nosaltres desitgem, no serà gaire complicat. Si hem posat algún pegat, haurem de buscar en quina categoria està, i activar la seva funció.

  • Unionfs i Squashfs => Device drivers -> File systems -> Miscellaneous Filesystems

Mòduls

Cada mòdul (els que ho permeten) es pot compilar de dos maneres.

  • Integrat (Built-in - Y)

Aquest mètode, s'integra en el nucli (vmlinuz) final. I sempre ocuparà memòria (normalment són uns 2 kb per cada mòdul) s'utilitzi o no.
En els assistents es marca aquesta opció o amb una y o amb un *

  • Com a Mòdul (As a mòdule - M)

Aquest mètode, fa que no sempre estigui en memòria, d'aquesta manera, si algú no te aquell hardware, no fa falta que estigui utilitzant memòria.
Aquesta és la manera més útil de compilar moduls (drivers) per a tot tipus de hardware. Però, no sempre és la millor manera, ja que, es depen d'un carregador de mòduls (uDev) per tal de que aquest es posi en funcionament. No és útil per quan necessites un mòdul ja des de l'inici, com és el cas del squashfs
En els assistents, es marca aquesta opció amb una M

La millor manera de compilar els mòduls, són com a mòduls (valga la redundancia), exceptuant el que és pròpiament necessari per engegar el sistema. En la K-DEMar el nucli amb tot integrat ocupa 1'7mb i els mòduls ocupen 57mb. Això ho fa el fet de posar el màxim possible com a mòdul, per tal de tenir en memòria el menys possible i tenir el màxim de maquinari (hardware) suportat.

Compilació

Compilar un Kernel 2.6

make-kpkg clean
make-kpkg -rev=kdemar41a --initrd kernel_image kernel_headers


--initrd Si s'utilitza aquest paràmetre a l'hora de la compilació, el pas de Generació de la imatge d'engegada (Initrd) te'l pots saltar, perquè ell ja ho gestiona automàticament

Compilar un Kernel 2.4

make-kpkg dep
make-kpkg clean
make-kpkg -rev=kdemar20a kernel_image kernel_headers

Ús del nucli compilat

A partir d'aquí ja solament farà falta instal·lar en nucli, generar l'imatge d'engegada i preparar el menú per tal de poder sel·leccionar el nucli desitjat per engegar.

La recta final de l'espera està acabant.


Instal·lació del nucli compilat

Un cop el nucli ja està compilat, el compilador de Debian make-kpkg, ens ha creat dos fitxers .deb amb el nucli empaquetat, ideal per a transportar o per a posar a qualsevol ordinador.

Per util·litzar-lo solament haurem d'instal·lar el fitxer de linux-image, generat. El fitxer de linux-headers solament l'haurem d'instal·lar si volem compilar moduls (drivers) per aquest, normalment no es necessita.

A través de la ordre dpkg -i incorporarem el nou nucli al sistema que vulguem.

dpkg -i linux-image-x.x.x.x_yyy_i386.deb

Substituïnt les x per la versió del nucli compilat i y per la versió, posada en la compilació amb la ordre --rev=. Si no s'hi ha cap, no fa falta, ja que el nom de fitxer, no portarà revisió. Sempre es pot mirar el nom de fitxer exacte amb el llistat de fitxers ls.


Generació de la imatge d'engegada (Initrd)

Atenció: aquest pas te'l pots saltar si la compilació la has fet amb --initrd, tal com s'ha explicat en el pas de Compilar un nucli 2.6

Un cop instal·lat el nucli serà necessari també que hi hagi instal·lat al sistema el programa mkinitramfs-tools (Recomanat, yaird o el mkinitrd. La sintaxis és la mateixa, en tots els programes, però mkinitramfs genera unes imatges més fidedignes al sistema que realment teniu. Aquest programa generarà la imatge d'engegada, necessària per tal de que el nucli generat funcioni correctament.

Per instal·lar mkinitramfs-tools, yaird o mkinitrd haurem d'entrar a una consola y com a usuari root, d'escriure

apt-get update
apt-get install mkinitramfs-tools (o yaird o mkinitrd, depenent del que desitgis)

Un cop instal·lat, crearem la imatge pròpiament dita amb:

mkinitramfs -o /boot/initrd.img-x.x.x x.x.x

Substituint x.x.x en els dos casos per la versió del nucli que hagis compilat (per exemple 2.6.20.1 -> mkinitramfs -o /boot/initrd.img-2.6.20.1 2.6.20.1)

Pot tardar una estona, però, un cop fet, en la carpeta /boot, trobaràs un fitxer que es dirà initrd.img-x.x.x

Modificació del Grub (menu.lst) per engegar el nucli

Ja un cop fets els passos, el nucli ja està llest per ser engegat pel sistema. Per fer això s'haurà de modificar el fitxer /boot/grub/menu.lst' per afegir una entrada al menú
Hauràs de localitzar la primera entrada que digui alguna cosa semblant a això, normalment cap a la línia 25 del fitxer:

title K-DEMar 4.3.4  Lyra  GNU/Linux
root (hd0,0)
kernel /boot/vmlinuz-2.6.18 root=/dev/sda1 ro vga=791 nomce
initrd /boot/initrd.img-2.6.18

I afegir-ne una altra a sobre; en el que canviarem el títol (title) i que substituirem les versions del nucli, per exemple pel nucli 2.6.20.2 quedaria així:

title K-DEMar 4.3.4  Lyra  GNU/Linux - 2.6.20.2
root (hd0,0)
kernel /boot/vmlinuz-2.6.20.2 root=/dev/sda1 ro vga=791 nomce
initrd /boot/initrd.img-2.6.20.2

Deixant tots els altres paràmetres necessaris, sense cap modificació; desarem el fitxer

I ja estarem a punt per engegar amb el nou nucli!!! Des del menú d'engegada, ara tindràs la possibilitat d'iniciar amb el nou nucli o amb el vell, de manera que si no et funcioni, puguis engegar la màquina.

Error més comú

Hi ha un error bastant comú, que despista als usuaris, que estàn experimentant amb això.

A l'engegada se't quedi parat amb un misatge com aquest:

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)

Si això passa, indica que la creació o utilització de la imatge d'engegada (Initrd) no s'ha fet correctament. El que hauràs d'assegurar-te és que existeix el fitxer de /boot/initrd.img-x.x.x i en el /boot/grub/menu.lst es fa referència, en la secció que has afegit, al initrd creat.

Rellegir secció Generació de la imatge d'engegada

Rellegir secció Modificació del Grub (menu.lst) per engegar el nucli

Documentació - Bibliogafia

Kernel.org

Kernel en la Wikipedia
Llista de canvis més comprensible
Documentació vària
Documentació vària (ja no existeix)

Herramientas personales