Compilación del Kernel
-
Upload
juan-sanchez -
Category
Documents
-
view
1.364 -
download
2
Transcript of Compilación del Kernel
Desarrollo de entornos Linux EmbebidosFormación in Company
Linux kernel and driver development training
Juan Sánchez - [email protected]
Datos • Portatil password sage3000+
• Máquina virtual 192.168.59.128, root/12345678
Juan Sánchez - [email protected]
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
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]
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]
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
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
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]
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]
Selección de opcionesSelección de opcionesConfiguración, compiliación y arranque del núcleo
Juan Sánchez - [email protected]
¿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]
¿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]
¿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]
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
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]
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]
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]
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]
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]
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]
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]
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]
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]
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
#!/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]
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]
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]
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]