Compilació del kernel

De Guifi.net - Wiki Català

Revisió de 21:07, 28 nov 2009; Sergi (Discussió)

(dif) ←Versió més antiga | Versió actual (dif) | Versió més nova→ (dif)

Exemple pas a pas

cal tenir disponibles les següents eines/paquets:

$ sudo apt-get install kernel-package libncurses5-dev fakeroot wget bzip2

Ara obtenim el codi font. El trobareu a:

www.kernel.org

Per exemple:

cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.6.tar.bz2

Ara el descomprimim:

$ sudo tar xjvf linux-2.6.31.6.tar.bz2 
$ sudo ln -s linux-2.6.31.6 linux
$ cd /usr/src/linux 

Aquest és el moment, si s'escau, d'aplicar pegats. Consulteu patch

Es una bona idea partir d'un fitxer bàsic de configuració del nucli. Per exemple, el del nucli que estem executant al nostre sistema:

$ sudo cp /boot/config-`uname -r` ./.config

Ara podem modificar la configuració amb:

$ sudo make menuconfig

ara cal construir (build) el nou kernel amb:

$ sudo make-kpkg clean
$ fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers

Finalment cal instal·lar el nou nucli:

$ cd /usr/src
$ ls -l
$ dpkg -i linux-image-*.deb
$ dpkg -i linux-headers-*.deb

Ara editeu grub:

vi /boot/grub/menu.lst

I poseu per exemple:

title           Ubuntu, kernel 2.6.31.6-custom
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.31.6-custom root=/dev/sda1 ro quiet splash
initrd          /boot/initrd.img-2.6.31.6-custom
savedefault
boot   

title           Ubuntu, kernel 2.6.31.6-custom (recovery mode)
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.31.6-custom root=/dev/sda1 ro single
initrd          /boot/initrd.img-2.6.31.6-custom
boot

NOTA: Segons els sistema operatiu, per exemple Ubuntu, ens podem trobar que a l'instal·lar el paquet Debian ja ens fa totes les tasques

.

Per exemple:

