Manual

do

Maker

.

com

Ambiente de compilação para Raspberry com Raspbian

Ambiente de compilação para Raspberry com Raspbian

Existem muitos usuários de Linux que não tem conhecimento de arquiteturas, não é uma obrigação afinal.  Mas se você pretende compilar programas para Raspberry, ter uma noção de arquiteturas ajudará a traçar as estratégias para agilizar uma compilação como por exemplo, o kernel. Vejamos como fazê-lo, utilizando o Raspbian como sistema base.

Tipos de compilação

A (obviamente) mais conhecida é a compilação nativa, onde se produz binários para a plataforma em que o código fonte está. Isto é, você tem o código fonte do gkrellm (aposto que você vai pesquisar que programa é esse) e quer compilá-lo para seu Ubuntu:

tar gkrellm-2.3.5.tar.bz2
cd gkrellm-2.3.5
./configure && make && make install

Pronto, agora é só executar.

Cross-compilling

Esse modo de compilação é utilizado para gerar binários para outra plataforma que não a qual se está gerando o binário do programa.

Virtualizado em outra plataforma

É a maneira mais prática de compilar para uma plataforma utilizando o processamento de outra. Claro, por ser virtualizado, perde-se em processamento, mas é melhor compilar para Raspberry em uma máquina virtual do que nativamente, dependendo do tamanho da compilação. É isso que será explicado nesse post.

Se desejar saber mais sobre outras maneiras de compilação (sim, tem outras), leia esse outro artigo sobre toolchains. Talvez você se surpreenda.

Preparando o ambiente para desenvolvimento

Nesse outro artigo eu mostrei como emular uma máquina ARM (usando QEmu), mas dessa vez focarei especificamente no Raspbian porque há um objetivo claro e é mais bacana escrever artigos nessas condições.

Comece instalando o arsenal QEmu em seu notebook. Não use o que vem no repositório, pegue o do projeto oficial.

Adicionalmente, instale as dependências para a compilação:

apt-get install libvte-dev libsdl-dev libbluetooth-dev

Se porventura alguma dependência mais surgir, supra-a. Você receberá a mensagem de uma possível dependência após os comandos:

tar xvjf qemu-2.6.0 && cd qemu-2.6.0
./configure --enable-system --enable-linux-user --enable-guest-agent --enable-modules --enable-sdl --enable-vte --enable-curses --enable-bluez --enable-kvm

Passando por essa fase, você pode partir para a compilação.

make && sudo make install

Após instalado, você pode seguramente remover o diretório e o pacote, caso deseje.

Copiar o kernel do Raspbian

Para fazer o boot com o QEmu, é necessário ter o kernel para passar como parâmetro por linha de comando, por isso será necessário um comando especial para montar a imagem do sistema e então copiá-lo de lá. Esse comando de sistema difere um pouco da montagem tradicional, e explico em detalhes porque.

Montar loop especificando o offset

Quando você utiliza o comando mount, você passa diretamente o dispositivo pretendido. Porém, quando se trata de uma imagem de disco, é necessário passar o offset, porque não é um dispositivo diretamente, mas trata-se de uma imagem de disco devidamente particionada. Veja:

01e.webp

Dois desses valores são importantes, sendo o tamanho do setorinício da partição. Perceba que a imagem do Raspbian tem duas partições, sendo a primeira um FAT32, e a segunda, uma partição Linux. Na segunda partição está o sistema raiz e na primeira partição estão os arquivos necessários para o boot. Devemos montar a primeira partição para pegar o kernel que lá está.

A partição FAT32 começa em 8192 e o tamanho do setor é de 512 bytes, portanto o comando para montar a partição fica assim:

mount -o loop,offset=$[8192*512] /media/bkp/2016-03-18-raspbian-jessie.img /mnt

Agora você terá acesso ao conteúdo da primeira partição da imagem do Raspbian. Copie de lá o kernel* para, por exemplo, seu home, então desmonte a partição.

cp /mnt/kernel* ~/ && umount /mnt

Iniciar o boot com o QEmu

Agora é hora de experimentar. Se funcionar, segue-se para a próxima etapa, senão, detecte o erro e corrija-o.

 qemu-system-arm -kernel kernel7-jessie.img -m 512 -M raspi2 -sdl -serial stdio -hda 2016-03-18-raspbian-jessie.img -curses

Em detalhes e na ordem, o kernel7.img foi copiado de dentro da imagem, conforme mostrado anteriormente. O parâmetro '-m 512' reserva 512MB de memória e faz com que o sistema dê um boot bastante rápido. O Parâmetro '-M raspi2' é a escolha da máquina que se está emulando. Agora o parâmetro mais interessante: '-sdl'. Já explico.

