COMPILAR EL NÚCLEO COMPETENCIAS Aprender a compilar el núcleo Utilizar el comando Make Comprender los tipos de compilación PRERREQUISITOS Teoría Estudio de las distintas opciones de configuración. Prácticas laboratorio 1) Obtener la última versión del núcleo y descomprimirlo. 2) Crear el fichero de configuración. 3) Compilar e instalar el nuevo núcleo. 4) Configurar el arranque y muestre una captura de pantalla con el menú del cargador con la opción del nuevo núcleo. DOCUMENTACIÓN HORAS ESTIMADAS README que vienen con los fuentes de Linux Maxwell cap 2 Notas del profesor 2 Horas Contenidos A. Uso de las órdenes: make config make menuconfig make xconfig make make modules_install make install make clear make mrproper B. Archivos: .config vmlinuz initramfs System.map /grub/grub.conf 1 Tareas. Realice una copia del núcleo original antes de modificar y o recompilar Generar un fichero de configuración .config con alguna utilidad. Compile el núcleo como un núcleo monolítico, con módulos cargables. Configure el cargador del núcleo para que permita seleccionar un núcleo particular, uno de los cuales será la copia original del núcleo. Presente una memoria explicando los pasos realizados: 1) Obtener la última versión del núcleo y descomprimirlo. 2) Crear el fichero de configuración. 3) Compilar e instalar el nuevo núcleo. 4) Configurar el arranque y muestre una captura de pantalla con el menú del cargador con la opción del nuevo núcleo. 2 NOTAS DEL PROFESOR 1. Traer los fuentes de Linux Antes que nada por seguridad hay que realizar una copia del núcleo (backup) cp /boot/vmlinuz /boot/vmlinuz.old cp /boot/initrd /boot/initrd.old cp /boot/System.map /boot/System.map.old Para compilar una nueva versión de Linux necesitamos tener los nuevos fuentes, esto lo podemos conseguir de www.kernel.org; o de algún servidor espejo situado en España, como la rediris. Con los fuentes viene un fichero README , que no hay que dejar de leer, con todas las instrucciones para compilar esta versión del núcleo. Como resumen de un fichero README de una versión anterior del núcleo, se han generado estas notas, ¡puede que hayan cambios!. Colocamos los fuentes en un directorio que tengamos permisos, usualmente: /usr/src/linux-xxx Si hay que descomprimirlo gzip –cd Linux-2.6.xx.tar.gz | tar xvf – o bzip2 –dc Linux-2.6.xx.tar.bz2 | tar xvf – donde xx es la versión del núcleo Antes de compilar el núcleo debemos configurarlo, o mejor dicho crear un fichero .config con la configuración que deseamos para esa compilación. 2. Configurar y modificar características del núcleo Hay que situarse en el directorio donde hemos colocado los fuentes del núcleo, por ejemplo /usr/src/linux existen varias utilidades para configurar el núcleo make config make menuconfig make xconfig 3 make gconfig make oldconfig difieren en la forma de presentación, pero todas permiten modificar los mismos parámetros modificando el fichero .config del núcleo, parámetros parámetros parámetros parámetros otros generales del núcleo relativos a la memoria virtual del sistema de red del sistema de fichero make config la utilidad mas sencilla la mas fea en presentación, por lo que no se usa requiere contestar con un carácter y – respuesta afirmativa para incluir esa característica n – respuesta negativa para no incluir esa característica m – compilar como un modulo Ctrl+C elimina todos las respuesta y comienza de nuevo ? - para mostrar un menú de ayuda make menuconfig aplicación basada en un terminal de consola, utiliza Ncurses para simular un entorno de ventana, nos movemos por las opciones mediante los cursores. make xconfig requiere un terminal x windows (Qt) es agradable por su forma gráfica utiliza un menú con ventanas make gconfig requiere un terminal x Windows (Gtk) es agradable por su forma gráfica utiliza un menú con ventanas make oldconfigconfig Basa todas las cuestiones por defecto tomando la última configuración existente del fichero .config 4 Configurar y modificar características del núcleo dinámicamente Linux permite configurar y cambiar ciertas características del núcleo dinámicamente, esto es, sin recompilar e iniciar el núcleo, mediante: utilidades llamada al sistema sysctl sistema de archivos virtual /proc Hay que tener privilegios de root Llamada al sistema sysctl (kernel/sysctl.c) Esta llamada al sistema es muy potente y permite configurar mediante programa, dinámicamente ciertos parámetros del sistema. Sistema de archivos /proc/sys Todos los parámetros que son cambiables, son accesibles en forma de un archivo en el directorio /proc/sys, ejemplo /proc/sys/kernel/hostname:nombre de la máquina los parámetros son leídos al leer en el correspondiente fichero los parámetros son cambiados al escribir en el correspondiente fichero muchos usuarios pueden leer pero solo el root puede escribir Opciones de compilación Las opciones de compilación permiten indicar múltiples parámetros del núcleo que se compilará. Se deben seleccionar adecuadamente para el sistemas computador especifico donde vamos a ejecutar el núcleo. Tenemos que tener un conocimiento exhaustivo de todo el hardware de la máquina. Elegir y marcar aquellas características que se ajusten a nuestro hardware, y desmarcar y no incluir los driver de hardware que no tenemos en nuestra máquina, para que el núcleo sea optimo. A continuación se explican los grupos principales de opciones que nos podemos encontrar en las distintas aplicaciones de configuración, antes vistas. Code Maturity Level Options (Opciones obsoletas y experimentales del ćodigo) Esta opción permite configurar controladores obsoletos o software experimental en fase de pruebas. Si su objetivo es usar el nuevo núcleo para un sistema estable de producción entonces será mejor desactivar esta opción. Si necesita una característica experimental del núcleo como, por ejemplo, un controlador para hardware nuevo, active esta opción, pero tenga en cuenta que “puede que 5 no alcance los niveles estándar de fiabilidad” con los que contaría un software que haya sido probado rigurosamente. General Setup (Configuración general) Esta sección contiene las opciones de soporte para sysctl, que es una característica que permite la configuración del núcleo en tiempo de ejecución. El nuevo soporte del núcleo para el archivo ".config" permite ver toda la configuración del núcleo en tiempo de ejecución. Esto permite ver qué características se compilaron en el núcleo. Para la compilación del núcleo 2.6.33.2 en el sistema operativo CentOS es necesario activar la siguiente opción: General setup --> enable deprecated sysfs features to support old userspace tools No activarla tiene como consecuencia un kernel panic en la ejecución del kernel. Loadable Module Support (Soporte para módulos) Seguramente querrá activar un soporte para los módulos. Si necesita instalar módulos de terceros, también deberá activar la opción "Set Version Information on All Module Symbols". Processor Type and Features (Tipo y propiedades del procesador) Esta es, posiblemente, la opción de configuración más importante. Debemos examinar "/proc/cpuinfo" para obtener el procesador que estamos usando en nuestra máquina y, así, seleccionar apropiadamente las opciones de este menú. Aquí encontramos la opción "Preemptive Kernel", que puede mejorar el tiempo de respuesta de los escritorios. También aparece "Multi-processing Support" para máquinas con varias CPUs, y "High Memory Support" para máquinas con más de 1 GB de memoria RAM. Power Management Options (Opciones de gestión de energía) Aquí encontramos opciones para ACPI y el escalado de la frecuencia de la CPU, que pueden optimizar considerablemente el uso de energía y, por tanto, alargar el tiempo de uso cuando utilizamos baterías. Para más información, consulte el archivo "Documentation/power". Bus Options (PCI, PCMCIA, EISA, MCA, ISA) (Opciones de bus) Aquí encuentra opciones para todos los dispositivos de bus del sistema. En las máquinas modernas, generalmente puede desactivarse el soporte para ISA y MCA. Executable File Formats (Formatos ejecutables de fichero) Entre las opciones que se incluyen aquí, resulta interesante el soporte del núcleo para que este sea compatible con diferentes formatos binarios de archivo, que permite el uso de binarios no nativos de Linux con un poco de ayuda. 6 Device Drivers (Controladores de dispositivos) En este menú aparecen organizadas claramente todas las opciones de configuración de controladores que anteriormente estaban diseminadas por los menús de la versión 2.4 del núcleo. Aquí configuramos características como el soporte para SCSI, la optimización de tarjetas gráficas, el sonido, el USB y otros dispositivos hardware. File Systems (Sistemas de archivos) Aquí encontramos opciones para los sistemas de archivos que el núcleo soporta, como EXT2 y ReiserFS. Es mejor incluir soporte para el sistema de archivos raíz directamente en el núcleo en lugar de como módulo. Security Options (Opciones de seguridad) Entre las opciones que se incluyen aquí, resulta interesante el soporte para "NSA Security Enhanced Linux" y otras características un tanto experimentales para incrementar la seguridad. Ejemplo de configuración A modo de ejemplo hemos entrado en las opciones de la familia del procesador (Proccesor family) y hemos seleccionado el procesador de nuestra máquina: Pentium-4. Ilustración : Selección del procesador (Opciones de Compilación) 7 3. COMPILAR EL NÚCLEO Es un trabajo mas fácil que configurar el núcleo, existen varias formas, veamos algunas de ellas. realizar antes una copia del núcleo (backup) cp /boot/vmlinuz /boot/vmlinuz.old Aviso. Cuando pasamos a una nueva versión del núcleo hay que comprobar si también tenemos que actualizar paquetes de software que tengamos instalados. Para el compilador gcc hay que tener una versión 2.95.3 o superior. Cuando compilamos hay que tener privilegios de root, todos los ficheros que se generan en la compilación se sitúan por defecto en el directorio donde compilamos. Podemos utilizar el directorio de los fuentes del núcleo /usr/src/linux, o por seguridad podemos utilizar otro directorio para situar los ficheros de salida de la compilación con la opción O=output/dir. Nos situaremos en el directorio donde se encuentran los fuentes del núcleo /usr/src/linux.. Existe un fichero makefile para el compilador C, que permite generar un núcleo de forma automática. Si no es la primera vez que compilamos o por seguridad borraremos todos los ficheros .o generados en la compilación y quitaremos las dependencias con el comando make mrproper y seguidamente realizaremos la siguiente secuencia de ordenes (es aconsejable no usar como salida de la compilación el directorio donde están los fuentes pues ficheros cabecera con el mismo nombre pueden machacarse) supongamos que compilamos y queremos dejar la salida en el directorio /home/name/build/kernel)( incluido el .config). tendremos los fuentes en /usr/src/linux2.6.xxx y la salida de la compilación en: /home/name/build/kernel Nos situamos en el directorio de los fuentes y allí realizamos: make O=/home/name/build/kernel menuconfig 8 Esta orden, o otra análoga de las explicadas en la configuración, nos genera un fichero .config con la configuración para la compilación. make O=/home/name/build/kernel Esta orden realiza la compilación propiamente dicha partiendo del fichero .config y de todos los ficheros fuentes, tarda un poco o un mucho, y genera una imagen del núcleo comprimido. Se puede hacer la alternativa make install para actualizar el fichero de configuración de LILO, si no hay que actualizar el fichero de configuración de LILO o de GRUB si estamos utilizando este último cargador. sudo make O=/home/name/build/kernel modules_install install Esta orden nos compila con las opciones para poder manejar módulos en el núcleo. despues de la compilación, el núcleo comprimido bzImage se encuentra en el directorio /usr/src/linux/arch/i386/boot Copiamos la imagen del núcleo y el mapa que acabamos de compilar al directoriode arranque “/boot/”. Para ello ejecutamos: cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.11.10 cp System.map /boot/System.map-2.6.11.10 mkinitrd -f /boot/initrd-2.6.11.10.img 2.6.11.10 Con el commando mkinitrd se crea una imagen en un disco virtual RAM (situado en “/dev/ram0” generalmente) para precargar los módulos. realizar un reboot y ejecutar el nuevo núcleo. Previamente habremos actualizado el menú de arranque de nuestro cargador GRUB o LILO para introducir una nueva línea con nuestro nuevo núcleo. ¡ Diviertase con el nuevo núcleo! FIN Pasos para anteriores versiones del núcleo: make zImage 9 se puede crear una imagen del núcleo comprimida, para evitar mensajes de “núcleo muy grande”, con el comando make bzImage los ficheros objetos que se generan el la compilación del núcleo se pueden borrar mediante make modules Si hay funciones del núcleo que se realizan con módulos, hay que compilarlas make modules_install instala las funciones /lib/modules/<versión> de los módulos en el directorio make dep make clean make bzImage make modules make modules_install se pueden introducir los comandos en una sola línea y make los compila secuencialmente si no hay errores. make dep clean bzImage modules modules_install despues de la compilación, el núcleo comprimido bzImage se encuentra en el directorio /usr/src/linux/arch/i386/boot hay que copiarlo a /boot cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz realizar un reboot y ejecutar el nuevo núcleo, o lanzar el cargador lilo lilo El comando make bzlilo realiza los siguientes pasos de forma automática cp /boot/vmlinuz /boot/vmlinuz.old cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz lilo cp /usr/src/linux/System.map /boot/System.map System.map contiene símbolos del núcleo para que los módulos puedan interactuar con las funciones del núcleo. 10 Como ejemplo resumen, ejecutar la orden make dep clean bzlilo boot modules modules_install Miscelaneos Cuando escriba nuevo código del núcleo mantenga el formato y estilo según el fichero Documentation/CodingStile en el directorio de los fuentes del núcleo esto es: 8 caracteres de sangría; la llave abierta “{“, con el estilo de K&R, va en la misma línea que el if, else, for wile switch o do. Genere un fichero diffs o patch con los cambios efectuados con el comando diff. Supongamos el núcleo original en el directorio linux-2.2.5 Supongamos el núcleo modificado con los cambios en linux-prueba la secuencia de comandos es esta. ln –s linux-prueba linux make –C linux-2.2.5 distclean make –C linux distclean dif –urN linux-2.2.5 linux > nuevo.patch el fichero nuevo.patch contiene los cambios para otros usuarios aplicar el match. 11