Compilando el kernel 2.6

Bueno, después de ver un poco los temas sobre los que hablo en mi blog, noté que no tengo prácticamente nada relevante a la carrera que estudio (Ingenierí­a de Sistemas, mención Sistemas Computacionales), y como la compu que estoy usando está de graciosa otra vez, se me ocurrió buscar formas de acelerarla un poco.

Yo uso Windows (ya va, ya va, déjenme terminar) y al mismo tiempo, gracias a que mi facultad nos familiarizó con dicho sistema, uso Linux también. Las razones por las cuales uso ambos sistemas operativos, son cosas para otro post (tengo pensados varios ya). Mientras tanto, adelanto que me agrada muchí­simo Linux debido a la alta capacidad de personalización, no solo en aspectos como la interfaz gráfica, que si los í­conos, que si el fondo de pantalla, que si el color de la barra de tareas, etc., sino hasta en detalles tan importantes como el núcleo del sistema en sí­. Para los que saben de lo que hablo, se trata de nada más y nada menos que el kernel.

El kernel es lo que le da -en el caso de GNU/Linux- el nombre que va luego del ‘/’ a este sistema operativo, del cual se derivan infinidad de sabores o distribuciones. Por recomendaciones en la facultad, yo empecé con Ubuntu (¡que me dejen terminar dije!), y aunque para algunos no es la mejor distribución que podrí­a estar usando, pues hasta ahora he estado con esta (mis razones y comentarios al respecto, también para otro post.)
Entonces, el kernel es el corazón del sistema. Es quien controla todo, absolutamente todo lo que ocurre en la máquina. En fin, como al instalar Ubuntu, se instala de forma predeterminada un kernel genérico, pensé que quizás no se estaba aprovechando la capacidad -por mí­nima que sea- de mi máquina al 100%, y se me ocurrió recompilar (es decir, generar nuevamente) un kernel adecuado para la arquitectura de mi máquina.

El detalle es, que yo no sé hacerlo.
Así­ que, para quienes me leen y sienten curiosidad por hacer esto también, voy a detallar aquí­ los pasos que voy siguiendo, y los resultados de dichos pasos. Sí­ganme pues. (Por supuesto, para quienes sepan, se agradecería alguna ayuda sobre lo que pueda haber hecho mal, o de mejor manera).

Lo primero, obviamente, es buscar información acerca de cómo compilar un kernel en mi distribución. Al buscar en Google, me topé con esta página (en inglés):
http://www.howtoforge.com/kernel_compilation_ubuntu (nótese que prácticamente lo que hago a lo largo de la guí­a es traducir. El crédito va para el autor de dicha guí­a; yo nomás traduzco y describo lo que hice).

Bueno, al seguir los pasos, toca entonces actualizar la base de datos de paquetes (repositorios) del sistema, e instalar paquetes necesarios para la compilación. Yo lo hago con apt-get, pero se puede usar aptitude también, da igual:

(previamente se coloca ‘sudo’, porque todo esto se debe hacer en modo SúperUsuario/root.
Si no se quiere hacer esto -aunque no recomiendo que hagan esto-, entonces escriban antes “sudo passwd root” -sin las comillas- e ingresen una clave. OJO: NO LA OLVIDEN. Luego, entren como root. Tecleen “su” -de nuevo, sin comillas-, ingresen la clave que pusieron y listo. No olviden quitar ‘sudo’ al principio de cada instrucción si hacen esto):


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

Listos estos tres comandos (apt-get me sugirió que instalara “debian-keyring cvs gettext-doc linux-source kernel-source libdb3-dev libncurses-dev docbook-utils diff-doc”, y recomendó “build-essential libmail-sendmail-perl libmail-box-perl”), procedemos a bajar la última versión del kernel desde http://www.kernel.org/
Para el momento de este post, el último kernel estable es el 2.6.25.4, con un prepatch disponible de la siguiente versión (2.6.26-rc2).

Como hay disponible un prepatch para el kernel, yo decidí­ aplicárselo también. Esto es opcional, y se hace si el kernel que tienes no soporta algo que necesitas, y en el siguiente kernel sí­ está disponible, pero no está disponible todaví­a la fuente completa. (Yo lo estoy integrando nomás por probar; después de todo, si el kernel no funciona, puedo volver al que tengo ahora).

Hay un detalle MUY IMPORTANTE: si quieres integrar un prepatch, necesitas la versión del kernel con 3 números (en este caso, 2.6.25), NO con 4 (o sea, el que ya habí­a mencionado, que era el 2.6.25.4):

Entonces, antes que nada, necesito bajar tanto el patch, como el kernel base (como estaba siguiendo las instrucciones, ya habí­a descargado el 2.6.25.4):

sudo wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.tar.bz2
sudo wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.26-rc2.bz2

(Nótese que el kernel es algo “pesado”. Son como 46 MB. comprimido. Sin embargo, contiene una cantidad de controladores impresionante, lo cual lo hace bastante funcional.)

