Compilació del kernel
De Guifi.net - Wiki Català
Contingut
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:
- http://www.howtoforge.com/kernel_compilation_ubuntu
- https://help.ubuntu.com/community/Kernel/Compile
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.
Cscope
$ sudo apt-get install cscope
Consulteu l'article Pas a Pas exemple compilació Kernel.