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

CLB-Mariner aarch64 O 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 o rootfs, é 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 ou boot e edite os arquivos:

      • cmdline.txt: remova o argumento init=;

      • config.txt: adicione enable_uart=1 ao fim do arquivo (⚠️ opcional: se você for acessar o sistema da serial);

    • Formate a partição 2 ou rootfs:

      • mkfs -t ext4 /dev/<rootfs_part> (⚠️ tome cuidado, use o /dev/ correspondente a partição 2 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 o cbl-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 o sync 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 🥳💃👯👯‍♂️👯‍♀️🎊🎉🪅!

CBL-Mariner aarch64 O Jeito Difícil

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 o parted: 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 do root= para root=/dev/mmcblk0p2;

        • Editei o arquivo cmdline.txt. Temos também que remove o argumento init=;

        • Editei o arquivo config.txt. Adicionei o enable_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 o Microsoft.WSL_0.51.3.0_ARM64.msix;

      • Descompactei de dentro do Microsoft.WSL_0.51.3.0_ARM64.msix o arquivo system.vhd;

        • Montei o system.vhd no meu Linux, utilizando o libguestfs-tools, e fiz uma cópia do conteúdo para a partição 2 (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 um sync após esse comando (Linux gosta de um cache, mas de um tanto, que tu não sabe). O umount deve fazer isso para você "automaticamente", mas eu me sinto mais seguro rodando eu mesmo o sync ...

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 do chroot é ter um qemu-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 o rootfs 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".












Categories: HackLinux