5.1. Arranque del instalador en 32-bit soft-float ARM

5.1.1. Formatos de imagen de arranque

En los sistemas basados en ARM, en la mayoría de los casos, se utiliza uno de los dos formatos de imágenes de arranque: a) núcleos Linux estándares en formato zImage (vmlinuz) conjuntamente con discos de RAM inicial estándares de Linux (initrd.gz), o bien b) núcleos en formato uImage (uImage) conjuntamente con los discos de RAM inicial correspondientes (uInitrd).

uImage y uInitrd son formatos de imagen diseñados para el «firmware» U-Boot, utilizados en muchos sistemas basados en ARM (sobre todo de 32 bits). Las versiones anteriores de U-Boot solo pueden arrancar archivos en el formato uImage/uInitrd y, por tanto, suelen emplearse en sistemas ARM más antiguos. Las versiones más recientes de U-Boot permiten además arrancar núcleos Linux estándares e imágenes de discos RAM, aunque la sintaxis de las órdenes necesarias para hacerlo es algo distinta de la utilizada para arrancar uImages.

En los sistemas que utilizan un núcleo multiplataforma, además del núcleo y el disco de RAM inicial se necesita lo que se denomina un archivo de árbol de dispositivos (también conocido como «device-tree blob» o dtb). Este archivo es específico para cada sistema admitido y contiene la descripción del «hardware» concreto de cada sistema. Este dtb lo debería suministrar el «firmware» del equipo, aunque en la práctica a menudo hace falta cargar uno nuevo.

5.1.2. Arrancar desde TFTP

El arranque a través de la red requiere que tenga una conexión de red y un servidor de arranque TFTP (y probablemente también un servidor DHCP, RARP o BOOTP para la configuración automática de la red).

En la Sección 4.3, “Preparación de los ficheros para el arranque a través de red usando TFTP” se describe la configuración del servidor para permitir el arranque a través de la red.

5.1.2.1. Arranque TFTP en U-Boot

El arranque desde la red en sistemas que usan el firmware de U-Boot consiste en tres pasos: a) configurar la red, b) cargar las imágenes (kernel/initial ramdisk/dtb) en la memoria y c) ejecutar el código cargado previamente.

Primero tiene que configurar la red, bien automáticamente mediante DHCP ejecutando

setenv autoload no
dhcp

o de manera manual definiendo varias variables de entorno

setenv ipaddr <dirección IP del cliente>
setenv netmask <máscara de red>
setenv serverip <dirección IP del servidor TFTP>
setenv dnsip <dirección IP del servidor de nombres>
setenv gatewayip <dirección IP de la pasarela predeterminada>

Si lo prefiere, puede hacer que estos cambios sean permanentes ejecutando

saveenv

Después tiene que cargar las imágenes (kernel/initial ramdisk/dtb) en la memoria. Esto se lleva a cabo con la orden tftpboot, a la que debe indicar la dirección donde debe almacenarse la imagen en la memoria. Desafortunadamente, el mapa de memoria puede variar de un sistema a otro, por lo que no existe una regla general que determine las direcciones que puede utilizar.

En algunos sistemas, U-Boot predefine un conjunto de variables de entorno con las direcciones de carga apropiadas: kernel_addr_r, ramdisk_addr_r y fdt_addr_r. Puede comprobar si se encuentran definidas ejecutando

printenv kernel_addr_r ramdisk_addr_r fdt_addr_r

Si no se han definido, tiene que consultar la documentación de su sistema para obtener estos valores y establecerlos manualmente. En sistemas basados en Allwinner SunXi SOC (p. ej., el Allwinner A10, nombre de arquitectura sun4i o el Allwinner A20, nombre de arquitectura sun7i), puede, p. ej., utilizar los siguientes valores:

setenv kernel_addr_r 0x46000000
setenv fdt_addr_r 0x47000000
setenv ramdisk_addr_r 0x48000000

Cuando se definan direcciones de carga, puede cargar las imágenes en la memoria desde el servidor tftp definido anteriormente con

tftpboot ${kernel_addr_r} <nombre del archivo de la imagen del núcleo>
tftpboot ${fdt_addr_r} <nombre del archivo de dtb>
tftpboot ${ramdisk_addr_r} <nombre del archivo de la imagen de inicio de ramdisk>

La tercera parte consiste en configurar la línea de órdenes del núcleo y ejecutar el código cargado. U-Boot pasa el contenido de la variable de entorno bootargs como línea de órdenes al núcleo, por lo que cualquiera de los parámetros para el núcleo y el instalador - como el dispositivo de consola (consulte Sección 5.3.1, “Consola de arranque”) o las opciones de preconfiguración (consulte Sección 5.3.2, “Parámetros del instalador de Debian” y Apéndice B, Instalar automáticamente utilizando preconfiguración) - pueden establecerse con una orden como

setenv bootargs console=ttyS0,115200 rootwait panic=10

La orden exacta para ejecutar el código cargado previamente depende del formato usado para la imagen. Con uImage/uInitrd, la orden es

bootm ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}

y con imágenes nativas de Linux es

bootz ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r}

Nota: al arrancar imágenes de Linux estándares, es importante cargar la imagen del disco RAM inicial después del núcleo y el «dtb» a medida que U-Boot define en la variable «filesize» el valor del tamaño del último archivo cargado y la orden «bootz» solicita el tamaño de la imagen del disco RAM para que esta funcione adecuadamente. Si está arrancando un núcleo específico para una plataforma (un núcleo sin árbol de dispositivos, por ejemplo), omita el parámetro ${fdt_addr_r}.