domingo, febrero 12, 2006

Compilar kernel al modo debian

Debian-Kernel-Compile-Howto (Kernel 2.6)

By falko Created 2004-12-27 18:34 Modificado y traducido por Luis Ángel Ortega Martín el 30/01/06

Como Compilar el kernel 2.6 en Debian

langel [punto] ortega [arroba] educa [punto] madrid [punto] org
En algunos casos puede ser que desees compilar tu propio kernel (núcleo) que satisface tus necesidades mejor que el kernel estándar que viene con tu distribución, aquí se describe cómo se hace esto en una máquina Debian (una descripción para Debian Sarge se puede encontrar aqui!). Observa que este tutorial es para el kernel 2.6 solamente! Un tutorial para el kernel 2.4 lo puedes encontrar aqui.

Enteraté que hay un cierto riesgo en hacerlo! Por ejemplo, podría suceder que su máquina no arranque correctamente después de que hayas instalado el nuevo kernel así que puede ser que tengas que arrancar desde un CD del rescate para reparar su sistema. ¡Quedas advertido! ¡Este documento no viene con garantía! ;-)
Primero logeate en tu maquina Debian como root. Comprueba que los tienes o instala los paquetes que te van a hacer falta para compilar el nuevo kernel:

apt-get install kernel-package ncurses-dev fakeroot wget bzip2

Vete a /usr/src:

cd /usr/src

Bajate el ultimo source kernel Linux (o el que necesites) desde

http://www.kernel.org/pub/linux/kernel/v2.6/:

wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.6.tar.bz2

Desempaquetal el sources kernel:

tar xvjf linux-2.6.14.6.tar.bz2

Es conveniente hacer un enlace al directorio donde va a estar el nuevo kernel

ln -s linux-2.6.14.6 linux

Y luego

cd linux-2.6.14.6/

Normalmente es una buena idea tomar la configuración que tenemos, de existir (la que trabaja!) ya un kernel 2.6, como punto de partida para la configuración de su nuevo núcleo. La configuración actual del kernel se guarda generalmente en un fichero, /boot, e.g. /boot/config-2.6.3. Cargaremos esta configuración y después haremos los cambios que deseamos. Si no tienes el archivo de los config de un kernel 2.6 this one éste puede ayudarte.

make mrproper

make menuconfig

La configuracion del tu kernel será leida y puedes navegarla a traves del menu y cambiarla según tus necesidades.

Aquí, si tenemos mas de 1 gb de memoria hay que seleccionar en

Processor Type and Features -> High memory support [4gb],

y añadir tu tarjeta de red al kernel (no como modulo) y las recomendaciones del final.

Luego selecciona Load an Alternate Configuration File e introduce la localización del fichero de configuración del fichero y entra la localización del archivo de la configuración de tu kernel actual (o upload mi kernel configuracion mi configuración del kernel de tu máquina y entra su path):

Luego ejecuta los siguientes comandos (fijate que el comando make dep no es necesario para el kernel 2.6):

make-kpkg clean
fakeroot make-kpkg --revision=luis.1 kernel_image

O mejor, en lugar de lo anterior

make-kpkg buildpackage -initrd -rev luis.1 kernel_image

Si la compilacion se para con un error, entonces ejecuta:

make clean

y reejecuta el comando anterior:

make menuconfig

que cambia la configuración del kernel cuando hay errores en la compilación.

Si no hay errores en la compilación, tardará un buen rato!, podrás encontrar el nuevo kernel como un paquete de Debian llamado kernel-image-2.6.14.6_luis.1_i386.deb en el directorio /usr/src. y también los paquetes .deb kernel-headers, kernel-source y kernel-doc con la revisión que hayamos puesto.

cd ../

Ahora tienes que instalar algunos paquetes que hacen falta para el kernel 2.6.

Primero comprueba que los tienes dpkg -l module-init-tools, nitrd-tools, procps y si no estan instalados agrega la línea siguiente a /etc/apt/sources.list:

deb http://www.backports.org/debian/ sarge module-init-tools initrd-tools procps

y ejecuta

apt-get update
apt-get install module-init-tools initrd-tools procps

