GNU/Linux – Compilación del KERNEL COMPILACIÓN DEL KERNEL El kernel o núcleo es el corazón del sistema operativo. Es el sistema operativo en sí mismo. Todo lo que no sea el kernel se denomina aplicación, en el caso de Linux, el 95% de las aplicaciones son GNU. El núcleo se encarga de manejar una infinidad de cosas, entre ellas están: manejo de memoria, periféricos, procesos, paquetes de red, todo el hardware en general, etc. Generalmente, los núcleos que vienen pre-compilados en las distribuciones más grandes, se adaptan a la mayoría de las instalaciones, pero existen casos en los cuales se hace necesario compilar e instalar un núcleo nuevo. Las razones pueden ser variadas, pero la mayoría de las veces es porque se necesita una versión más moderna del núcleo (con problemas solucionados) o se instala un nuevo hardware que no está contemplado en el núcleo de la distribución que estamos utilizando en este momento. ¿De dónde podemos bajar el núcleo de GNU/Linux? Ud. podrá obtener el kernel de Linux ingresando a www.kernel.org. Una vez que ingrese al sitio Ud. verá una gran variedad de versiones para descargar. La que le recomendamos que baje es "The latest stable versión of the Linux kernel is: (versión) (fecha) F V VI Changelog" Si desea descargar la versión completa debe clickear en "F" (full) Los otros son parches, que sirven para aplicar las últimas modificaciones sobre la versión anterior de las fuentes si ya las habías descargado. Para descargar el código fuente también podría usar el siguiente comando: # wget ftp://ftp.kernel.org/pub/linux/kernel/v2.4/linux- 2.4.20.tar.gz La última versión (a la fecha, nov/2003) de Kernel es 2.4.21, veamos que significa cada número: El primer número de los que van separados por puntos corresponde a la versión del kernel, actualmente es la 2 y varía con muy poca frecuencia (la primera fue la 0 en 1991). La segunda cifra corresponde al patchlevel, actualmente es la 4 y varía cada dos o tres años aproximadamente en las cifras pares: un "patchlevel" impar indica una versión del kernel "beta" o en pruebas, que hace de paso intermedio para que los desarrolladores puedan probar nuevos componentes para la siguiente versión par. Las versiones impares normalmente no están pensadas para usuarios normales, y solo deberían usarse si la versión estable actual no contiene controlador (controlador (driver) para un dispositivo específico y no ha encontrado ningún controlador (driver) por separado salvo en el kernel "beta". Por último la tercera cifra, indica el subnivel (sublevel), que actualmente es el 21, varía cada pocos meses y normalmente consiste en pequeñas correcciones de fallos que tenga la versión inicial del "patchlevel" correspondiente. En las versiones estables los cambios son más lentos porque sólo se corrigen pequeños fallos y crecen en proporción logarítmica. Recién liberada una versión estable hay más fallos que encontrar. En las versiones beta este número varía rápidamente, porque normalmente se van añadiendo nuevos controladores (drivers) además de ir corrigiendo fallos. Por ejemplo actualmente el kernel estable va por el 21 (2.4.21) mientras que el beta, que se creó más tarde, ya va por la 2.6.0- test1. Marco Antonio de Hoyos Pág 1 http://tecnicoslinux.com.ar GNU/Linux – Compilación del KERNEL ¿Qué es la compilación? La compilación es el proceso que se le aplica a los archivos de texto que escribió un programador (con una sintáxis específica llamada "lenguaje de programación") para que los mismos se conviertan en archivos "binarios" (formato que entiende la computadora). Los comandos que se usan durante la compilación son los siguientes: COMANDO make Sintáxis: make [opciones] [seccion-Makefile] Este comando se utiliza para compilar, linkeditar e instalar un programa que requiera de la compilación de varios fuentes (archivos .c). Generalmente, un programa medianamente grande, se integra de una biblioteca de funciones propias y varios fuentes. El make conoce en qué orden de secuencia debe compilar todos estos fuentes y dónde debe instalarlos para que el usuario utilice el programa recién compilado y cómo debe relacionarlos entre sí para que puedan ejecutarse en el orden especificado. COMANDO Sintáxis: gcc [opciones] <archivo.c> Este comando compila y linkedita los programas. Opciones: "-I": directorio que utilizará para buscar los archivos .h (headers) "-L": directorio donde buscará las bibliotecas para linkeditar "-l": nombre de la biblioteca a utilizar (sin las primeras 3 letras "lib") ¿CÓMO COMPILAR EL KERNEL? Antes de configurar el kernel anote en un papel la siguiente información: Tipo de procesador que posee Si posee arquitectura PCI El tipo de controlador IDE de su sistema, si es que éste tiene uno. El tipo de controlador SCSI de su sistema, si lo posee. El tipo de interfaz que utilice el CD El tipo de tarjeta de red de su sistema. Saber el número de fabricación y modelo del chipset de la tarjeta de red. Los números de fabricación, de modelo y de chip de la tarjeta de sonido. Una buena forma de obtener toda esta información es escribir en la consola el siguiente comando: dmesg, el mismo nos mostrará todo lo que detectó el kernel en la máquina. No olviden anotar toda la información del hardware. La necesitarán luego! Pasos a seguir 1. Bajamos el kernel de www.kernel.org y lo guardamos en /tmp 2. Descomprimimos el núcleo en el directorio /usr/src. Recordemos que para cambiarse a este directorio deberá escribir cd /usr/src. Para descomprimir escriba: tar xzvf /tmp/linux-2.4.21.tar.gz . Una vez que sea descomprimido tendremos el siguiente directorio /usr/src/linux . 3. Si tuviéramos en nuestra máquina el kernel versión 2.4.20 podríamos bajar únicamente el parche de kernel.org en vez de la versión completa del Kernel. Si realizamos esta operación deberemos hacer lo siguiente: Marco Antonio de Hoyos Pág 2 http://tecnicoslinux.com.ar GNU/Linux – Compilación del KERNEL a. zcat /tmp/patch-2.4-20.gz | patch –p0. De esta forma estaremos utilizando el zcat para ver el archivo y redireccionando esta salida al comando patch. Una vez que finalicemos este proceso se verá una lista de los archivos modificados por el parche. b. Procedemos a renombrar el archivo emparchado para evitar confusiones en un futuro. 4. A partir de aquí comienza el proceso de Configuración: a. Si queremos borrar cualquier configuración que haya en el núcleo y dejar un kernel genérico ejecutamos lo siguiente: make mrproper. b. Si deseamos setear el núcleo definiendo paso a paso las configuraciones, deberemos elegir alguna de estas tres opciones: c. Modo texto. Escribimos en la consola el comando make config y nos harán preguntas acerca de cómo queremos setear cada cosa. (Esta operación puede demorar muchísimo tiempo! ya que el Sistema realizará pregunta por pregunta y esperará que contestemos por sí o por no cada una de ellas para continuar) d. Modo texto con menú de opciones. Escribimos en la consola el comando make menuconfig. Iniciará una aplicación funcional para configurar el kernel. Observemos que su uso es bastante intuitivo: las opciones con un < > indican la posibilidad de modularizar. Si en ella presionamos M la seleccionaremos como módulo. Si presionamos ESPACIO aparecerá un * indicando que será incluido en el kernel. Finalmente, si presionamos N lo deseleccionaremos. Las opciones marcadas con [ ] no son modularizables. Es importante aclarar en este momento que existen dos formas de setear el núcleo: monolítica ó modular. En la monolítica todo lo que necesitamos está incluido en el núcleo y una vez compilado no podremos cambiar nada. Con la forma modular podremos instalar y desinstalar los módulos por separado sin tener que reiniciar la PC. Vamos a seleccionar los módulos en la configuración y se guardarán en /lib/modules. e. Modo gráfico. Para acceder a este modo tipeeamos make xconfig. En este modo se lanzará una aplicación sumamente amigable en la que no tendremos ningún problema. f. Una vez que elegimos la opción debemos configurar los siguientes puntos (es muy importante que no nos olvidemos ninguno!) g. Procesador: Procesor type _ Dispositivo de placa de red: Network Device Suport. Recordemos habilitar el protocolo ppp, que nos permitirá configurar la conexión a internet una vez que finalice la compilación. h. Firewall: Networking packet filtering, seleccionamos networking filters y luego Iptables suport. i. File Systems: Seleccionamos Ext3, NFS, NTFS, Netware, DOS FAT, MSDOS, Vfat, Virtual Memory, ISO 9660 (cdrom) j. Networking Options: Seleccionamos Packet Socket, Socket Filtering, IP: Netfilter Configuration. k. Sound l. Kernel Hacking Marco Antonio de Hoyos Pág 3 http://tecnicoslinux.com.ar GNU/Linux – Compilación del KERNEL 5. Cuando se termina de configurar se genera el archivo .config y nos instará a ejecutar make dep y clean. a. make dep compila lo que se necesita para que el kernel se compile correctamente. Llama a gcc y compila las dependencias. b. make clean, borra los archivos temporales que se generaron al compilar las librerías. 6. En este momento deberemos ejecutar el comando make bzImage que generará el kernel propiamente dicho con el cual trabajará luego. Los archivos creados se guardan en /usr/src/linux/arch/i386/boot/bzImage 7. Escribimos en la consola make modules, para compilarlos y luego.. 8. make modules_install para acoplarlos al núcleo. 9. En este punto el kernel ya ha sido compilado y debe ser ubicado en el sector de booteo para estar accesible cuando se inicia su PC. Para esto deberemos escribir: cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.4.21 10. cp /usr/src/linux/system.map /boot/system.map-2.4.21 11. 11. Una vez copiados estos dos archivos cambiamos al directorio /boot y ejecutamos el comando ls –l para buscar el viejo link y cambiarlo. 12. Cambiamos el archivo de configuración del lilo ó grub para poder acceder al nuevo kernel al iniciar. Veamos cómo lo haríamos en lilo: Agregar lo siguiente a / etc/lilo.conf image=/boot/vmlinuz-2.4.0label=new root=/dev/hda1 # reemplazar por la partición root correcta en tu sistema # ver la parte del lilo.conf correspondiente al kernel ACTUAL para # saber cuál es la partición root que se está utilizando # en caso de haber creado el RAMDISK inicial. # eliminar el comentario de la siguiente línea #initrd=/boot/initrd-2.4.0.img read-only initrd=/boot/initrd-2.4.0.img read-only Ejecutar lilo -t y si no muestra errores, ejecutar lilo -v y reiniciar la máquina. Lista rápida de pasos a seguir para compilar su kernel: make dep make clean make bzImage # ir a tomar cafe (mucho cafe) make modules make modules_install cp /usr/src/linux-2.4.20/arch/i386/boot/bzImage /boot/vmlinuz-2.4.20 Marco Antonio de Hoyos Pág 4 http://tecnicoslinux.com.ar GNU/Linux – Compilación del KERNEL # ojo, en la línea anterior es vmlinuz (con z al final) cp /usr/src/linux-2.4.20/System.map /boot/System.map-2.4.20 cd /boot rm System.map ln -s System.map-2.4.20System.map RAMDISK inicial (No es requerido usualmente en Red Hat Linux) mkinitrd /boot/initrd-2.4.0.img 2.4.0 OPCIONAL: crear un nuevo rescue disk (RECOMENDADO!!!) mkbootdisk --device /dev/fd0 2.4.0 En Red Hat 7.0 es necesario modificar el archivo nakefile luego de descompactar la tarball, en la siguiente línea, que es la que se encarga de indicar el compilador a utilizar: CC =($CROSSCOMPILE)gcc ... etc ... etc ... Debe quedar así (es todo la misma línea): CC :=$(shell if which $(CROSS_COMPILE)kgcc > /dev/null 2>&1; then echo $(CROSS_COMPILE)kgcc; else echo $(CROSS_COMPILE)gcc; fi) -D__KERNEL__ -I$(HPATH) INSTALACIÓN DE "PARCHES" (patch). zcat /tmp/patch-2.4.1 | patch - pØ Para ver los mensajes que aparecen durante el arranque. Tenemos que escribir el siguiente comando: dmesg | less (less es una versión de more que permite moverse hacia atrás). Marco Antonio de Hoyos Pág 5 http://tecnicoslinux.com.ar