Compilación del Kernel

28
Desarrollo de entornos Linux Embebidos Formación in Company Linux kernel and driver development training Juan Sánchez - [email protected]

Transcript of Compilación del Kernel

Page 1: Compilación del Kernel

Desarrollo de entornos Linux EmbebidosFormación in Company

Linux kernel and driver development training

Juan Sánchez - [email protected]

Page 2: Compilación del Kernel

Datos • Portatil password sage3000+

• Máquina virtual 192.168.59.128, root/12345678

Juan Sánchez - [email protected]

Page 3: Compilación del Kernel

Semana 2 de 4 / Sesión 3 de 8

Agenda

Juan Sánchez - [email protected]

Módulos del kernel de linux

Bloqueo: proceso, progr, parado e interrupción

Introducción al kernel de linux (1h)

Detalles del arranque del núcleo

Dispositivos de caracter. Kernel driver frameworks

Conf, compilación y arranque del núcleo de linux

Gestión memoria y acceso al hardware

77

66

55

44

33

22

11

Controladores. Dispositivos, modelos y depuración

Dispositivos DMA99

88

Estudio de un tipo específico de controlador (3h)1010

Mapa desarrollo de núcleo 2.6

Page 4: Compilación del Kernel

La acción es el fruto propio del conocimiento.(Thomas Fuller)

44 Conf, compilación y arranque del núcleo

• Requerimientos• Aplicaciones dependientes de la versión del núcleo• Configuración y

Juan Sánchez - [email protected]

Page 5: Compilación del Kernel

Configurar sistema para reinicio con el nuevo núcleo y testeo completo de servidor

Definir nuevo núcleo como núcleo por defectoy puesta en producción

Selección de lasopciones a compilaren el núcleo y compilación

Verificar queel nuevo código es compatible con nuestras utilidades actuales

Descargar códigodel kernel desdehttp://www.kernel.org

Migración a un nuevo núcleoMigración a un nuevo núcleoConfiguración, compiliación y arranque del núcleoConfiguración, compiliación y arranque del núcleo

Descarga delfuente e instalarlo

Verificaciónversionado y dependencias

Configuracióny construcción

Reinicio sisty testeo completo

Puesta en marcha

Juan Sánchez - [email protected]

Page 6: Compilación del Kernel

Herramientas necesariasHerramientas necesariasConfiguración, compiliación y arranque del núcleo

Juan Sánchez - [email protected]

Tipo Descripción Programa/PaqueteCompiladorCompilador Traductor de .c a lenguaje

máquina, analizando parse (lexico, sintaxis, semántica)

gcc --version

EnlazadorEnlazador Enlaza ficheros objetos generados por compilador con las librerías creando fichero ejecutable binario

paquete binutilsld -v

"Buscador""Buscador" Herramienta que busca en árbol src del núcleo llamando a compilador y enlazador

make --version

Page 7: Compilación del Kernel

Aplicaciones dependientesAplicaciones dependientesConfiguración, compiliación y arranque del núcleo

Juan Sánchez - [email protected]

Utilidad Descripción Versión

util-linuxutil-linux Conjunto de utilidades básicas de linux (dmesg, fdformat, fsck, halt, kill, mkfs, reboot, swapon, whereis, …)

fdformat --version

module-init-toolsmodule-init-tools Conjunto de utilidades de gestión del módulos del kernel (depmod, insmod, rmmod, modprobe, modinfo, …)

depmod --version

process tools process tools (procps)(procps)

Conjunto de utilidades básicas gestión de procesos (ps, top, …)

ps --version

filesystem toolsfilesystem tools Conjunto de herramientas de gestión de los filesystem (ext*=e2fsprogs, reiserfs=reiserfsprogs)

tune2fsreiserfsck -V

Page 8: Compilación del Kernel

Selección de opcionesSelección de opcionesConfiguración, compiliación y arranque del núcleo

• Fichero conf /usr/src/linux/.config• Recreación fichero make oldconfig• Tipos de opciones:

• y = Yes = * = Sí = Compilado en el núcleo• n = No = ' ' = No = No incluido en el núcleo• m = Module = M = Módulo = Como módulo

Juan Sánchez - [email protected]

Page 9: Compilación del Kernel

Selección de opcionesSelección de opcionesConfiguración, compiliación y arranque del núcleo

• Edición fichero .config mediante vi + make• Modo interactivo make config• Modo menu make menuconfigmake menuconfig• Modo Xwin make xconfig• Modo recreacion make oldconfigmake oldconfig

Juan Sánchez - [email protected]

