You are on page 1of 8

Introduccin La intencin de este documento es orientar a quienes quieren, por primera vez, compilar ellos mismos el kernel de su mquina.

Comenzar por explicar conceptos bsicos como qu es el kernel, y describir algunas de las caractersticas ms comunes e importantes. En ningn caso pretendo describir la funcionalidad de cada una de las opciones que forman parte del kernel, sino nicamente servir de gua en este importante paso. Qu es el Kernel? Debemos comenzar por respondernos esta pregunta. El Kernel en s es el corazn o ncleo del Sistema Operativo. En nuestro caso, el kernel se llama Linux, y el Sistema Operativo en s lo compone el kernel junto con una serie de programas y aplicaciones. Para qu compilar el Kernel? Una pregunta que a veces los usuarios principiantes se hacen es justamente esta: para qu compilar el kernel si ya tienen su mquina funcionando. La respuesta es simple, y es que entre una versin y otra de los distintos kernel se agregancaractersitcas nuevas al mismo adems de una serie de mejoras. Por otro lado, el kernel que acompaa a las distribuciones es un kernel genrico, esto quiere decir que no tiene ningn tipo de optimizacin para nuestro hardware especfico, viene por defecto para procesadores i386, y lo ms probable que tenga soporte para una gran cantidad de dispositivos que es innecesaria puesto que no los poseemos. Por ltimo, el compilar el kernel es un paso altamente educativo y didctico para comprender en mayor profundidad el funcionamiento del sistema, y siempre es bueno saberlo por si alguien lo pregunta Qu necesito para poder compilar el kernel? En primer lugar, un compilador (gcc). Necesitamos adems las libreras de desarrollo correspondientes al sistema (glibc), y en algunos casos requeriremos tambin del ensamblador as que se distribuye en el paquete binutils. Otros ensambladores disponibles para Linux son gasm o nasm. Una vez que confirmemos la existencia de todas estas herramientas en nuestro sistema, es necesario contar, obviamente, con las fuentes del kernel. En la mayora de las distribuciones estas se incluyen en el disco de instalacin, pero no se instalan por defecto. De todas maneras es recomendable bajar siempre la ltima versin puesto que la mayora de los fabricantes de distribuciones incluye cdigo adicional en su kernel que no forma parte del original. Si tienes la seguridad que cuentas con los fuentes 100% originales sin modificaciones, es posible que te actualices a la ltima versin a travs de parches. Los parches son archivos que contienen las diferencias entre un rbol de fuentes y otro. Por ende, es mucho ms conveniente actualizar nuestro kernel a travs de este metodo sobre todo si contamos con una conexin a internet relativamente lenta, puesto que los parches son de muy pequeo tamao. Parchando el kernel

Si tienes una versin completa del kernel, no es necesario que leas esta seccin, aunque puedes hacerlo para fines educativos. Los parches se aplican en forma consecutiva. Esto quiere decir que, si por ejemplo, tu versin actual del kernel es la 2.2.13 y deseas actualizarte a la 2.2.16, necesitas los parches 2.2.14, 2.2.15 y 2.2.16. Estos deben ser aplicados en ese orden, uno despus del otro, y no es necesario realizar una compilacin en cada paso. Es necesario remarcar que no es posible parchar una versin mayor del kernel: del 2.0.36 no se puede parchar al 2.2. Siguiendo el ejemplo anterior en que actualizaremos el kernel 2.2.13 al 2.2.16, supondremos que los parches se encuentran en nuestro directorio home para el usuario usuario, en formato gzip. El rbol de nuestro kernel actual se encuentra en /usr/src/linux, que a su vez debe ser un link simblico a /usr/src/linux-2.2.13. Dentro de ese directorio, llamamos el siguiente comando: localhost:/usr/src/linux# gzip -cd /home/usuario/patch-2.2.14.gz | patch -p0 localhost:/usr/src/linux# gzip -cd /home/usuario/patch-2.2.15.gz | patch -p0 localhost:/usr/src/linux# gzip -cd /home/usuario/patch-2.2.16.gz | patch -p0 Esta serie de comandos puede ser reemplazada por el siguiente, siempre y cuando tengamos solo aquellos parches en dicha ubicacin: localhost:/usr/src/linux# gzip -cd /home/usuario/patch-2.2.1* | patch -p0 Si despus de lo anterior no obtenemos ningn mensaje de error (y espero que as sea), todo est bien y ahora contamos con un rbol actualizado con la ltima versin del kernel. Entonces actualizamos el link simblico, renombrando el directorio primero: localhost:/usr/src# mv linux-2.2.13 linux-2.2.16 localhost:/usr/src# ln -sf linux-2.2.16 linux Finalmente tenemos todo listo para configurar y compilar. El proceso de configuracin Como mencion en un principio, una de las razones por la cual compilar el kernel es para ajustarlo y optimizarlo a nuestro hardware. Esto se hace por medio de la configuracin, un proceso con una gran cantidad de opciones. Ac tratar de describir solo aquellas ms comunes e importantes. Antes de comenzar, es necesario tomar en cuenta lo siguiente: muchas de las caractersticas propias del kernel pueden ser compiladas dentro del mismo o como mdulos. La diferencia radica principalmente en que, mientras ms modularizado sea nuestro kernel, ms pequeo ser el tamao de su imagen, lo que por ende nos lleva a una mejor utilizacin de la memoria. Por otro lado, la utilizacin de mdulos tiene otra gran ventaja: un kernel dinmico hace ms facil la tarea de agregar o eliminar hardware, puesto que solamente es necesario compilar e instalar o eliminar el mdulo correspondiente, respectivamente, y no reconfigurar todas las opciones del sistema y compilar un nuevo kernel. Adems, los