Si te hacen la siguiente pregunta:

"If you really want to remove modutils type 'yes':"

responde yes.

Puede ser que también sea necesario actualizar paquetes como ike bind9, quota, etc. dependiendo de tu configuración. Si tienes problemas con tus paquetes existentes intenta conseguir el paquete apropiado en www.backports.org.

Instala tu nuevo nuevo kernel:

dpkg -i kernel-image-2.6.14.6_luis.1_i386.deb

dpkg -i kernel-headers-2.6.14.6_luis.1_i386.deb

dpkg -i kernel-doc-2.6.14.6_luis.1_i386.deb

Hay que comprobar que tenemos el fichero /boot/initrd.img-2.6.14.6 , si no crea un ramdisk del nuevo kernel (si no tu sistema no seguramente no arrancará y te dará un mensaje de kernel panic):

cd /boot/

mkinitrd -o /boot/initrd.img-2.6.14.6 2.6.14.6

Seguramente habra creado las entradas en lilo o grub para lo cual comprobaremos

cat /boot/grub/menu.lst

que tiene que tener las entradas nuevas con algo asi

title Debian GNU/Linux, kernel 2.6.14.6-386

root (hd0,0)

kernel /boot/vmlinuz-2.6.14.6-386 root=/dev/hdb1 ro

initrd /boot/initrd.img-2.6.14.6-386

savedefault

boot

title Debian GNU/Linux, kernel 2.6.14.6-386 (recovery mode)

root (hd0,0)

kernel /boot/vmlinuz-2.6.14.6-386 root=/dev/hdb1 ro single

initrd /boot/initrd.img-2.6.14.6-386

savedefault

boot

Con lo que hemos terminado casi.

En lilo editamos la parte de image=/vmlinuz del fichero /etc/lilo.conf y comprobamos que esta la la linea initrd=/boot/initrd.img-2.6.14.6 o la añadimos

# Boot up Linux by default.
# default=Linux image=/vmlinuz
label=Linux
read-only
initrd=/boot/initrd.img-2.6.14.6
# restricted
# alias=1

Ejecutamos

lilo

esto actualiza el boot loader y luego rebooteamos el ordenador:

shutdown -r now

y si todo esta bien, el ordenador arrancará con el nuevo kernel. Para comprobar

uname -a

que el kernel con el que he arrancado es el nuevo. Good luck (buena suerte, jeje)!

Update:

Esto es un extracto de un email que R (Chandra) Chandrasekhar (muchas gracias por ello!) que le han enviado al autor con respecto a la configuración del kernel en caso de que se utilicen memorias flash y tarjetas nVidia:

"1. Si vas a usar flash drives, deseleciona lo siguiente cuando estes en :

Block Devices -> Low Performance USB Block driver (BLK_DEV_UB)

Hay una clara explicación en http://linux.usc.edu/pipermail/usclug-chat/2004-December/000111.html

y en http://dev.gentoo.org/~dsd/gentoo-dev-sources/issues-current.htm#2.6.9-ub porqué esto es recomendable hasta el desarrollo adicional del desarrollo del módulo del ub.

Tuve que instalar (comprobar primero que no lo tenemos instalado, como antes dpkg -l paquete)

apt-get install udev hotplug

para usar el flash drive, y luego funciono estupendo!

2. Si tienes una tarjeta nVidia, deseleciona lo siguiente cuando estes en :

Graphics Support -> nVidia Riva support (FB_RIVA)

Kernel Hacking -> Use 4Kb for kernel stacks instead of 8Kb (4KSTACKS)

Processor Type and Features -> Local APIC support on uniprocessors (X86_UP_APIC)

Para instalar los drivers de nVidia, seguí el HOWTO de

http://home.comcast.net/~andrex/Debian-nVidia/index.html y compile los drivers desde los paquetes de Debian despues de aplicar el vmalloc_reserve.patch durante la formación del kernel.”


Bueno el método esta probado y funciona fenomenal.

Salu2

2 comentarios:

waltergibson6174780939 dijo...

Get any Desired College Degree, In less then 2 weeks.

Call this number now 24 hours a day 7 days a week (413) 208-3069