Page 10: Compilación del Kernel

Selección de opcionesSelección de opcionesConfiguración, compiliación y arranque del núcleo

Juan Sánchez - [email protected]

Page 11: Compilación del Kernel

¿Qúe controlador usa un disp?¿Qúe controlador usa un disp?Configuración, compiliación y arranque del núcleo

• Necesario determinar que controlador usa un dispositivo

• Conociendo el dispositivo

basename `readlink /proc/sys/class/<tipo>/<disp>/device/driver/module`

Juan Sánchez - [email protected]

Page 12: Compilación del Kernel

¿Qúe controlador usa un disp?¿Qúe controlador usa un disp?Configuración, compiliación y arranque del núcleo

• Desonociendo el dispositiv

• Escanear el hardware (lspci, lsdev, …)

• Con el id en los dispositivos, buscar la definición

• Buscar el módulo según la definición

Juan Sánchez - [email protected]

Page 13: Compilación del Kernel

¿Qúe controlador usa un disp?¿Qúe controlador usa un disp?Configuración, compiliación y arranque del núcleo

Juan Sánchez - [email protected]

Page 14: Compilación del Kernel

Compilación de los módulos (contralores, fs, …)

Instalación de los módulos compilados previamente en /lib/modules/

Creación de la imagen iniciable del núcleobzImage = Imagen Grande comprimida con gzip

Revisión dependenciasCreación .depend en cada directorio

Borrado ficheros de salida de compilaciones precedentes (core files, system map files, …)

Your own footer

Compilación Compilación

make cleanmake dep make bzImage make modulesmake modules_install

Configuración, compiliación y arranque del núcleoConfiguración, compiliación y arranque del núcleo

Page 15: Compilación del Kernel

Selección de opcionesSelección de opcionesConfiguración, compiliación y arranque del núcleo

• Edición fichero .config mediante vi + make• Modo interactivo make config• Modo menu make menuconfigmake menuconfig• Modo Xwin make xconfig• Modo recrecion defecto make defconfigmake defconfig• Modo recreacion make oldconfigmake oldconfig

Juan Sánchez - [email protected]

Page 16: Compilación del Kernel

Creación del nuevo núcleoCreación del nuevo núcleoConfiguración, compiliación y arranque del núcleo

• 2 posibilidades: paso a paso o bien make• Opciones de mejora compilación:

• Si multiprocesador make -j2*<Nº CPUs>• Si solo controladores especificos make M=drivers/…• Crosscompilling dep make ARCH=x86_64 defconfig• Crosscompilling make ARCH=arm

CROSS_COMPILE=<tool_chain>• Utilizar precache make CC="ccache gcc"

Juan Sánchez - [email protected]

Page 17: Compilación del Kernel

Instalación nuevo núcleoInstalación nuevo núcleoConfiguración, compiliación y arranque del núcleo

• make no ha dado ningún error

• Modos posibles:• Manual• Automático installkernel (mkinitrd)

Juan Sánchez - [email protected]

Page 18: Compilación del Kernel

Instalación manualInstalación manualConfiguración, compiliación y arranque del núcleo

1. Instalación de los módulos creados cd /usr/src/linux && make modules_install

2. Copia del nuevo nuevo al directorio arranqueexport kversion=`make kernelversion`

cp arch/i386/boot/bzImage /boot/vmlinuz-$kversion

cp System.map /boot/System.map-$kersion

Juan Sánchez - [email protected]

Page 19: Compilación del Kernel

Instalación manualInstalación manualConfiguración, compiliación y arranque del núcleo

3. Modificación del bootloada.GRUB /boot/grub/menu.list

• Copiar entrada existente• Apuntar nueva entrada a nuevo núcleo

b.LILO /etc/lilo.conf• Copiar entrada existente• Apuntar nueva entrada a nuevo núcleo• Ejecutar /sbin/lilo

Juan Sánchez - [email protected]

Page 20: Compilación del Kernel

Instalación manualInstalación manualConfiguración, compiliación y arranque del núcleo

4. Reiniciar sistema

5. Testear todo el sistema

6. Definir nuevo núcleo como núcleo por defecto default <posición nuevo núcleo>

Juan Sánchez - [email protected]

Page 21: Compilación del Kernel

Descompresión bzImage o zImage y llamada rutina head.S y carga de los contraladores

Definir nuevo núcleo como núcleo por defectoy puesta en producción

LILO, GRUB cargan núcleo seleccionado en memoriaCarga de initrd

BIOS /Boot Monitor

