Rodando o macOS com Docker, qemu, e KVM

Neste artigo veremos como executar o macOS dentro do Linux usando virtualização com Docker, qemu e KVM. Muito indicado para programadores mobile que precisariam de um Macbook para publicar suas apps.

[ Hits: 3.179 ]

Por: Ruan em 20/07/2020


Introdução



Dica importante se você precisa do macOS para testar a sua aplicação, ou se você precisa criar uma build react native para o iOS mas não possui um Macbook. Ou ainda se você é curioso e nunca usou o sistema operacional da Apple.

Antes de tudo, precisamos instalar o Docker, o qemu, e o kvm na máquina.

Para o Ubuntu e derivados:
Quanto ao qemu e o kvm:

Arch Linux:

sudo pacman -S qemu libvirt dnsmasq virt-manager bridge-utils flex bison ebtables edk2-ovmf

Ubuntu/Debian:

sudo apt install qemu qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils virt-manager

CentOS/RHEL/Fedora:

sudo yum install libvirt qemu-kvm -y

Habilite os serviços necessários pelo systemd:

sudo systemctl enable libvirtd.service
sudo systemctl enable virtlogd.service

Adicione o seu usuário no grupo docker, libvirt-qemu, e qemu-kvm:

sudo usermod -a -G docker,kvm,libvirt-qemu $USER

Reinicie o sistema.

Com o docker instalado e funcionando, podemos criar um contêiner com o macOS com o seguinte comando:

docker run --name macos -e RAM=4 -p 50922:10022 --privileged -e "DISPLAY=${DISPLAY:-:0.0}" -v /tmp/.X11-unix:/tmp/.X11-unix sickcodes/docker-osx:latest

No parâmetro "-e RAM=4" é especificado a quantidade de RAM para a máquina virtual.

Após o download da imagem e a criação do contêiner através do comando acima, vai abrir uma janela com a tela de boot do macOS.

1. Selecione o macOS Base System.

2. Escolha o Disk Utility.

3. Selecione o maior disco qemu (aproximadamente 200GB) e escolha erase.

4. Feche o Disk Utility e selecione a opção "Reinstall macOS".

Aguarde um longo período até que o SO seja instalado.

No vídeo abaixo demonstro uma aplicação rodando com expo (react native) para iOS usando essa configuração:
Algumas observações:

  • A porta 50922 é utilizada para liberar o acesso SSH para o macOS. Ou seja, se preferir utilizar apenas o ecossistema Unix do macOS através do terminal do Linux, essa opção pode ser útil, visto que usar o macOS com teclado ABNT2 é complicado e sempre tem problema.

    Para acessar com SSH, é necessário habilitar o acesso remoto nas configurações de compartilhamento no macOS antes. Depois, basta usar o comando abaixo:

    ssh [email protected] -p 50922

    Onde "nomecompleto" é o seu username definido na instalação do macOS.
  • Se for utilizar o Xcode e o Simulator (emulador de iPhone), recomendo ter pelo menos 12GB de RAM. O macOS não permite rodar o Simulator com menos de 5GB de RAM.

Para mais detalhes, como alterar a quantidades de core, o tamanho do disco, entre outros, consulte o repositório do projeto:
   

Páginas do artigo
   1. Introdução
Outros artigos deste autor

Usando Docker para encapsular qualquer aplicação no GNU/Linux

Leitura recomendada

Solução para Ubuntu sem som

CentOS 5.8 - MySQL Cluster 7.1 + HAProxy

Cinco distribuições para iniciantes

Truques úteis de linha de comando Linux para iniciantes

APLINUX Server

  
Comentários
[1] Comentário enviado por fabio em 20/07/2020 - 09:15h

Muito bom! Em plena segunda-feira e já ganhei a semana. Precisava demais disso.

[2] Comentário enviado por leoberbert em 20/07/2020 - 09:30h

Muito maneiro! Favoritei :)

[3] Comentário enviado por ru4n em 20/07/2020 - 10:42h


