Manual
do
Maker
.
com
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.
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.
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.
É 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.
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.
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.
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:
Dois desses valores são importantes, sendo o tamanho do setor e iní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
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 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.
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.
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.
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:
Agora que sabemos que o dispositivo relacionado à imagem cobaia.img é /dev/loop1, basta executar o programa gparted nesse dispositivo.
gparted /dev/loop1
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
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!
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.