O CBL-Mariner, a distro Linux da Microsoft, já está entre nós faz tempo. Você até tem a opção de baixar uma imagem ISO com o sistema para testar. Maaas, apenas para arquitetura x86-64
. E aí, como rodar o CBL-Mariner no Raspberry Pi? Será que roda?
Nesse artigo eu mostro primeiro o "jeito fácil" (para os ansiosos) e como eu cheguei no "jeito fácil" ...
⚠️ É bom alertar, como sempre, que o que estamos fazendo é para fins experimentais de testes e curiosidade, não para colocar o CBL-Mariner em produção!
Após minhas experiências, e um monte de falhas depois, vou deixar mastigado para vocês. Estou disponibilizando, no meu fork do Github, o arquivo rootfs
comprimido e já configurado do CBL-Mariner, se você quiser testar na sua Raspberry Pi: Release CBL 1.0-stable Core Custom rootfs
aarch64
· microhobby/CBL-Mariner (github.com)
⚠️ Esse arquivo apenas possui orootfs
, é necessário ainda o bootloader e o Kernel para rodar na sua Raspberry Pi.
Siga esses passos para ter o CBL-Mariner no seu Raspberry Pi:
-
Grave a imagem 64-bits do Raspberry Pi OS Lite em um SD Card;
-
Adicione o SD Card após gravado no computador:
-
Monte a partição
1
ouboot
e edite os arquivos:-
cmdline.txt
: remova o argumentoinit=
; -
config.txt
: adicioneenable_uart=1
ao fim do arquivo (⚠️ opcional: se você for acessar o sistema da serial);
-
-
Formate a partição
2
ourootfs
:mkfs -t ext4 /dev/<rootfs_part>
(⚠️ tome cuidado, use o/dev/
correspondente a partição2
do seu SD Card. O Linux vai enumerar diferente, dependendo se é um leitor de SD Card da placa mãe ou conversor USB);
-
Monte a partição
2
e descomprima ocbl-rootfs.tag.gz
para o local aonde está montando:tar -xvf cbl-rootfs.tar.gz -C /mnt/<sdcard_p2>
;
-
⚠️ Importante! Desmonte o SD Card antes de remover, isso garante que osync
rodou e os arquivos foram gravados com sucesso do cache para a memória do SD Card;
-
Com esses passos, você terá um SD Card com o CBL-Mariner pronto para boot no seu Raspberry Pi:
⚠️ O login default:login: root
Password: 1234
Como nosso custom CBL-Mariner não tem SystemD (os haters de SystemD vão a loucura 😅), nossa configuração inicial, como inicializar a ethernet, dhclient e sincronização de data, rodam do /etc/profile
. Então espere o WAIT FOR CONFIG ...
e o CONFIG DONE
serem mostrados, daí nosso CBL-Mariner está pronto para uso 🥳💃👯👯♂️👯♀️🎊🎉🪅!
Para rodar o CBL-Mariner na Raspberry Pi precisamos de uma versão do sistema para arquitetura arm
. Parece que há a possibilidade de fazer o build de uma imagem para aarch64
utilizando as configurações full-aarch64.json
ou core-efi-aarch64.json
do toolkit oriundo do Github microsoft/CBL-Mariner: Linux OS for Azure 1P services and edge appliances (github.com). Maaaaaas:
Compilar a imagem do source é sempre uma atividade que toma tempo e recursos, e pode causar várias exceções. Então optei por um atalho ...
⚠️ É bom alertar, como sempre, que o que estamos fazendo é para fins experimentais de testes e curiosidade, não para colocar o CBL-Mariner em produção!
Vamos fazer do "jeito MicroHobby" então (por incrível que pareça, esse é o atalho):
-
Gravei a imagem 64-bits do Raspberry Pi OS Lite em um SD Card;
-
Com o SD Card no Linux:s
-
Expandi a partição
2
utilizando oparted
:resizepart 2
; -
Formatei a partição:
mkfs -t ext4 /dev/sdb2
; -
Montei a partição
1
:-
Editei o arquivo
cmdline.txt
. Temos que editar o valor doroot=
pararoot=/dev/mmcblk0p2
; -
Editei o arquivo
cmdline.txt
. Temos também que remove o argumentoinit=
; -
Editei o arquivo
config.txt
. Adicionei oenable_uart=1
ao fim do arquivo. Vamos acessar o shell do CBL-Mariner através do serial;
-
-
-
-
Fiz download do arquivo
Msixbundle
do Windows Subsystem for Linux Preview-
Descompactei de dentro do
Msixbundle
oMicrosoft.WSL_0.51.3.0_ARM64.msix
;-
Descompactei de dentro do
Microsoft.WSL_0.51.3.0_ARM64.msix
o arquivosystem.vhd
;-
Montei o
system.vhd
no meu Linux, utilizando olibguestfs-tools
, e fiz uma cópia do conteúdo para a partição2
(tem que estar montada) do SD Card, aquela do Raspberry Pi OS que formatamos anteriormente;guestmount --add ./system.vhd --inspector --ro /home/castello/tmp/cbl-aarch/mount
-
cp -avr system/* /mnt/sdcard/rootfs
;⚠️ É bom rodar umsync
após esse comando (Linux gosta de um cache, mas de um tanto, que tu não sabe). Oumount
deve fazer isso para você "automaticamente", mas eu me sinto mais seguro rodando eu mesmo osync
...
-
-
-
-
Com esses passos já teremos um boot cru, mas bem cru mesmo, do CBL-Mariner:
E agora José? Qual é o usuário e senha para esse login? Na verdade por enquanto nossa imagem apenas tem o usuário root
, e mesmo assim ele não está configurado com senha. Temos que adicionar uma senha pra ele. Voltemos com o SD Card para o computador de desenvolvimento. Vamos executar um chroot
para configura o nosso ambiente:
⚠️ Outro passo importante antes dochroot
é ter umqemu-user-binfmt
configurado. Ou, no meu caso eu gosto de usar o,docker run --rm -it --privileged torizon/binfmt
(se você tiver o Docker instalado é um "mamão com açúcar"). Já que orootfs
que estamos trabalhando é de uma arquitetura diferente da do nosso computador de desenvolvimento.
-
Configura a senha com
passwd
; -
Editar o
/etc/resolv.conf
e adicionar as linhas:-
nameserver 8.8.8.8 nameserver 8.8.4.
-
-
Editar o
/etc/profile
e adicionar o seguinte antes do# End /etc/profile
:-
# microhobby echo "WAIT FOR CONFIG ..." # arch alias alias arch='uname -m' # mount the root as rw mount -o remount,rw / # eth0 up ip link set eth0 up dhclient # sync time date +"%d %b %Y %T %Z" -s "$(wget -qSO- --max-redirect=0 http://google.com 2>&1 | grep '^ Date:' | cut -d' ' -f 5-)" echo "CONFIG DONE!"
-
Pronto! Ufa, agora podemos fazer login no sistema sem problemas.
E foi assim que eu consegui o arquivo cbl-rootfs.tar.gz
para ser utilizado no "jeito fácil".