Tutorial: Configurando um ambiente de desenvolvimento com Lima
Os novos Macs com Apple Silicon (M1, M1 Pro, M1 Ultra, M2 e por aí vai) são ótimas máquinas, e talvez você goste bastante do macOS (bom, eu sou um fanboy do Manjaro que também tem um MacBook Air, e eu gosto bastante dele). Porém, esse novo ecossistema Mac/ARM pode ser frustrante se você precisar desenvolver para o bom e velho Linux/x86-64:
- Os Macs Intel podiam fazer dual-boot de macOS e Linux (e até mesmo Windows!). Os Mac Apple Silicon não conseguem;
- Ok, isso não é totalmente verdade porque a equipe do Asahi Linux têm trabalhado pesado para conseguir rodar o Linux nativamente no Apple Silicon. Porém, apesar do incrível progresso deles, ele ainda não está 100%, e é um Linux ARM;
- O VirtualBox para o Apple Silicon praticamente não existe até agora (quer dizer, tem um beta que não fazia quase nada e que desapareceu da página de downloads);
- O Parallels existe, mas você precisa pagar pra usar;
- Tem o QEMU. Não me entenda mal, o QEMU é excelente, mas ele pode ser bem chato de configurar e executar através da linha de comando (em comparação ao VirtualBox, por exemplo);
- Ainda existe o UTM, um front-end para o QEMU, mas ele não roda máquinas x86-64 e não é tão fácil instalar uma distro ARM nele.
Mas pera aí, não jogue fora seu belo Mac, ainda tem mais uma opção para você: o Lima. Ele é um wrapper para o QEMU que permite que você crie facilmente máquinas virtuais Linux ARM e x86-64.
Mas ele tem algumas desvantagens:
- É uma ferramenta de linha de comando, não tem uma interface gráfica;
- Você até pode rodar alguns apps com interface gráfica, mas a experiência não é das melhores;
- A interoperabilidade com o macOS é meio fraca.
Neste tutorial vou te mostrar como configurar uma instância de Linux x86-64 no
Lima, e como usar ela em seu ambiente de desenvolvimento. Note que você
precisará rodar comandos no Mac hospedeiro e no Linux convidado, então eu vou
representar seus prompts como mac$
e linux$
para deixar claro onde que você
deve rodar cada comando.
Instalando o Homebrew
Se você já tem o Homebrew instalado, você pode pular esta
seção. Mas se você não o tem, eu recomendo fortemente que você o instale, já que
ele é um gerenciador e instalador de pacotes para o Mac, assim como o
apt-get
/dpkg
é para o Debian/Ubuntu/Mint e o pacman
é para o Arch/Manjaro.
Você pode instalar o homebrew executando em seu terminal:
mac$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh")
Tome cuidado!
Não copie e cole nada em seu terminal a não ser que você confie na pessoa que disse para você fazer isso!
Se você não confia em mim então copie direto de https://brew.sh/ !
Instalando o Lima
Ok, tendo o Homebrew instalado, execute:
mac$ brew install lima
Você pode ver se a instalação deu certo executando:
mac$ limactl --version
Visão geral do Lima
Como eu disse antes, o Lima usa o QEMU por debaixo dos panos, e ele gerencia
máquinas virtuais (também chamadas de instâncias aqui). limactl
é o comando
que você usa para interagir com o Lima. Aqui estão alguns subcomandos do
limactl
(você pode ver mais deles rodando limactl --help
):
limactl list
: lista VMs;limactl create
: cria uma VM;limactl shell
: executa um shell em uma VM;limactl start
: inicia uma VM;limactl stop
: encerra uma VM.
Se você executar limactl list
você não vai ver nada por enquanto. Isso é
porque você não tem nenhuma instância, então você vai precisar criar uma com
limactl create
.
Depois de criar uma, você deverá inciá-la com limactl start
. Se você não
precisa mais ter ela em execução, você pode pará-la com limactl stop
(instâncias do Lima podem desperdiçar sua bateria…). Depois de iniciada, você
pode executar limactl shell
e isso vai iniciar um shell (provavelmente Bash)
em sua VM.
Note que apenas encerrar o shell não encerra a instância. Note também que essas são VMs com armazenamento persistente, você não irá perder seus arquivos e configurações depois de encerrá-las.
Criando uma instância x86-64
Por padrão, se você executar limactl create
em um Apple Silicon, o Lima vai
criar uma instância ARM. Então, você precisa especificar que você quer uma
instância x86-64 com --arch=x86-64
:
mac$ limactl create --arch=x86_64 template://debian
Como você deve suspeitar, estamos criando uma máquina virtual Debian, mas você pode escolher qualquer distro que você quiser (se suportar x86-64) se ela estiver nesta lista. Apenas se assegure que existe uma imagem x86-64 para ela! E você pode ter tanto instancias x86-64 quanto ARM!
Agora execute:
mac$ limactl list
Se tudo estiver ok você deverá ver sua nova instância debian
aqui!
Configurando o SSH para a sua instância
Como eu tinha dito antes, a interoperabilidade entre o hospedeiro Mac e as instâncias do Lima é… estranha. O lima pode ler os arquivos do Mac mas não pode escrever neles. Os hosts Mac não podem ler nem escrever instâncias do Lima (ok, tem uma exceção para isso mas ela não é recomendada).
Mas nós podemos configurar o SSH para ter uma interoperabilidade aqui. Execute:
mac$ limactl edit debian
Ele vai abrir um editor de texto (aquele que estiver configurado na variável de
ambiente EDITOR
, você pode trocá-lo pelo seu favorito como vim
, emacs
,
code
e por aí vai antes de executar isso).
Adicione isso ao fim do arquivo:
ssh:
localPort: 2022
Isso vai configurar a porta SSH padrão. Você pode configurar a porta SSH para a que você quiser.
Adicionando a VM como um host SSH no .ssh/ssh_config
Isso só é necessário se você está usando Visual Studio Code, mas eu recomendo fazer isso de qualquer jeito.
Adicione em seu ~/.config/ssh_config
as seguintes linhas:
Host lima-debian
HostName localhost
Port 2022
Isso vai identificar a VM para o SSH como lima-debian
. Mude a porta para
aquela que você escolheu no passo anterior.
Executando sua instância
Ok, vamos executar sua instância x86-64 pela primeira vez. Execute:
mac$ limactl start debian
Como essa é a primeira vez, isso pode levar alguns minutos para terminar. Se tudo foi ok, execute:
mac$ limactl shell debian
Isso vai abrir um shell (neste caso, o Bash) na sua instância. Se você não acredita que esse é um Linux x86-64, você pode ver isso assim:
linux$ uname -a
Terminando a configuração do SSH
O SSH vai permitir você acessar arquivos tanto do Linux convidado quanto do Mac hospedeiro. Para isso, você precisará de uma chave SSH configurada no seu Mac. Se você não tem, siga estas instruções para gerar uma.
Dica:
Considere usar o Secretive. Ele é um app open-source para o Mac que guarda a chave privada SSH no Secure Enclave, então ninguém (nem mesmo você) tem acesso a ela. Ela é protegida pelo sua senha de usuário ou Touch ID.
Mas claro, você consegue ver sua chave pública!
Copie a chave SSH armazenada em ~/.ssh/id_rsa.pub
no seu Mac. De volta à VM,
cole ela no fim do ~/.ssh/authorized_keys
. Isso autoriza o seu Mac para
acessar os arquivos da sua máquina virtual Linux através do SSH.
Acessando usando seu editor de texto
Visual Studio Code
Se você usa o Visual Studio Code, instale a extensão Remote - SSH.
Depois de instalá-la, você verá na sua esquerda um novo ícone, chamado “Remote
Explorer”. Clique nele, e você verá o lima-debian
como um remote. Passe o seu
mouse por cima, e vai aparecer uma seta. Clique nela, e ele irá se conectar à
sua VM.
Agora, você pode usar o VSCode com os arquivos dentro da VM da mesma forma como você usaria se estivesse trabalhando com ele no hospedeiro.
Emacs
Voc~e pode se conectar usando o TRAMP: use o atalho C-x C-f
da mesma forma que
você faria pra abrir um arquivo local, mas use isto como caminho:
/ssh:localhost#2022:<path>
Se você está usando outra porta que não seja a 2022, então substitua
ela. Substitua também <path>
pelo caminho do arquivo na VM que você quer abrir.
Se você adicionou lima-debian
para sua configuração do SSH, então você pode
usar como caminho:
/ssh:lima-debian:<path>
Vim
Apenas use o Vim dentro da sua VM :-)
Outros editores / IDEs
Se você está usando outros editores ou IDEs, você terá que procurar como o
desenvolvimento remoto funciona nele, e configurá-lo para usar o SSH com
localhost
como host e 2022 como porta (ou a porta que você escolheu).
Copiando arquivos
Agora que você já tem o SSH, você pode usar scp
para mover arquivos do
hospedeiro para o convidado e vice-versa. Ele funciona como o cp
mas ele pode
copiar arquivos entre computadores (neste caso, um físico e uma máquina
virtual).
Do hospedeiro para o convidado:
# troque 2022 pela porta que você escolheu
mac$ -P 2022 scp my_file localhost:destination
# ou, se você adicionou a instancia ao .ssh/ssh_config:
mac$ scp my_file lima-debian:destination
E do convidado para o hospedeiro:
# troque 2022 pela porta que você escolheu
mac$ scp -P 2022 localhost:my_file destination
# ou, se você adicionou a instancia ao .ssh/ssh_config:
mac$ scp lima-debian:my_file destination
Montando a VM do Lima no seu sistema de arquivos
Também é possível montar o Lima como um drive através do SSH de forma que você consegue de forma simples abrir arquivos da VM como se eles estivessem localizados na sua máquina hospedeira. Isso é possível com o SSHFS.
Mas tenha cuidado! Isso é baseado no MacFUSE, um port do FUSE para Mac. O FUSE é uma forma interessante de criar sistemas de arquivos falsos no Linux, mas o Mac não o suporta por padrão. Então, o MacFUSE é um kext (uma extensão de kernel) que habilita o FUSE no kernel do Mac. Para instalar você precisa desinstalar algumas proteções no Mac, então, siga com cuidado.
Você pode encontrar mais informação sobre como instalar e configurar o MacFUSE e o SSHFS aqui.
Uma vez instalado, crie um diretório vazio em algum lugar no seu sistema de
arquivos do seu Mac (estou usando~/sshfs/lima
). Seguindo a configuração de SSH
que temos até agora, você pode montar a raiz do Lima no seu sistema de arquivos
rodando:
mac$ sshfs lima-debian:/ <o diretório que você criou>
Leva alguns segundos para montar.
Você pode ler mais sobre o sshfs
rodando sshfs --help
. No meu setup, eu
monto a VM do Lima rodando sshfs lima-debian:/ ~/sshfs/lima
. Então, se eu
abro ~/sshfs/lima
eu consigo ver os arquivos da minha VM: