Há muitos anos, surgiu um sistema operacional que modificou a forma de usar Linux, e graças a ele o Linux se popularizou muito, porque a partir de então foi possível fazer boot sem instalar nada no HD. O Sistema se chamava Knoppix e utilizava os sistemas cloop e squashfs para alocar o sistema operacional na memória RAM e extender o acesso aos aplicativos que estavam no CD. O que aconteceu a partir daí foram variações desse sistema, nada mais foi novo por muito tempo, mas uma das remasterizações fez bastante sucesso, o saudoso Kurumin, que era uma remasterização do Knoppix com alguns scripts adicionados para cumprir tarefas que os usuários de Windows não teriam a habilidade necessária para fazê-las devido às diferenças dos sistemas operacionais. Bem, hoje temos outras arquiteturas que nos são acessíveis, além da iX86 e AMD64. Além dos MIPS (utilizados principalmente em roteadores WiFi), temos os ARM como o Raspberry, e a construção do sistema é bastante diferente. E mais uma vez, temos uma peça importante na remasterização do sistema, que é um script criado pelo Leonardo Lontra (o mesmo que escreve patches para a mainline do OpenCV), onde com 3 comandos você reconstrói sua própria imagem a partir de uma imagem do Raspbian.
Pré-requisitos
Primeiro de tudo, você tem que estar em um sistema Linux nativo (preferencialmente baseado em Debian ou ele próprio). Se for usuário de Windows, pode tentar fazê-lo em uma máquina virtual, mas não recomendo.
Além de um sistema Linux nativo, será necessário instalar alguns pacotes previamente:
sudo apt-get update sudo apt-get install qemu qemu-user-static binfmt-support rsync kpartx git
Download do script
Clone o repositório do projeto com o git:
git clone https://github.com/lhelontra/embedtool.git
Após feito, você terá o diretório embedtool contendo (entre outros) o script embedtool.sh. De permissão de execução ao script antes de iniciar sua utilização:
cd embedtool && chmod 700 *.sh
Download do Raspbian
Vá até o site do Raspberry através desse link e baixe o Raspbian Stretch Lite (ou se tiver uma versão mais atual quando você estiver lendo isso, baixe a mais atual). Poderia ser a versão Desktop, mas todo o processo será mais rápido para uma prova de conceito.
Depois de feito o download, já descomprima a imagem de sistema:

No meu sistema as coisas já estão um pouco diferentes, mas eu vou passar o comando do modo que você deverá digitar.
Passo 1 – Montagem do sistema de origem
Você tem 2 opções; uma delas é extrair o sistema a partir da imagem que fez download e a outra é extrair o sistema a partir de um SD que você está utilizando para, por exemplo, distribuir a suas personalizações em outros Raspberry Pi. A partir de agora, assume-se que já estamos como root. Para tal, digite:
sudo su
E entre com a senha.
Montagem a partir da imagem
Começando pela imagem previamente obtida, o comando deve ser:
~/embedtool/embedtool.sh -v -t rpi -m 2017-09-07-raspbian-stretch-lite.img /mnt/rpi/
Esse comando dará acesso ao conteúdo das partições existentes na imagem.



Montagem a partir do SD card
Se você pretende remasterizar um sistema já em uso, sem problemas. Apenas atente-se em desligar corretamente o sistema antes de desligar o Raspberry, então coloque o cartão de memória em seu computador e proceda da seguinte maneira (presupondo um dispositivo /dev/sdb):
~/embedtool/embedtool.sh -v -t rpi -m /dev/sdb /mnt/rpi/
O resultado é semelhante à montagem anterior, exceto por não conter as informações de offset porque o SD não é montado como um dispositivo loop, mas como um dispositivo normal.
Passo 2 – extrair o sistema
Agora que os dados do sistema estão disponíveis, é hora de copiar esse sistema para manipulação. O comando para isso é tão simples quanto os demais:
~/embedtool/embedtool.sh -v -t rpi --copy /dev/sdb sdcard
Isso criará um diretório chamado sdcard contendo todo o sistema, que agora estará pronto para ser modificado.



Outra opção é copiá-lo diretamente do dispositivo, substituindo aqui_mesmo por /dev/sdb.
Passo 3 – Personalizando o sistema
Para personalizar o sistema, o script faz chroot na raiz criada pela extração. O chroot significa “change root“, porque a sua raiz de sistema passará a ser o sistema alvo. Isto é, se resolver instalar algum pacote, poderá utilizar o apt-get tranquilamente, tudo será instalado em seu sistema que está sendo modificado, fora do sistema nativo. Mas certifique-se previamente de que executou o seguinte comando:
~/embedtool/embedtool.sh -v -t rpi -c sdcard



Como você pode notar na imagem acima, a primeira coisa que já dá pra ajustar é o locale. Se não sabe como ajustar o idioma do sistema, sugiro que leia esse outro artigo a respeito, deixe ele aberto em uma aba ao lado e continue a leitura aqui.
Estando com esse chroot, você pode fazer qualquer coisa que desejar e depois bastará gerar a imagem do sistema. Por exemplo, se você quiser trocar o logotipo do kernel, pode seguir esse outro tutorial que escrevi a respeito. Se desejar compilar seu próprio kernel, tem esse tutorial aqui, inclusive com outros métodos para essa compilação.
Passo 4 – Gerar uma nova imagem de sistema
Tendo concluído as modificações, devemos gerar uma nova imagem para gravar no SD card. Para isso, simplesmente saímos do chroot (usando Ctrl+D) e executamos o comando:
~/embedtool/embedtool.sh -v -t rpi -bimg rpi_img rpi_image.img
A saída do chroot e esse comando acima devem gerar essa verbosidade:



Passo 5 – Gravar o sistema no SD card
Acabou, agora basta fazer o que seria feito na imagem original, gravando-a para o dispositivo de destino:
dd if=rpi_image.img of=/dev/sdb sync
A imagem original continua montada no sistema. Como ela não é mais necessária, basta desmontá-la:
~/embedtool/embedtool.sh -v -t rpi -u aqui_mesmo
Troubleshooting
Um problema que você pode se deparar é com o boot apenas do kernel. Ou um pouco pior, nenhum boot. Se for o caso (até recomendo que veja isso antes de gerar uma nova imagem), certifique-se de que o cmdline.txt está apontando diretamente para o dispositivo invés de um UUID. Ele deve ficar desse modo:
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
No meu caso, como utilizei o SD card diretamente em um slot do meu ultrabook, o dispositivo é diferente (mmcblk0), mas se o seu dispositivo for /dev/sdb, apenas substitua por /dev/sdb1 e /dev/sdb2, respectivamente.
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!