Rodando projetos x86_64 no Mac M1 (arm64) com UTM
Tags: opensource, virtualization, arm64, macbook
Published: 2021-10-07 12:06:08

Desde que a Apple publicou sobre os novos Macs com o chip M1, houve um grande esforço para que vários aplicativos e programas pudessem rodar na nova arquitetura, que é arm64, diferente da tradicional arquitetura x86_64 dos processadores Intel, AMD e outros, tanto de empresas donas dos softwares proprietários, quanto de comunidades de projetos open source.

Muito deste ecossistema tem suporte nos Mac M1, porém, alguns projetos ainda apresentam problemas, como alguns projetos baseados em QEMU ou imagens de docker que ainda não tem suporte multi arquitetura, por exemplo.

Uma forma de poder contornar essa situação é justamente poder executar esses projetos como arquitetura x86_64, e é ai que a virtualização pode nos ajudar.

Para virtualização, iremos usar o UTM, que já escrevi sobre neste link, {% link joubertredrat/virtualizacao-nos-mac-m1-sim-com-utm-3l90 %}

Então, vou assumir que você já tenha o UTM instalado no seu Mac M1, então vamos lá.

Para este artigo, vamos usar o Ubuntu 20.04 server, então você pode fazer o download no site da Canonical, ou direto no link abaixo, porém, você pode usar a distro de sua preferência.

https://releases.ubuntu.com/20.04/ubuntu-20.04.3-live-server-amd64.iso

### Criando a máquina virtual

* Vamos criar nossa máquina virtual clicando no ícone "+" e depois em "Start from Scratch".

![Criando nova máquina virtual no UTM](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/um38vpl7s9gk3wy9ri28.png)

* Na aba "Information" você vai configurar o nome e o ícone da máquina virtual conforme desejar.

![Configurando informações da máquina virtual](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/35wdgyv3nidqcy5c1db7.png)

* Na aba "System" vem a parte importante, em "Architecture", selecione a opção "x86_64", a opção "System" logo abaixo será alterado automaticamente. Na opção "Memory" você vai selecionar a quantidade de memória que a máquina virtual deverá ter. O mínimo para conseguir rodar é 768Mb, porém, recomendo fortemente que coloque 1Gb ou mais.

![Configurando arquitetura e memória da máquina virtual](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3y6om1qq4zuv7mj3qy81.png)

* Na aba "Drives", você irá criar um disco rígido e uma unidade de CD/DVD. Eu recomendo fortemente criar um disco com pelo menos 30 Gb ou mais.

![Criação de disco rígido da máquina virtual](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z0cwt8rf9yi66v7tpt0w.png)
![Criação de unidade de CD/DVD da máquina virtual](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/35wpzvlnaxdcegdm2fk5.png)
![Disco rígido e unidade de CD/DVD da máquina virtual](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2ybeg00io3anqtjmz9tf.png)

* Na aba "Network", você irá criar um redirecionamento de portas, para que possamos acessar a máquina via SSH.

![Adicionando redirecionamento de portas da máquina virtual](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fj05chkj3dy5khazgprw.png)
![Redirecionamento de portas da máquina virtual](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x1x157v0gz7fchi49j9p.png)

Vale lembrar que você pode fazer redirecionamento de outras portas que desejar.

* Por fim, só clicar em "Save" e pronto, sua máquina virtual estará criada.

![Máquina virtual criada](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ntmurd97mqnx3a6trf6g.png)

* Na parte inferior das informações da máquina virtual existe um select na opção de CD/DVD, você irá selecionar a ISO da distro que você escolheu, o que no nosso caso, é o Ubuntu Server 20.04.

![Máquina virtual com a ISO da distro selecionada](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sbz9y1fpcl1z3m55rohd.png)

* Agora é só executar a máquina virtual e instalar a distro linux.

![Instalando linux na máquina virtual](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0x6s47glbp8onmi0xxpz.png)

### Testando a máquina virtual

Agora que você instalou sua máquina virtual, basta acessar ela por SSH e você verá que na máquina virtual, estará rodando um sistema x86_64, como na imagem abaixo.

![Terminal ssh na máquina virtual](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ow1bof85b0dcqygfidm1.png)

### Hora da prova de fogo

Para a o exemplo da prova de fogo estou usando o docker e o container de um projeto chamado Kafdrop, que basicamente é uma Web UI para Kafka feito em Java e que também merece uma estrela no GitHub, ~~mesmo que tenha sido feito em java haha~~ o repositório do projeto está abaixo. 

https://github.com/obsidiandynamics/kafdrop

Como o container deste projeto ainda não tem suporte a multi arquitetura, tentamos executar ele como se fosse `linux/amd64`, em outros projetos até funciona, mas neste não.

Como pode ser visto na imagem abaixo, no primeiro console ocorreu o erro `qemu: uncaught target signal 11 (Segmentation fault) - core dumped`, pois mesmo tentando forçar x86_64 na arch arm64, neste caso não funciona.

Porém, no segundo console o projeto executou normalmente, pois se trata de um container x86_64 rodando em uma distro x86_64.

![container executando no macOS e linux](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kq54vob71rwzulehep7u.png)

Ou seja, é perfeitamente possível executar projetos x86_64 mesmo estando com um Mac M1.

Então é isso pessoas, espero ter ajudado com este artigo e se tiverem mais dúvidas, fiquem a vontade para comentar por aqui mesmo ou me caçando em algum lugar da internet :)