Ambiente de compilação para RPi com Raspbian

Compilar em Raspbian (!)
Compilar em Raspbian (!)

QEmu e 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:

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 mais novo em http://wiki.qemu.org/Download

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

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

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

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:

Lista tabela de partições
Lista tabela de partições

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:

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.

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.

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.

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.

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:

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

Agora devemos identificar o dispositivo loop relacionado à imagem:

losetup -a
losetup -a

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
gparted

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:

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’.

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:

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 newsletter, alí em cima à direita e receba novos posts por email.

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Nossos grupos:

Arduino BR – https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR – https://www.facebook.com/groups/raspberrybr/
Orange Pi BR – https://www.facebook.com/groups/OrangePiBR/
Odroid BR – https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR – https://www.facebook.com/groups/SistemasEmbarcadosBR/
MIPS BR – https://www.facebook.com/groups/MIPSBR/
Do Bit ao Byte – https://www.facebook.com/groups/dobitaobyte/

Próximo post a caminho!

Agregador de Links - Loucuras da Net

Comments

comments

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.