Luego de descargarlo, lo descomprimimos, creamos un enlace simbólico a la carpeta, y cambiamos a esta:

sudo tar xjf linux-2.6.25.tar.bz2
sudo ln -s linux-2.6.25 linux
cd /usr/src/linux

(En esta compu, la descompresión tardó aaaaaaños…Bueno, ok, quizás no años, pero sí­ tardó bastante.)

Teniendo el kernel descomprimido, integro el patch al kernel nuevo, pero probándolo primero.
El primer comando es sólo una prueba. Si (Y SOLO SI) se ejecuta sin errores, puedes correr el segundo (al principio parece que no hace nada, pero saldrá una larga lista con los archivos que se están parcheando):

sudo bzip2 -dc /usr/src/patch-2.6.26-rc2.bz2 | patch -p1 --dry-run
sudo bzip2 -dc /usr/src/patch-2.6.26-rc2.bz2 | sudo patch -p1

En mi caso, se ejecutó sin problemas, excepto por una sola cosa. Al ejecutar el segundo comando, noten el “sudo” luego del “pipe”. Si no lo colocaba, daba un error de “permission denied”. (Tardó bastante tiempo, igual que al descomprimir — gracias a Ubuntu Forums por el detalle con lo del “sudo” luego del ‘|’, especí­ficamente, este thread: http://ubuntuforums.org/showthread.php?t=310284).

Como no es mala idea usar como base la configuración del kernel actual para el kernel nuevo, copio dicha configuración a “/usr/src/linux”:

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

Y ahora, justo lo que querí­a. La siguiente instrucción, invoca al menú de configuración del kernel:

sudo make menuconfig

Ahí­, como ya tengo un archivo de configuración, voy a “Load an Alternate Configuration File” y escribo .config, que es el archivo que tiene lo de mi kernel actual (el que tengo es el “2.6.24-17-generic”).

Con esto, ya toca personalizar el kernel. Los cambios que hice -no muchos- fueron (si estás siguiendo esto como guí­a, lo que quieres cambiar no necesariamente es lo mismo — incluso, puede que no quieras cambiar nada):

Corriendo:

x86info

obtuve la siguiente información sobre mi procesador (esto es para optimizar, en un futuro, el kernel para opciones especí­ficas de mi computador – por ahora no voy a usar nada de esto):


carlos@inuki:/usr/src/linux-2.6.25$ x86info -v
x86info v1.20. Dave Jones 2001-2006
Feedback to <davej@redhat.com>.


Found 1 CPU
--------------------------------------------------------------------------
Family: 15 Model: 2 Stepping: 9 Type: 0 Brand: 10
CPU Model: Pentium 4 (Northwood) [D1] Original OEM
Processor name string: Intel(R) Celeron(R) CPU 2.00GHz


Feature flags:
Onboard FPU
Virtual Mode Extensions
Debugging Extensions
Page Size Extensions
Time Stamp Counter
Model-Specific Registers
Physical Address Extensions
Machine Check Architecture
CMPXCHG8 instruction
Onboard APIC
SYSENTER/SYSEXIT
Memory Type Range Registers
Page Global Enable
Machine Check Architecture
CMOV instruction
Page Attribute Table
36-bit PSEs
CLFLUSH instruction
Debug Trace Store
ACPI via MSR
MMX support
FXSAVE and FXRESTORE instructions
SSE support
SSE2 support
CPU self snoop
Hyper-Threading
Thermal Monitor
Pending Break Enable
cntx-id xTPR
Extended feature flags:

Cache info
Instruction trace cache: 12K uOps, 8-way associative.
L1 Data cache: 8KB, sectored, 4-way associative. 64 byte line size.
L2 unified cache: 128KB, 2-way associative. 64 byte line size.
TLB info
Instruction TLB: 4K, 2MB or 4MB pages, fully associative, 128 entries.
Data TLB: 4KB or 4MB pages, fully associative, 64 entries.
The physical package supports 1 logical processors

[Por cierto, mil gracias a Phenobarbital por escribir en su blog acerca de algunas opciones para mejorar el rendimiento. Como ven, acá apliqué algunas (las de él, en este post, eran para un AMD. El mí­o es Intel)]

Processor Type and Features:
Processor Family —> (Pentium-4/Celeron(P4-based)/Pentium-4 M/older Xeon)
Preemption Model —> (Preemptible Kernel (Low-Latency Desktop))
Timer frequency —> (1000 HZ)

Kernel Hacking
Kernel Debugging (desactivado)

Con los cambios listos, selecciono Exit, y respondo “Yes” a la pregunta de “Do you wish to save your new kernel configuration?”.

Con el kernel configurado, toca entonces compilarlo. Esto se hace con las siguientes instrucciones:

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

(En donde dice “custom”, puedes poner cualquier cadena de caracteres -sin espacios, y debe comenzar con un guión/signo menos- que desees. Esto es para describir al kernel nuevo. Yo le puse “-inuki”, que es el nombre de mi máquina.)

Después de un laaaaargo tiempo (una compilación de kernel puede tomar horas, dependiendo de la máquina; y yo no medí­ cuánto, porque primero me fui a dormir mientras compilaba -después de todo, eran las 3 a.m- y luego estuve fuera todo el dí­a; pero cuando revisé, a eso de las 11:40 p.m., todaví­a seguí­a O_O), queda solamente instalarlo.
En mi máquina, al hacer:

cd /usr/src
ls -l

luego de la compilación, pude conseguir dos paquetes .deb: linux-image-2.6.26-rc2-inuki_2.6.26-rc2-inuki-10.00.Custom_i386.deb (que es el que contiene el kernel como tal) y linux-headers-2.6.26-rc2-inuki_2.6.26-rc2-inuki-10.00.Custom_i386.deb (que contiene archivos necesarios para agregar módulos al kernel de ser necesario más adelante).

Esto nos permite inclusive llevar el kernel a otras máquinas e instalarlo sin tener que compilarlo de nuevo.
Para instalarlo, se corre lo siguiente:

sudo dpkg -i linux-image-2.6.26-rc2-inuki_2.6.26-rc2-inuki-10.00.Custom_i386.deb
sudo dpkg -i linux-headers-2.6.26-rc2-inuki_2.6.26-rc2-inuki-10.00.Custom_i386.deb

(Recuerden que los nombres son distintos dependiendo de las opciones que hayan elegido, como el kernel usado, y lo que pusieron en “custom”. En mi caso, serí­a “inuki”.)

¡Y listo! Para chequear que se ha realizado la instalación del nuevo kernel correctamente, puedes revisar el archivo menu.lst del cargador de arranque GRUB, así­:

vim /boot/grub/menu.lst

(No hace falta “sudo”, porque no lo vas a editar, simplemente es para ver el contenido; y puedes sustituir vim con gedit, o cualquier editor de texto que quieras. Es igual.)

En mi sistema, aparecen así­:

title Ubuntu 8.04, kernel 2.6.26-rc2-inuki
root (hd1,1)
kernel /boot/vmlinuz-2.6.26-rc2-inuki root=UUID=56c0aafe-425b-4081-8077-b69f5ee1f826 ro quiet splash locale=es_ES
initrd /boot/initrd.img-2.6.26-rc2-inuki
quiet


title Ubuntu 8.04, kernel 2.6.26-rc2-inuki (recovery mode)
root (hd1,1)
kernel /boot/vmlinuz-2.6.26-rc2-inuki root=UUID=56c0aafe-425b-4081-8077-b69f5ee1f826 ro single
initrd /boot/initrd.img-2.6.26-rc2-inuki

Ahora, sólo queda reiniciar el sistema:

sudo shutdown -r now

Si se inicia correctamente, con el comando:

uname -r

Puedes ver el nombre del kernel que estás usando, en mi caso quedaría:

carlos@inuki:~$ uname -r
2.6.25-inuki

NOTA: Si no inicia, o da errores, cuando llegues al menú del GRUB, y te aparezcan las opciones de kernel, sencillamente elige el kernel que tení­as antes, que debe estar justo debajo del nuevo. Luego edita el archivo menu.lst del GRUB (debes estar como root para eso), quita las referencias al kernel nuevo, e intenta de nuevo.
Se agradecen comentarios. 🙂 Gracias por leer, a pesar de lo largo.

P.D.: Y como era de esperarse, para un novato en compilación… no me funcionó del todo. 😛 Me da una serie de errores que ya ando buscando, aunque el kernel como tal, sirve.

Actualización 30-05-2008: Luego de leer un poco en algunos foros y páginas (después de todo, para eso está Google), descubrí que mi problema viene de tener, tanto una tarjeta nVidia (una FX5200) como una tarjeta PCI Wireless, las cuales requieren que se recompilen los módulos restringidos, o como se les conoce, los linux-restricted-modules. En el caso de un kernel estándar, se puede hacer siguiendo unos pasos que detallaré en una próxima entrada, pero como el kernel es demasiado nuevo, y las fuentes de los módulos restringidos aún no están a la par, pues hay que esperar, o en su defecto, compilar un kernel que ya tenga los restricted-modules disponibles.

Anuncios

3 comentarios en “Compilando el kernel 2.6

  1. Este post no lo leí porque ni si quiera sé que CLDM es un Kernel
    xD LOL
    “Saludos Monocromáticos”

  2. hola, estuve ocupando tu guía entre otras, para compilar el kernel 2.6.28, y al arranque queda en una linea que dice unable to enumerate USB device on port 4 y no pasa de eso, sabes a qué puede deberse eso?, saludos

    • Hola, ¿qué tal? Al parecer, se trata de un bug con ciertos dispositivos USB. ¿Podrías darme información acerca de tu hardware? Es decir, ¿para qué sistema estás tratando de compilar el kernel, qué dispositivos tienes, y esa clase de cosas?

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s