mdulos son cargados en memoria y eliminados de ella en demanda, haciendo nuevamente un manejo ms eficiente de los recursos. Por ltimo, cabe decir que hay quienes ven en la existencia de mdulos un gran riesgo de seguridad: un mdulo malicioso puede ser capaz de esconder procesos, usuarios, etc. (por ejemplo el mdulo heroine). Por supuesto, los mdulos requieren de privilegios root para ser instalados, por lo que la mquina debe tener un compromiso de seguridad previo para que esto suceda (cosa que un buen administrador no permitir ). Dicho todo esto, vamos a lo nuestro. La configuracin del kernel se lleva a cabo a travs de un programa interactivo que muestra todas las posibles opciones. En este sentido, existen tres posibilidades: un sencillo programa de consola que consta en una serie de preguntas (no recomendado, es muy tedioso y no da la posibilidad de retroceder), otro es un programa al igual de consola pero con una interfaz basada en ncurses lo que lo hace mucho ms amigable para el usuario (definitivamente la mejor alternativa), y por ltimo un programa similar pero para X11 (no recomendado puesto que puede presentar problemas de estabilidad). Estos programas se ejecutan, respectivamente, de la siguiente manera: localhost:/usr/src/linux# makeconfig localhost:/usr/src/linux# makemenuconfig localhost:/usr/src/linux# makexconfig Todos estos cuentan con pantallas de ayuda para la gran mayora de cada una de las opciones de configuracin. Como mencion ms arriba, la segunda alternativa es la ms segura, y es segn la cual me guiar en el resto de este documento. Al ejecutar este comando, nos encontraremos luego de un instante frente a una pantalla con una serie de opciones. Qu elegir? Las opciones a elegir pueden presentarse de la siguiente manera:
y

Caracteristica que solo es posible compilar dentro del kernel

<>Opcion que puede ser compilada como modulo independiente Como la primera, las opciones que presentan ese tipo de parntesis solamente se pueden compilar como parte del kernel y las opciones son "Y" o "N", mientras que en la segunda se nos da la posibilidad de implantarlas como mdulo donde las opciones son "Y", "M" (mdulo, o tambin interpretado como maybe, quizs) o "N". A continuacin, describir brevemente las categoras y opciones ms importantes: Codematurityleveloptions --->
y

Prompt for development and/or incomplete code/drivers

Al seleccionar esta opcin se nos preguntar durante el proceso de configuracin si queremos incluir en nuestro kernel caractersticas muy nuevas y/o experimentales, incrementando la cantidad de posibilidades. Processor type and features ---> (386) Processor family (1GB) Maximum Physical Memory [ ] Math emulation
y

MTRR (Memory Type Range Register) support