[1] Comentário enviado por fabio em 20/07/2020 - 09:15h

Muito bom! Em plena segunda-feira e já ganhei a semana. Precisava demais disso.


Opa, ótimo ler isso!

Da para deixar mais "prático" ainda com o sshfs; montar a pasta do macOS virtualizado (como se fosse uma pasta qualquer no host) e abrir o vscode nessa pasta, assim vc desenvolve no linux e ao salvar roda refresh automatico no simulator! Estou fazendo dessa forma para finalizar um projeto em RN para iOS e roda sem problemas!

[4] Comentário enviado por mauricio123 em 20/07/2020 - 11:41h


Nossa, incrivel. Sempre tive curiosidade em testar o macOS.
___________________________________
Conhecimento não se Leva para o Túmulo.

[5] Comentário enviado por bilufe em 22/07/2020 - 10:55h

Na Snap Store tem o aplicativo Sosumi, o qual ele faz tudo sozinho. Ele cria a máquina virtual, baixa os arquivos necessários e põe pra funcionar.
E o melhor: roda em qualquer distribuição Linux que suporta Snaps, não mexe muito no sistema (snaps estão isolados), e é simples de remover.

https://snapcraft.io/sosumi

[6] Comentário enviado por ru4n em 22/07/2020 - 12:48h


[5] Comentário enviado por bilufe em 22/07/2020 - 10:55h

Na Snap Store tem o aplicativo Sosumi, o qual ele faz tudo sozinho. Ele cria a máquina virtual, baixa os arquivos necessários e põe pra funcionar.
E o melhor: roda em qualquer distribuição Linux que suporta Snaps, não mexe muito no sistema (snaps estão isolados), e é simples de remover.

https://snapcraft.io/sosumi


Legal, assisti no canal do Diolinux sobre o Sosumi. Porém o que me intrigou foi o tempo de instalação: 3h para instalar o macOS. Com essa solução em docker, levou foi +- 45 minutos.

Outro ponto, não sei ao certo se consigo acesso SSH pelo Sosumi. Sabe me dizer?

[7] Comentário enviado por mauricio123 em 22/07/2020 - 12:55h


3h? Então é melhor essa solução mesmo.

___________________________________
Conhecimento não se Leva para o Túmulo.

[8] Comentário enviado por fabio em 27/07/2020 - 17:05h

Aproveitando o embalo do artigo, conhece alguma imagem que execute o Windows no docker?

[9] Comentário enviado por ru4n em 27/07/2020 - 21:25h


[8] Comentário enviado por fabio em 27/07/2020 - 17:05h

Aproveitando o embalo do artigo, conhece alguma imagem que execute o Windows no docker?


Eu cheguei a pesquisar depois que escrevi o artigo, mas não achei nada... pelo menos para o meu uso, o VirtualBox + Windows da conta do recado, visto que tem os adicionais para integrar melhor o Windows com o host linux...

[10] Comentário enviado por RetroGamerCX em 14/09/2020 - 13:42h

docker run --name macos -e RAM=4 -p 50922:10022 --privileged -e "DISPLAY=${DISPLAY:-:0.0}" -v /tmp/.X11-unix:/tmp/.X11-unix sickcodes/docker-osx:latest
bash: docker: comando não encontrado
eu reinstalei o docker e mesmo assim não funciona, dá exatamente o mesmo erro, já até mesmo reinstalei todos os outros pacotes e nada funciona

[11] Comentário enviado por ru4n em 14/09/2020 - 13:59h


[10] Comentário enviado por RetroGamerCX em 14/09/2020 - 13:42h

docker run --name macos -e RAM=4 -p 50922:10022 --privileged -e "DISPLAY=${DISPLAY:-:0.0}" -v /tmp/.X11-unix:/tmp/.X11-unix sickcodes/docker-osx:latest
bash: docker: comando não encontrado
eu reinstalei o docker e mesmo assim não funciona, dá exatamente o mesmo erro, já até mesmo reinstalei todos os outros pacotes e nada funciona


