5.1. Arrancar o Instalador em 32-bit hard-float ARMv7

5.1.1. Formatos de imagens de arranque

Em sistemas baseados em ARM na maioria dos casos é utilizado um de dois formatos de imagens de arranque: a) kernels Linux standard de formato zImage (vmlinuz) em conjunto com os ramdisk iniciais standard de Linux (initrd.gz) ou b) kernels de formato uImage (uImage) em conjunto com os correspondentes ramdisks iniciais (uInitrd).

uImage/uInitrd são formatos de imagens desenhados para o firmware U-Boot que é utilizado em muitos sistemas baseados em ARM (na maioria os de 32-bit). As versões mais antigas de U-Boot apenas podem arrancar ficheiros no formato uImage/uInitrd, por isso estes são normalmente utilizados em sistemas armel mais antigos. As novas versões U-Boot podem - além de arrancar uImages/uInitrds - também arrancar kernels Linux standard e imagens ramdisk, mas a sintaxe de comando para o fazer é ligeiramente diferente da para arrancar a partir de uImages.

Para sistemas que utilizem um kernel multi-plataforma, além do kernel e ramdisk inicial, é necessário o chamado ficheiro device-tree (ou blob device-tree, dtb). É especifico de cada sistema suportado e contém uma descrição do hardware próprio. O dtb pode ser fornecido com o dispositivo pelo firmware, mas na prática normalmente tem de ser carregado um is recente.

5.1.2. Configuração da consola

O tarball netboot (Secção 5.1.3.2, “Tarball netboot pré-construído”), e as imagens para cartão SD do instalador (Secção 5.1.5, “Utilizar imagens pré-construídas com o instalador para cartões SD”) utilizam a consola predefinida (específica da plataforma) que é definida pelo U-Boot na variável console. Na maioria dos casos é uma consola série, por isso nessas plataformas irá necessitar por predefinição de um cabo série de consola para utilizar o instalador.

Em plataformas que também suportem uma consola gráfica, pode modificar a variável console do U-Boot de acordo se desejar que o instalador inicie na consola gráfica.

5.1.3. Arrancar por TFTP

Arrancar pela rede requer que tenha uma ligação de rede e um servidor TFTP de arranque por rede (e provavelmente também um servidor de DHCP, RARP ou BOOTP para a configuração automática da rede).

A configuração do servidor para suportar arranque pela rede é descrita na Secção 4.3, “Preparar Ficheiros para Arrancar Através da Rede por TFTP”.

5.1.3.1. Arranque por TFTP em U-Boot

O arranque pela rede em sistemas que utilizam o firmware U-Boot consiste em três passos: a) configurar a rede, b) carregar as imagens (kernel/ramdisk inicial/dtb) para a memória e c) efetivamente executar o código carregado.

Primeiro tem de configurar a rede, quer automaticamente por DHCP ou correndo

setenv autoload no
dhcp

ou manualmente definindo várias variáveis de ambiente

setenv ipaddr <endereço ip do cliente>
setenv netmask <máscara de rede>
setenv serverip <endereço ip do servidor de tftp>
setenv dnsip <endereço ip do servidor de nomes (dns)>
setenv gatewayip <endereço ip da gateway predefinida>

saveenv

Depois tem de carregar as imagens (kernel/ramdisk inicial) para a memória. Isto é feito com o comando tftpboot, ao qual tem de ser passado o endereço a partir de onde é guardada na memória a imagem. Infelizmente o mapa de memória pode variar entre sistemas, por isso não há uma regra genérica com os endereços que possam ser utilizados para isto.

Em alguns sistemas, U-Boot predefine um conjunto de variáveis de ambiente com endereços de carregamento apropriados: kernel_addr_r, ramdisk_addr_r e fdt_addr_r. Pode verificar se estão definidos ao correr

printenv kernel_addr_r ramdisk_addr_r fdt_addr_r