[ ] Symmetricmulti-processingsupport En esta seccin se indica el tipo de procesador y sus caractersticas: primero seleccionamos la familia de la CPU (386, 486, 586, 686, etc.), es importante elegir la que corresponde y no una mayor a la nuestra. El resto de las opciones debieran de ser comunes para la mayora de los usuarios: la cantidad mxima de memoria fsica (1 o 2 Gb), emulacin matemtica (no es necesario a menos que tengamos un 386 sin coprocesador), MTRR (muy importante para quienes poseen aceleradores grficos), y SMP (slo para quienes tienen procesadores duales/mltiples). Loadable module support --->
y y y

Enableloadable module support Set version information on all symbols for modules Kernel module loader

Definitivamente queremos soporte para las 3 General setup ---> Opciones generales de configuracin: soporte para redes, PCI, entre otros. De suma importancia:
y y y

System V IPC BSD ProcessAccounting Sysctlsupport

<*>Kernelsupportfora.outbinaries <*>Kernelsupportfor ELF binaries Recomendado leer las pantallas de ayuda para cada una de las opciones ("?") Plug and Play support ---> Sorpresa: soporte para dispositivos PnP (plug 'n pray)

Block devices ---> Configuracin de dispositivos adicionales: de suma importancia, no olvidar: Si contamos con un disco duro IDE desde el cual booteamos Linux, el soporte para este tipo de dispositivos NO debe ser configurado como mdulo; esto es motivo para un kernelpanic al momento de iniciar el sistema. Lo mismo va para quienes poseen discos SCSI. <*>Enhanced IDE/MFM/RLL disk/cdrom/tape/floppysupport <*>Include IDE/ATA-2 DISK support El resto de las opciones son para dispositivos especficos en su mayora, nuevamente "?". Networkingoptions ---> Opciones de red: soporte para firewall, IP aliasing, masquerading, entre otros. No olvidar "?". SCSI support ---> Soporte para dispositivos SCSI, desde controladoras hasta una variedad de perifricos. Network devicesupport ---> Soporte para diversos dispositivos de red, como adaptadores Ethernet, Token Ring, X.25, etc. ("?"). ISDN subsystem ---> Configuracin ISDN. "?". Characterdevices ---> Diversas opciones de dispositivos tales como soporte para terminales virtuales, consolas, puertos seriales, autodeteccin de IRQs, mouse, joysticks, adaptadores de captura de video y otros. "?". Filesystems ---> Soporte para diversos sistemas de archivos: Ni se te ocurra compilar el soporte para ext2 como mdulo. Como siempre, "?". Console drivers ---> Drivers para la consola de texto, desde el normal VGA hasta extensin framebuffer. Nuevamente "?". Sound --->

Soporte para sonido, junto con mdulos para una gran cantidad de tarjetas. Muy importante ver la ayuda correspondiente a la tuya ("?") adems de la documentacin existente en /usr/src/linux/Documentation/sound. Kernel hacking ---> La nica opcin que encontraremos dentro de esta categora es MagicSysRqkey, la cual nos permite, si la habilitamos, poder acceder a pantallas informativas y otras funciones muy tiles (sobre todo si se cae el sistema) a travs de combinaciones de teclas. Una vez ms recomiendo leer la ayuda correspondiente ("?"). Y a continuacin, qu? Una vez finalizada la configuracin del kernel (y estando seguros de que todo est como corresponde), debemos salir del programa y guardar los cambios. Hecho esto, procedemos a generar las dependencias y limpiar los objetos residentes anteriores que puedan andar por ahi: localhost:/usr/src/linux# makedep&&makeclean Pregunta (para quienes no saben): qu significa el &&? Respuesta: es un operador lgico que significa and (y), en trminos prcticos, separa dos comandos, y siempre y cuando la salida del primero haya sido true (verdadero), o sea, haya tenido xito, ejecutar el siguiente. De esta forma, nos aseguramos que solo se continuar si es que no hay errores. A continuacin, la parte ms larga: la compilacin de la imagen del kernel: localhost:/usr/src/linux# makezImage Mientras esto ocurre, podemos disfrutar de una taza de caf, aunque en los procesadores actuales esto es cada vez menos posible Si al finalizar este proceso obtenemos un mensaje dicindonos que el sistema es demasiado grande (systemtoobig) tenemos dos posibilidades: tratar de compilar la imagen en un formato comprimido reemplazando el comando anterior por: localhost:/usr/src/linux# makebzImage o bien modularizando en mayor forma nuestro sistema, esto es, eliminando aquellas opciones innecesarias y utilizar la mayor cantidad de mdulos posibles. Luego repetir el paso anterior. Si, por el contrario, el sistema no nos arroj ningn mensaje de error, estamos listos para el siguiente paso: compilar los mdulos, e instalarlos: localhost:/usr/src/linux# make modules &&makemodules_install Otra pequea espera (quizs mayor que la primera). Una vez terminado, estamos listos

para nuestro siguiente paso. La instalacin del nuevo kernel Si ests aqus es porque (espero) durante todo el proceso no has sufrido ningn fallo. Nuestro siguiente paso puede ser el ms complejo y es instalar de forma definitiva el nuevo kernel en el sistema. Aunque, segn me han dicho, esto se puede hacer fcilmente en forma automtica a travs del siguiente comando: localhost:/usr/src/linux:# makeinstall El asunto es que nunca lo he probado yo personalmente, ni me llama la atencin hacerlo. Si eres de esas personas como yo, quienes prefieren hacer todo manualmente y entender un poco mejor como funciona todo esto, entonces sigue las instrucciones que se dan a continuacin (en caso contrario y asumiendo que el comando anterior funcion puedes dejar de leer): Lo primero es copiar la imagen generada al directorio /boot del sistema. La ubicacion original de la imagen depende de la arquitectura, En este caso utilizaremos la del x86: localhost:/usr/src/linux:# cparch/i386/boot/zImage /boot/vmlinuz-2.2.16 Donde, por supuesto, reemplazaremos zImage con bzImage en caso de que hayamos generado la imagen con ese procedimiento, y tambien cambiamos el nombre del destino a la versin del kernel correspondiente. A modo de idea: yo mantengo links simblicos a dos versiones del kernel, de esta manera al actualizarlo solo debo adems actualizar los links, y no reconfigurar LILO: localhost:/:# ln -sf /boot/vmlinuz-2.2.16 /boot/vmlinuz localhost:/:# ln -sf /boot/vmlinuz-2.2.13 /boot/vmlinuz-old Esto es, por supuesto, siguiendo nuestro primer ejemplo en el cual deseamos actualizar desde la versin 2.2.13 a la 2.2.16. Paso siguiente: actualizar el LILO. Como mencion anteriormente, si utilizas el sistema de links simblicos descrito arriba solo ser necesario que el LILO lo modifiques una primera vez. Lo que a continuacin se muestra es un extracto del archivo de configuracin de LILO, ubicado en /etc/lilo.conf correspondiente a la seccin de la imagen de Linux: image = /boot/vmlinuz root = /dev/hda1 label = Linux read-only La idea es agregar una nueva seccin, correspondiente a la nueva imagen, y cambiar el nombre de etiqueta de la actual, por lo que esta parte de nuestro archivo debiera de quedar de la siguiente manera: image = /boot/vmlinuz

root = /dev/hda1 label = Linux read-only image = /boot/vmlinuz-old root = /dev/hda1 label = Linux-old read-only No es mi intencin en este caso describir la sintaxis de la configuracin del LILO sino citarlo para lo que es necesario. Si deseas ms detalles al respecto puedes referirte a la pgina del manual del lilo.conf(5). El ltimo paso: actualizar el LILO. Para eso, simplemente, lo ejecutamos: localhost:/# lilo Added Linux * Added Linux-old Lo olvidaba. Recomiendo tambin crear un link simblico para el archivo System.map con el fin de no tener que copiarlo cada vez que compilemos un nuevo kernel (este archivo contiene informacin especfica de la versin sobre los smbolos en los mdulos): localhost:/# ln -sf /usr/src/linux/System.map /boot/System.map Fin Eso es todo. Fin. Reinicia el nuevo kernel. Si funciona, felicitaciones. Si no, revisa cual pudo haber sido tu error. http://foro.elhacker.net/tutoriales_documentacion/compilacion_del_kernel_paso_a_paso -t15029.0.html#ixzz1OudTgvb1

You might also like