Executou como usuário normal?

Verifique se o seu user está no grupo docker (comando: groups). Caso não esteja, adicione:
sudo gpasswd -a $USER docker

Se mesmo assim não rolar, siga as instruções de como instalar o docker na máquina (na página vc pode escolher outras distribuições):
https://docs.docker.com/engine/install/ubuntu/

[12] Comentário enviado por RetroGamerCX em 14/09/2020 - 15:20h


[11] Comentário enviado por ruankl em 14/09/2020 - 13:59h


[10] Comentário enviado por RetroGamerCX em 14/09/2020 - 13:42h

docker run --name macos -e RAM=4 -p 50922:10022 --privileged -e "DISPLAY=${DISPLAY:-:0.0}" -v /tmp/.X11-unix:/tmp/.X11-unix sickcodes/docker-osx:latest
bash: docker: comando não encontrado
eu reinstalei o docker e mesmo assim não funciona, dá exatamente o mesmo erro, já até mesmo reinstalei todos os outros pacotes e nada funciona


Executou como usuário normal?

Verifique se o seu user está no grupo docker (comando: groups). Caso não esteja, adicione:
sudo gpasswd -a $USER docker

Se mesmo assim não rolar, siga as instruções de como instalar o docker na máquina (na página vc pode escolher outras distribuições):
https://docs.docker.com/engine/install/ubuntu/


mesmo assim não funcionou, acho que é porque eu estou usando a versão sid do debian, aí aparece o erro:
e: the repository 'http://download.docker.com/linux/debian bullseye release' does not have a release file

[13] Comentário enviado por ru4n em 14/09/2020 - 15:49h

mesmo assim não funcionou, acho que é porque eu estou usando a versão sid do debian, aí aparece o erro:
e: the repository 'http://download.docker.com/linux/debian bullseye release' does not have a release file


Nesse caso, tenta usar o do buster mesmo:
echo 'deb [arch=amd64] https://download.docker.com/linux/debian buster stable' | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose

[14] Comentário enviado por RetroGamerCX em 14/09/2020 - 17:10h

eu quase consegui. o mouse é capturado, mas ele não funciona, ele não se mexe

[15] Comentário enviado por RetroGamerCX em 14/09/2020 - 18:09h


[14] Comentário enviado por RetroGamerCX em 14/09/2020 - 17:10h

eu quase consegui. o mouse é capturado, mas ele não funciona, ele não se mexe


agora quando a barra de progresso chega na metade, o sistema crasha

[16] Comentário enviado por RetroGamerCX em 14/09/2020 - 18:10h

não parece ser falta de ram, eu tenho 16gb de ram e a máquina está com 4gb de ram

[17] Comentário enviado por RetroGamerCX em 14/09/2020 - 19:03h

finalmente consegui, eu tive que colocar uns 10gb de ram para poder iniciar o sistema, ele começou a dar umas engasgadas porque a janela estava em 4k, e minha gpu não lida muito bem com a resolução 4k

[18] Comentário enviado por mauricio123 em 14/09/2020 - 20:35h


Aqui eu nem arrisquei agora, com esse driver sis ele nem vai rodar o menu de inicialização.

___________________________________________________________
[code]Conhecimento não se Leva para o Túmulo.
https://github.com/MauricioFerrari-NovaTrento [/code]

[19] Comentário enviado por ru4n em 14/09/2020 - 20:44h


[17] Comentário enviado por RetroGamerCX em 14/09/2020 - 19:03h

finalmente consegui, eu tive que colocar uns 10gb de ram para poder iniciar o sistema, ele começou a dar umas engasgadas porque a janela estava em 4k, e minha gpu não lida muito bem com a resolução 4k


Também tenho 16gb de ram, reservei 6gb para o contêiner e foi de boa. Em algumas ocasiões, pode rolar congelamento durante a instalação... ainda não sei o motivo, mas me parece ser o driver de vídeo genérico do qemu.



Contribuir com comentário