Master Boot Record512b=446 bootloader+64 partition+2magic number

Proceso de arranque del sistemaProceso de arranque del sistemaConfiguración, compiliación y arranque del núcleoConfiguración, compiliación y arranque del núcleo

Busqueda sector arranque

Inicio del sistema Cargador del núcleo

Expansióndel núcleo en memoria

Puesta en marcha

Juan Sánchez - [email protected]

Page 22: Compilación del Kernel

Initial RAM disk (initrd)Initial RAM disk (initrd)Configuración, compiliación y arranque del núcleo

• Sistema raiz temporal montado en tiempo de montado

• Contiene controladores y ejecutables (insmod, …) que permiten montar sistema raiz real

• En sistemas embebidos es el sistema real

• Utiliza dispositivo /dev/loop

Juan Sánchez - [email protected]

Page 23: Compilación del Kernel

Initial RAM disk (initrd)Initial RAM disk (initrd)Configuración, compiliación y arranque del núcleo

• Fichero montado como dispositivo de bloque

• /boot/initrd

• Versiones nuevas = cpio + gzip

• Versiones anteriores = gzip + ext2

Juan Sánchez - [email protected]

Page 24: Compilación del Kernel

Creación initrdCreación initrdConfiguración, compiliación y arranque del núcleo

Juan Sánchez - [email protected]

• Automática :mkinitrd sh Personalizable!!!

• Manual

• Creación fichero

• Formateo fichero

• Montado fichero y rellenado

Page 25: Compilación del Kernel

#!/bin/bash

RDSIZE=4000BLKSIZE=1024

dd if=/dev/zero of=/tmp/ramdisk.img bs=$BLKSIZE count=$RDSIZE

/sbin/mke2fs -F -m 0 -b $BLKSIZE /tmp/ramdisk.img $RDSIZE

mount /tmp/ramdisk.img /mnt/initrd -t ext2 -o loop=/dev/loop0cd /mnt/initrdmkdir bin sys dev proc

# Grab busybox and create the symbolic linkspushd /mnt/initrd/bincp /usr/local/src/busybox-1.1.1/busybox .ln -s busybox ashln -s busybox mountln -s busybox echoln -s busybox lsln -s busybox catln -s busybox psln -s busybox dmesgln -s busybox sysctlpopd

Configuración, compiliación y arranque del núcleoCreación de initrd

Juan Sánchez - [email protected]

Page 26: Compilación del Kernel

cp -a /dev/console /mnt/initrd/devcp -a /dev/ramdisk /mnt/initrd/devcp -a /dev/ram0 /mnt/initrd/devcp -a /dev/null /mnt/initrd/devcp -a /dev/tty1 /mnt/initrd/devcp -a /dev/tty2 /mnt/initrd/dev

pushd /mnt/initrdln -s bin sbinpopd

cat >> /mnt/initrd/linuxrc << EOF#!/bin/ashechoecho "Simple initrd is active"echomount -t proc /proc /procmount -t sysfs none /sys/bin/ash --loginEOF

chmod +x /mnt/initrd/linuxrc

umount /mnt/initrdgzip -9 /tmp/ramdisk.imgcp /tmp/ramdisk.img.gz /boot/ramdisk.img.gz

Configuración, compiliación y arranque del núcleoCreación de initrd

Juan Sánchez - [email protected]

Page 27: Compilación del Kernel

Obtener configuración anterior pero con el nuevo código

Crear un nuevo núcleoe instalarlo.

Aplicar parche finalpatch -p1 < ../parche_finalVerificar Makefile

Conectarse a kernel.org y descargar los parches. Verificar Makefile

Aplicar cada uno de los parchespatch -p1 < ../parche_1Verificar Makefile

Migración a un nuevo núcleoMigración a un nuevo núcleoConfiguración, compiliación y arranque del núcleoConfiguración, compiliación y arranque del núcleo

Aplicar parchesprecedentes

Descarga parchesy descompresión

Aplicar parchefinal

Guardar configuracionanterior

Crear nuevonúcleo

Juan Sánchez - [email protected]

Page 28: Compilación del Kernel

Bibliografia• The Linux Kernel Module Programming Guide

(http:/*www.tldp.org/LDP/lkmpg/2.6/html/index.html)

• Linux Kernel Development Second Edition (Robert Love)

• Understanding The Linux Kernel 3Rd - (Daniel P.Bovet)

• Linux Kernel Architecture (Wolfgang Maurer)

• Linux Device Drivers (Jonathan Corbet, Alessandro Rubini)

Juan Sánchez - [email protected]