Se não estiverem definidos, tem que verificar a documentação do seu sistema por valores apropriados e defini-los manualmente. Para sistemas baseados em SOCs Allwinner SunXi (e.g. o Allwinner A10, nome de arquitetura sun4i ou o Allwinner A20, nome de arquitetura sun7i), pode por exemplo utilizar os seguintes valores:

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

Quando estiverem definidos os endereços de carregamento, pode assim carregar as imagens para a memória a partir do servidor tftp anteriormente definido:

tftpboot ${kernel_addr_r} <nome de ficheiro da imagem do kernel>
tftpboot ${fdt_addr_r} <nome de ficheiro de dtb>
tftpboot ${ramdisk_addr_r} <nome de ficheiro da imagem inicial de ramdisk>

A terceira parte é definir a linha de comandos do kernel e executar o código carregado. U-boot passa o conteúdo da variável de ambiente bootargs como linha de comandos do kernel, por isso quaisquer parâmetros para o kernel e instalador - tais como dispositivo de consola (veja Secção 5.3.1, “Boot serial console”) ou opções de preseeding (seja Secção 5.3.2, “Parâmetros de instalação Debian” e Apêndice B, Automatizar a instalação utilizando preseeding) - pode ser definido com um comando como

setenv bootargs console=ttyS0,115200 rootwait panic=10

O comando exato a executar o código carregado anteriormente depende do formato de imagem utilizado. Com uImage/uInitrd o comando é

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

e com imagens nativas de Linux é

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

Nota: Quando arrancar imagens standard de linux, é importante carregar a imagem ramdisk inicial após o kernel e o dtb já que U-Boot define a variável de tamanho de ficheiro ao tamanho do último ficheiro carregado e o comando bootz necessita o tamanho da imagem ramdisk para funcionar corretamente. Em caso de arrancar um kernel específico da plataforma, i.e. um kernel sem device-tree, simplesmente omita o parâmetro ${fdt_addr_r}.

5.1.3.2. Tarball netboot pré-construído

Debian disponibiliza um tarball pré-compilado ( .../images/netboot/netboot.tar.gz ) que pode simplesmente ser descompactado com seu servidor de tftp e contém todos os ficheiros necessários para netbooting. Inclui também um script de arranque que automatiza todos os passos para carregar o instalador. As versões modernas do U-Boot contêm uma funcionalidade de arranque automático por tftp que se torna ativo se não existir um dispositivo de armazenamento local de arranque (MMC/SD, USB, IDE/SATA/SCSI) e depois carrega este script de arranque a partir do servidor de tftp. O pré-requisito para utilizar esta funcionalidade é que tenha um servidor de dhcp na sua rede que forneça ao cliente o endereço do servidor de tftp.

Se desejar disparar a funcionalidade de arranque automático por tftp a partir da linha de comandos do U-Boot, pode utilizar o seguinte comando:

run bootcmd_dhcp

Para carregar manualmente o script de arranque disponibilizado pelo tarball, pode em alternativa lançar os seguintes comandos na prompt do U-Boot:

setenv autoload no
dhcp
tftpboot ${scriptaddr} /debian-installer/armhf/tftpboot.scr
source ${scriptaddr}

5.1.4. Arrancar a partir de uma 'pen' USB em U-Boot

Muitas versões modernas do U-Boot suportam USB e permitem arrancar através de dispositivos de armazenamento USB tais como pens USB. Infelizmente os passos exatos necessários para o fazer poderão variar bastante de dispositivo para dispositivo.

U-Boot v2014.10 introduziu uma framework comum para lidar com linha de comandos e autoboot. Isto permite compilar imagens de arranque genéricas para funcionar em qualquer sistema que implemente esta framework. O debian-installer suporta a instalação a partir de uma pen USB em tais sistemas, mas infelizmente nem todas as plataformas adotaram já esta framework.

Para compilar uma pen USB de arranque para instalar Debian, desempacote o tarball hd-media (veja Secção 4.2.1, “Onde Encontrar Ficheiros de Instalação”) numa pen USB formatada com um sistema de ficheiros suportado pela versão do U-Boot no seu dispositivo. Para versões do U-Boot modernas, qualquer dos FAT16 / FAT32 / ext2 / ext3 / ext4 normalmente funciona. Depois copie o ficheiro da imagem ISO do primeiro CD ou DVD Debian de instalação para a pen.