Get these Degrees NOW!!!

"BA", "BSc", "MA", "MSc", "MBA", "PHD",

Get everything within 2 weeks.
100% verifiable, this is a real deal

Act now you owe it to your future.

(413) 208-3069 call now 24 hours a day, 7 days a week.

HORSE_POWER dijo...

Realizando los pasos me da error, aquí está descrito lo que hice:

#aptitude search kernel-package ncurses-dev fakeroot wget bzip2

Con eso verifico que sólo me falta el kernel-package, entonces lo instalo.

#aptitude install kernel-package

luego:

#cd /usr/src

#ls
...
linux-source-2.6.18.tar.bz2
...

Imagino que ese es el archivo que necesito, entonces

tar xvjf linux-source-2.6.18.tar.bz2

#ln -s linux-source-2.6.18 linuxsou

#cd linux-source-2.6.18

Este paso creo q lo hago bien, pero no estoy seguro, verifico que tenga la configuración actual del kernel con:

#more /boot/config-2.6.18-6-686

Pues por encima se ve bien, imagino que no tengo que hacer más nada sino:

#make mrproper //no bota ninguna salida

#make menuconfig //este comando bota esta salida:
HOSTCC scripts/basic/fixdep
HOSTCC scripts/basic/docproc
HOSTCC scripts/kconfig/conf.o
HOSTCC scripts/kconfig/kxgettext.o
HOSTCC scripts/kconfig/mconf.o
SHIPPED scripts/kconfig/zconf.tab.c
SHIPPED scripts/kconfig/lex.zconf.c
SHIPPED scripts/kconfig/zconf.hash.c
HOSTCC scripts/kconfig/zconf.tab.o
HOSTLD scripts/kconfig/mconf
HOSTCC scripts/kconfig/lxdialog/checklist.o
In file included from scripts/kconfig/lxdialog/checklist.c:24:
scripts/kconfig/lxdialog/dialog.h:31:20: error: curses.h: No existe el fichero o el directorio
In file included from scripts/kconfig/lxdialog/checklist.c:24:
scripts/kconfig/lxdialog/dialog.h:128: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘use_colors’
scripts/kconfig/lxdialog/dialog.h:129: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘use_shadow’
scripts/kconfig/lxdialog/dialog.h:131: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘attributes’
scripts/kconfig/lxdialog/dialog.h:143: error: expected ‘)’ before ‘*’ token
scripts/kconfig/lxdialog/dialog.h:146: error: expected ‘)’ before ‘*’ token
scripts/kconfig/lxdialog/dialog.h:147: error: expected ‘)’ before ‘*’ token
scripts/kconfig/lxdialog/dialog.h:148: error: expected ‘)’ before ‘*’ token
scripts/kconfig/lxdialog/dialog.h:149: error: expected ‘)’ before ‘*’ token
scripts/kconfig/lxdialog/dialog.h:151: error: expected ‘)’ before ‘*’ token
scripts/kconfig/lxdialog/checklist.c:31: error: expected ‘)’ before ‘*’ token
scripts/kconfig/lxdialog/checklist.c:59: error: expected ‘)’ before ‘*’ token
scripts/kconfig/lxdialog/checklist.c:95: error: expected ‘)’ before ‘*’ token
scripts/kconfig/lxdialog/checklist.c: In function ‘dialog_checklist’:
scripts/kconfig/lxdialog/checklist.c:117: error: ‘WINDOW’ undeclared (first use in this function)
scripts/kconfig/lxdialog/checklist.c:117: error: (Each undeclared identifier is reported only once
scripts/kconfig/lxdialog/checklist.c:117: error: for each function it appears in.)
scripts/kconfig/lxdialog/checklist.c:117: error: ‘dialog’ undeclared (first use in this function)
scripts/kconfig/lxdialog/checklist.c:117: error: ‘list’ undeclared (first use in this function)
scripts/kconfig/lxdialog/checklist.c:117: warning: left-hand operand of comma expression has no effect
scripts/kconfig/lxdialog/checklist.c:121: warning: implicit declaration of function ‘endwin’
scripts/kconfig/lxdialog/checklist.c:122: warning: implicit declaration of function ‘fprintf’
scripts/kconfig/lxdialog/checklist.c:122: warning: incompatible implicit declaration of built-in function ‘fprintf’
scripts/kconfig/lxdialog/checklist.c:122: error: ‘stderr’ undeclared (first use in this function)
scripts/kconfig/lxdialog/checklist.c:140: error: ‘COLS’ undeclared (first use in this function)
scripts/kconfig/lxdialog/checklist.c:141: error: ‘LINES’ undeclared (first use in this function)
scripts/kconfig/lxdialog/checklist.c:143: warning: implicit declaration of function ‘draw_shadow’
scripts/kconfig/lxdialog/checklist.c:143: error: ‘stdscr’ undeclared (first use in this function)
scripts/kconfig/lxdialog/checklist.c:145: warning: implicit declaration of function ‘newwin’
scripts/kconfig/lxdialog/checklist.c:146: warning: implicit declaration of function ‘keypad’
scripts/kconfig/lxdialog/checklist.c:146: error: ‘TRUE’ undeclared (first use in this function)
scripts/kconfig/lxdialog/checklist.c:148: warning: implicit declaration of function ‘draw_box’
scripts/kconfig/lxdialog/checklist.c:148: error: ‘attributes’ undeclared (first use in this function)
scripts/kconfig/lxdialog/checklist.c:149: warning: implicit declaration of function ‘wattrset’
scripts/kconfig/lxdialog/checklist.c:150: warning: implicit declaration of function ‘mvwaddch’
scripts/kconfig/lxdialog/checklist.c:152: warning: implicit declaration of function ‘waddch’
scripts/kconfig/lxdialog/checklist.c:156: warning: implicit declaration of function ‘print_title’
scripts/kconfig/lxdialog/checklist.c:159: warning: implicit declaration of function ‘print_autowrap’
scripts/kconfig/lxdialog/checklist.c:166: warning: implicit declaration of function ‘subwin’
scripts/kconfig/lxdialog/checklist.c:191: warning: implicit declaration of function ‘print_item’
scripts/kconfig/lxdialog/checklist.c:197: warning: implicit declaration of function ‘print_arrows’
scripts/kconfig/lxdialog/checklist.c:200: warning: implicit declaration of function ‘print_buttons’
scripts/kconfig/lxdialog/checklist.c:202: warning: implicit declaration of function ‘wnoutrefresh’
scripts/kconfig/lxdialog/checklist.c:204: warning: implicit declaration of function ‘doupdate’
scripts/kconfig/lxdialog/checklist.c:207: warning: implicit declaration of function ‘wgetch’
scripts/kconfig/lxdialog/checklist.c:214: error: ‘KEY_UP’ undeclared (first use in this function)
scripts/kconfig/lxdialog/checklist.c:214: error: ‘KEY_DOWN’ undeclared (first use in this function)
scripts/kconfig/lxdialog/checklist.c:224: error: ‘FALSE’ undeclared (first use in this function)
scripts/kconfig/lxdialog/checklist.c:225: warning: implicit declaration of function ‘scrollok’
scripts/kconfig/lxdialog/checklist.c:226: warning: implicit declaration of function ‘wscrl’
scripts/kconfig/lxdialog/checklist.c:235: warning: implicit declaration of function ‘wrefresh’
scripts/kconfig/lxdialog/checklist.c:285: warning: incompatible implicit declaration of built-in function ‘fprintf’
scripts/kconfig/lxdialog/checklist.c:286: warning: implicit declaration of function ‘delwin’
scripts/kconfig/lxdialog/checklist.c:290: error: ‘KEY_LEFT’ undeclared (first use in this function)
scripts/kconfig/lxdialog/checklist.c:291: error: ‘KEY_RIGHT’ undeclared (first use in this function)
make[2]: *** [scripts/kconfig/lxdialog/checklist.o] Error 1
make[1]: *** [menuconfig] Error 2
make: *** [menuconfig] Error 2


Y ahí me quede pegado porque me imagino que debería ejecutarse un script para completar los pasos que describes después.

¿Qué significa ese error?, ¿qué debería hacer?