O parâmetro '-serial stdio' manda a saída da tty para o terminal que se está executando esse comando. O parâmetro '-hda 2016...' é a imagem que forneceu o kernel para o boot e por fim, o parâmetro '-curses' desabilita a exibição da janela. Agora vamos à curiosidade.

Viu que foi utilizado o parâmetro '-sdl' e o parâmetro '-curses'? Pois bem, talvez você já conheça o parâmetro curses que habilita o suporte completo ao console gráfico. Em contrapartida, desabilita a janela gráfica. E talvez você se pergunte agora qual a razão de ter utilizado o parâmetro '-sdl' se a execução do sistema é em modo texto. A razão é simples; o sistema inicia o display manager de qualquer modo, portanto, para não obter erros no console, você deve disponibilizar uma saida gráfica para esse serviço, que agora rodará em background, em relação à sua interface principal, que passa a ser o console. Faça o login padrão, admire e faça o shutdown do sistema. Provavelmente, você terá que matar o processo após "System Halted".

Expandir a imagem do Raspbian

Expandir a imagem no dispositivo real é fćil, basta dar boot, logar, 'sudo su' e 'raspi-config', então enter na primeira opção. Agora, expandir o sistema fora do cartão de memória é outra história. A imagem tem 3.8G e no video de exemplo eu expandi mais 2G. Vamos ao processo, é simples mas com várias etapas.

1 - Faça uma cópia da imagem original

Fazer uma cópia da imagem original é fundamental, pois lhe dará a oportunidade de errar tantas vezes quanto necessário for. Como você pode ver no video, fiz uma cópia com o nome 'cobaia.img'. Claro que você pode dar o nome que quiser.

cp 2016-03-18-raspbian-jessie.img cobaia.img

Leva um tempo, então já dei um corte no video logo após o inicio da cópia.

2 - Faça o resize para o tamanho pretendido na imagem

Você pode escolher o tamanho que quiser, como se fosse qualquer Linux desktop, não se preocupe pois não há limitação. Eu expandi em apenas 2G para exemplificar, e se precisar de mais, expando novamente.

qemu-img resize cobaia.img +2G

Não espere nada de especial, além de um warning e uma mensagem bem na última linha confirmando o resize.

3 - Monte o dispositivo de loop para a imagem

Não dá pra manipular o arquivo raw diretamente, então você precisa fazê-lo através do dispositivo loop. Além disso, você precisará instalar o programa gparted para manipular a partição com mais tranquilidade, portanto, já o façamos:

apt-get install gparted

Agora os comandos do loop. Esse primeiro comando disponibiliza a imagem em algum dispositivo loop em /dev:

losetup -f cobaia.img

Agora devemos identificar o dispositivo loop relacionado à imagem:

02e.webp

4 - Faça o redimensionamento da partição

Agora que sabemos que o dispositivo relacionado à imagem cobaia.img é /dev/loop1, basta executar o programa gparted nesse dispositivo.

gparted /dev/loop1

03e.webp

Na interface do programa, clique sobre a partição 2 com o botão direito do mouse, então escolha 'resize' e dimensione para que ocupe todo o espaço livre no final da imagem. Feito isso, apenas clique na seta verde e a operação será aplicada imediatamente.

O bom de utilizar o gparted é que além de expandir a partição (isso está diretamente relacionado à tabela de partição) ele também expande o sistema de arquivos (ext4 precisa ser alocado no restante da imagem nesse ponto).

Tendo finalizado a tarefa (é bastante rápido), pode fechar o programa e liberar o dispositivo de loop:

losetup -d /dev/loop1

O shot anterior apresenta a imagem com a partição já redimensionada.

Agora é só fazer o boot e confirmar o tamanho após logar, com o comando 'df -h'.

qemu-system-arm -kernel kernel7-jessie.img -m 512 -M raspi2 -sdl -serial stdio -hda cobaia.img -curses

Acessar a raiz do sistema posteriormente

E se quiser acessar posteriormente a raiz do sistema para tirar algum programa compilado de lá (ou colocar algo dentro do sistema), basta montá-lo também com loop para poder manipular a raiz do sistema:

mount -o loop,offset=$[131072*512] cobaia.img

Por fim, quero deixar o lembrete que essa imagem se trata de um sistema compilado para a arquitetura ARM, portanto os binários de seu notebook/desktop não funcionam nele e vice-versa.

Espero que tenha gostado do artigo como eu gostei de escrevê-lo. Veja o video de 1:40 apenas para visualizar a sequência de comandos.

Inscreva-se no nosso canal Manual do Maker Brasil no YouTube.

Próximo post a caminho!

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.