A framework autoboot nas versões modernas do U-Boot funciona de forma similar às opções da ordem de arranque na BIOS/UEFI do PC, i.e. verifica numa lista de dispositivos de arranque possíveis por uma imagem de arranque válida e inicia a primeira que encontrar. Se não existir um sistema operativo instalado, ligar a pen USB e ligar o sistema deve resultar no inicio do instalador. Pode também iniciar o processo de arranque por USB em qualquer altura a partir da linha de comandos do U-Boot ao introduzir o comando run bootcmd_usb0.

Um problema que pode surgir ao arrancar a partir de uma pen USB enquanto utiliza uma consola série pode ser o baudrate da consola errado. Se a variável console for definida no U-Boot, o script de arranque do debian-installer passa-a automaticamente ao kernel para definir a consola primária e, se aplicável, o baudrate da consola. Infelizmente a forma de lidar com a variável da consola varia de plataforma para plataforma - em algumas plataformas, a variável console inclui o baudrate (com em console=ttyS0,115200), enquanto que noutras plataformas a variável console contém apenas o dispositivo (como em console=ttyS0). O último caso leva a uma saída da consola errada quando o baudrate predefinido difere entre o U-Boot e o kernel. As versões modernas do U-Boot vulgarmente utilizam 115200 baud enquanto que o kernel ainda está predefinido para os tradicionais 9600 baud. Se isto acontecer, deve definir manualmente a variável console para conter o baudrate correto para o seu sistema e depois iniciar o instalador com o comando run bootcmd_usb0.

5.1.5. Utilizar imagens pré-construídas com o instalador para cartões SD

Para alguns sistemas, Debian disponibiliza imagens para cartões SD que contêm o U-Boot e o debian-installer. Estas imagens são disponibilizadas em duas variantes - uma para para fazer download dos pacotes de software através da rede (disponível em .../images/netboot/SD-card-images/ ) e outra para instalações offline utilizando um CD/DVD com Debian (disponível em .../images/hd-media/SD-card-images/ ). Para poupar espaço e largura de banda, as imagens estão divididas em duas partes - uma parte dependente do sistema chamada firmware.<system-type>.img.gz, e uma parte independente do sistema com o nome partition.img.gz.

Em sistemas Linux para criar uma imagem completa a partir das duas partes, pode utilizar o zcat conforme se segue:

zcat firmware.<system-type>.img.gz partition.img.gz > complete_image.img

Em sistemas Windows, tem primeiro de descomprimir as duas partes separadamente, o que pode ser feito e.g utilizando o 7-Zip, e concatenando as partes descomprimidas ao correr o comando

copy /b firmware.<system-type>.img + partition.img complete_image.img

numa janela com o CMD.exe do Windows.

Escreva a imagem resultante num cartão SD, e.g. ao correr o seguinte comando num sistema Linux:

cat complete_image.img > /dev/SD_CARD_DEVICE

Após ligar o cartão SD no alvo e ligar o sistema, o instalador é carregado a partir do cartão. Se utilizar a variante hd-media para instalações offline, tem de dar acesso ao instalador ao primeiro CD/DVD de Debian num meio separado, que pode ser e.g. uma imagem ISO de CD/DVD numa pen USB.

Quando chegar à etapa de particionamento no instalador (veja Secção 6.3.4, “Particionar e Escolher os Pontos de Montagem”), pode apagar ou substituir partições anteriores no cartão. Uma vez o instalador iniciado, corre totalmente na memória principal do sistema e não necessita mais de acesso ao cartão SD, por isso pode utilizar o cartão completo para instalar Debian. A forma mais fácil de criar um layout de partições adequado no cartão SD é deixar o instalador criar automaticamente um (veja Secção 6.3.4.2, “Particionamento Guiado”).