$ sudo dpkg -i linux-image-2.6.31.6-custom_2.6.31.6-custom-10.00.Custom_i386.deb 
S'està seleccionant el paquet linux-image-2.6.31.6-custom prèviament no seleccionat.
(S'està llegint la base de dades ... hi ha 233043 fitxers i directoris instal·lats actualment.)
S'està desempaquetant linux-image-2.6.31.6-custom (de linux-image-2.6.31.6-custom_2.6.31.6-custom-10.00.Custom_i386.deb) ...
Done.

S'està configurant linux-image-2.6.31.6-custom (2.6.31.6-custom-10.00.Custom) ...
Running depmod.
Finding valid ramdisk creators.
Using mkinitramfs-kpkg to build the ramdisk.
Running postinst hook script update-grub.
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.31.6-custom
Found initrd image: /boot/initrd.img-2.6.31.6-custom
Found linux image: /boot/vmlinuz-2.6.31-15-generic
Found initrd image: /boot/initrd.img-2.6.31-15-generic
Found linux image: /boot/vmlinuz-2.6.31-14-generic
Found initrd image: /boot/initrd.img-2.6.31-14-generic
Found linux image: /boot/vmlinuz-2.6.28-15-generic
Found initrd image: /boot/initrd.img-2.6.28-15-generic
Found memtest86+ image: /boot/memtest86+.bin
Found Microsoft Windows XP Professional on /dev/sdb1
Found Ubuntu 9.10 (9.10) on /dev/sdb3
done
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/dkms
run-parts: executing /etc/kernel/postinst.d/nvidia-common
run-parts: /etc/kernel/postinst.d/nvidia-common exited with return code 20
Failed to process /etc/kernel/postinst.d at /var/lib/dpkg/info/linux-image-2.6.31.6-custom.postinst line 1186. 
dpkg: s'ha produït un error en processar linux-image-2.6.31.6-custom (--install):
el subprocés installed post-installation script retornà el codi d'eixida d'error 2
S'han trobat errors en processar:
 linux-image-2.6.31.6-custom

L'exemple està executat a una Ubuntu 9.10. Vegeu com configura GRUB (la versió 2 de GRUB) i dona un error al intentar recompilar els mòduls de Virtual Box.

Recursos:

Com obtenir els kernels

El primer de tot és conèixer quin Kernel estem utilitzant amb la comanda uname:

$ uname -a
Linux portatil 2.6.22-14-generic #1 SMP Tue Dec 18 08:02:57 UTC 2007 i686 GNU/Linux

Hi han dos pàgines web que podem utilitzar com a referència dels kernels de Linux:

Notació dels kernels:

Quin és el significat del números 2.6.22-14-generic ?

  • 2.6: És la versió principal del kernel. Els acabats en número imparell són inestables i els acabats en número parell són estables.
  • Els següent números indiquen canvis menors.

Com obtenir els nuclis

De les webs:

Es poden obtenir fitxers comprimits en format tar.gz o tar.bz2

O descarregar-ho dels repositoris de la distribució el paquet .deb corresponent. Codi font:

$ sudo apt-cache search linux-source
linux-source - Linux kernel source with Ubuntu patches
xen-source-2.6.16 - Linux kernel source for version 2.6.17 with Ubuntu patches
linux-source-2.6.22 - Linux kernel source for version 2.6.22 with Ubuntu patches

Per instal·lar:

$ sudo apt-get install linux-source
S'està llegint la llista de paquets... Fet 
S'està construint l'arbre de dependències       
Reading state information... Fet           
S'instal·laran els següents paquets extres:
  linux-source-2.6.22
Paquets suggerits:
  libncurses-dev ncurses-dev kernel-package libqt3-dev
S'instal·laran els següents paquets NOUS:
  linux-source linux-source-2.6.22
0 actualitzats, 2 nous a instal·lar, 0 a eliminar i 0 no actualitzats.
Es necessita obtenir 45,4MB d'arxius.
Després de desempaquetar s'usaran 45,5MB d'espai en disc addicional.
Voleu continuar [S/n]? 

Noteu que el paquet linux-source és un paquet tonto (dummy package) que realment no instal·la "res" al nostre sistema:

$ dpkg -L linux-source
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/linux-source
/usr/share/doc/linux-source/copyright
/usr/share/doc/linux-source/changelog.gz

Només instal·la documentació. L'important s'instal·la en les dependències. En el cas de l'exemple el paquet instal·lat com a dependència és :

linux-source-2.6.22 

Per tant si volem veure que ha instal·lat executem:

$ sudo dpkg -L linux-source-2.6.22
/.
/usr
/usr/src
/usr/src/linux-source-2.6.22.tar.bz2
/usr/share
/usr/share/doc
/usr/share/doc/linux-source-2.6.22
/usr/share/doc/linux-source-2.6.22/copyright
/usr/share/doc/linux-source-2.6.22/changelog.Debian.gz

Aquí el fitxer important és: /usr/src/linux-source-2.6.22.tar.bz2. Les fonts en Debian (i segons l'estàndard FHS) estan a:

/usr/src/

El kernel esta comprimit amb bz2. Per descomprimir-lo cal executar:

$ cd /usr/src
$ sudo tar jxvf /usr/src/linux-source-2.6.22.tar.bz2


Enginyeria Inversa

TODO

2.4 vs 2.6

El canvi de 2.4 a 2.6 va ser un gran salt i un canvi radical de la política de dispositius linux.

Canvia el nom de dispositius de disc.


Altres nuclis

El kernel Linux no és l'únic nucli lliure que existeix.

  • FreeBsd
  • Gnu 0Hurd

Per aquesta raó es va decidir modificar el nom del paquets. Abans es deien kernel-image i ara es diuen linux-image ja que la resta de kernels també son kernels.

Configuració del kernel

El paquet kernel-package ens ajuda.

A l'arrel del codi font hi ha d'haver un fitxer anomenat .config.

Per crear aquest fitxer:

Para crear-lo hi ha diferents possibilitats:

$ make config 

És una aplicació textual amb centenars de preguntes algunes difícils de respondre.

Hi ha una opció que es posar un fitxer config per defecte:

$ make mrproper

Però no hi ha cap garantia de que funcioni.

L'altre opció és escollir el que tenim en el nostre sistema (que se suposa que funciona). Es troben a la carpeta boot:

$ ls /boot/config*
/boot/config-2.6.22-14-generic  /boot/config-2.6.24-18-generic  /boot/config-2.6.24-19-generic

Podeu utilitzar la versió del kernel que esteu executant. Podeu consultar la versió del vostre kernel amb:

$ uname -r
2.6.24-19-generic 

Ara a l'executar:

$ make config

Només preguntarà el que li falti...

Un altre opció és utilitzar:

$ make xconfig

Necessita tenir les llibreries de qt. Podem utilitzar:

$ make menuconfig

Que utilitza ncurses.

Compilació del kernel

Instal·lació del kernel

Si acabem de baixar el codi font del kernel no cal, però sempre es bona idea començar executant un clean

$ make clean --> limpia todo

Per crear el menuconfig

$ make menuconfig

Se cambia opcion con space y con enter entras en opciones o seleccionas y sales. Hay tres opciones Si, no o M -> M deja un apuntador a modulo actualmente a NULL, pero es un punto de montaje de un modulo del kernel sin necesidad de recompilar.

$ make-kpkg clean -> es un script que llama a make con ciertos argumentos
$ make-kpkg –revision=1.sergitur kernel-image

Documentació del kernel

Segons l'estàndard FHS la documentació de cada paquet esta a la carpeta:

/usr/share/doc

Per tant la documentació del paquet esta en kernel-package:

/usr/share/doc/kernel-package/

Paquets

kernel-package

Kernel-package és un paquet amb utilitats per construir (build) kernels Linux des de el seu codi font.

Per cercar el paquet:

$ sudo apt-cache search kernel-package
...
kernel-package - A utility for building Linux kernel related Debian packages.
...

Per conèixer els detalls del paquet:

$ sudo apt-cache show kernel-package
Package: kernel-package
Priority: optional
Section: misc
Installed-Size: 2192
Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Manoj Srivastava <srivasta@debian.org>
Architecture: all
Version: 11.001
Depends: perl, dpkg (>= 1.4), dpkg-dev (>= 1.4.0.9), gcc | c-compiler, make (>= 3.80-10), po-debconf, gettext, file
Recommends: libc6-dev | libc-dev, bzip2
Suggests: linux-source | kernel-source, libdb3-dev, libncurses-dev, docbook-utils
Filename: pool/main/k/kernel-package/kernel-package_11.001_all.deb
Size: 510452
MD5sum: fd820c2e3970fc8d300aef4a2b9e15ca
SHA1: 34924f84fe4cd604869bf4717d4c0230b3117291
SHA256: 3ff71a3e2e69d5073310e8e83fc982baefec983af7139ed7cc7a4ce6cf42c38a
Description: A utility for building Linux kernel related Debian packages.
 This package provides the capability to create a debian kernel-image
 package by just running make-kpkg kernel_image in a kernel source
 directory tree.  It can also package the relevant kernel headers into
 a kernel-headers package. In general, this package is very useful if
 you need to create a custom kernel, if, for example, the default
 kernel does not support some of your hardware, or you wish a leaner,
 meaner kernel.  It also scripts the steps that need be taken to
 compile the kernel, which is quite convenient (forgetting a crucial
 step once was the initial motivation for this package). Please look at
 /usr/share/doc/kernel-package/Rationale.gz for a full list of advantages
 of this package.
Bugs: mailto:ubuntu-users@lists.ubuntu.com
Origin: Ubuntu

Instal·lació:

$ sudo apt-get install kernel-package

Executables:

$ dpkg -L kernel-package | grep bin
/usr/bin
/usr/bin/make-kpkg
/usr/sbin
/usr/sbin/kernel-packageconfig
/usr/share/kernel-package/Control.bin86

La comanda més important és make-kpgp.

Fitxers de configuració:

$ dpkg -L kernel-package | grep etc
/etc
/etc/bash_completion.d
/etc/bash_completion.d/make_kpkg
/etc/kernel-pkg.conf

build-essential

$ sudo apt-cache search build-essential
build-essential - informational list of build-essential packages
devscripts - Scripts to make the life of a Debian Package maintainer easier
dh-buildinfo - Debhelper addon to track package versions used to build a package
sbuild - Tool for building Debian binary packages from Debian sources


$ sudo apt-cache show build-essential |  more
Package: build-essential
Priority: optional
Section: devel
Installed-Size: 48
Maintainer: Ubuntu Core Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Matthias Klose <doko@debian.org>
Architecture: i386
Version: 11.3ubuntu1
Depends: libc6-dev | libc-dev, gcc (>= 4:4.1.1), g++ (>= 4:4.1.1), make, dpkg-dev (>= 1.13.5)
Filename: pool/main/b/build-essential/build-essential_11.3ubuntu1_i386.deb
Size: 7066
MD5sum: dbf21241506cb04fc6f67a93aaaf991b
SHA1: aef5b9f76a05ea23c0370eab53ef0d20b4dac1f5
SHA256: 7d3b5efbd44c8e8186e33e3b0e9585fc8a86f4b1cd328f10e3c4a594e50f9da5
Description: informational list of build-essential packages
If you do not plan to build Debian packages, you don't need this
package.  Moreover this package is not required for building Debian
packages.
.
This package contains an informational list of packages which are
considered essential for building Debian packages.  This package also
depends on the packages on that list, to make it easy to have the
build-essential packages installed.
.
If you have this package installed, you only need to install whatever
a package specifies as its build-time dependencies to build the
package.  Conversely, if you are determining what your package needs
to build-depend on, you can always leave out the packages this
package depends on.
.
This package is NOT the definition of what packages are
build-essential; the real definition is in the Debian Policy Manual.
This package contains merely an informational list, which is all
most people need.   However, if this package and the manual disagree,
the manual is correct.
Bugs: mailto:ubuntu-users@lists.ubuntu.com
Origin: Ubuntu

modconf

$ sudo apt-get install modconf

Comandes

make_kpkg

Del manual:

$ man make-kpkg
NAME
      make-kpkg - build Debian kernel packages from Linux kernel sources

make-kpkg és una eina per construir el kernel de Linux.


lsmod

Mostra els mòduls carregats en un moment donat:

$ lsmod | more
Module                  Size  Used by
binfmt_misc            12936  1 
rfcomm                 42136  2 
l2cap                  26240  11 rfcomm
bluetooth              57060  4 rfcomm,l2cap
vboxdrv                60208  0 
ppdev                  10244  0 
fglrx                 656352  50 
ipv6                  273892  12  
acpi_cpufreq           10568  0 
cpufreq_conservative     8072  0 
...........

modprobe

Consulteu modprobe

insmod

Consulteu insmod

rmmod

Consulteu rmmod

pushd

TODO

pushd

Fitxers

Fitxers /proc

$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 13
model name      : Intel(R) Pentium(R) M processor 1.50GHz
stepping        : 6
cpu MHz         : 600.000
cache size      : 2048 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 2
wp              : yes
flags           : fpu vme de pse tsc msr mce cx8 sep mtrr pge mca cmov pat clflush dts acpi mmx fxsr sse sse2 ss tm pbe up est tm2
bogomips        : 1285.49
clflush size    : 64

/etc/modules

Mòduls que es carreguen durant el procés d'inicialització de la màquina.

$ cat /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.

lp
sbp2
fuse

La resta de mòduls es carreguen mitjançant eines de detecció de maquinari.

ndiswrapper

$ sudo apt-cache searh ndiswrapper 

Permet compilar drivers de WI-FI per a Windows.

Eines que simplifiquen la navegació pel codi font

Cscope

$ sudo apt-get install cscope

Consulteu l'article Pas a Pas exemple compilació Kernel.

Eines de l'usuari