Por que Arch Linux?


Eu uso o Arch Linux como sistema principal há pelo menos um ano. Antes dele, costumava usar o Debian.

O principal motivo inicial dessa escolha foi aprender melhor sobre o ambiente Linux, já que o Arch é uma distribuição minimalista e exige muito mais configurações manuais por parte do usuário.

Durante essa jornada, sofri um pouco para entender o básico necessário para gerenciar o sistema sem quebrar tudo a cada tentativa. Posso dizer com tranquilidade que já precisei reinstalar o Arch dezenas de vezes porque, sem saber exatamente o que estava fazendo, acabava corrompendo alguma coisa e não conseguia voltar atrás.

Mas esse também era o objetivo. Naquele momento, eu não queria um sistema inquebrável; queria desenvolver habilidade suficiente para gerenciar um sistema operacional construído por mim.

Por incrível que pareça, hoje o Arch parece o oposto dos outros sistemas, um sistema mais fácil de gerenciar, já que praticamente tudo que está ali eu deliberadamente pedi para estar ali.

Enquanto eu escolhi o Arch para aprender melhor sobre Linux, muitos entusiastas o adotam pela liberdade de montar e manter um sistema exatamente do jeito que querem. No fim, esse também acabou sendo o motivo de eu ter permanecido.

Automatizando a instalação do Arch


O Arch Linux é conhecido por ter uma das instalações mais manuais entre as distribuições Linux. Isso acaba tornando o processo mais difícil, já que exige mais pesquisa e conhecimento técnico para ser concluído com sucesso.

Como comentei na seção anterior, depois de muitas instalações esse processo começou a ficar mais natural.

Por muito tempo tive vontade de automatizar esse processo por dois motivos:

  1. Automação é legal (e produtiva). Ponto.
  2. Replicar meu ambiente de instalação de forma padronizada e consistente.

Recentemente, assinei o Claude Code, então essa acabou sendo a oportunidade perfeita para testá-lo e, ao mesmo tempo, colocar essa vontade em prática através de um script.

O que é esse script?

Disclaimer: o Arch Linux possui um instalador oficial chamado archinstall. Apesar do nome, ele não tem relação com este projeto. Ou seja, não se trata de um wrapper do archinstall oficial e não possui nenhuma relação com ele.

Um script de instalação, na prática, é apenas um programa que executa automaticamente uma sequência de comandos que normalmente seriam digitados manualmente pelo usuário. Bom, pelo menos era assim que eu enxergava um script Bash. Entretanto, a sintaxe se mostrou bem diferente das vezes em que instalei o Arch manualmente, já que um script precisa lidar com algumas operações que um usuário normalmente não precisa.

O que é instalado/configurado?

Um Arch Linux mínimo e funcional (kernel, GRUB, NetworkManager, sudo, git, vim/nano, base-devel) — opcionalmente com um desktop Cinnamon completo (Xorg + LightDM + gvfs + applet de rede) — já particionado, com usuário admin no grupo wheel, locale/timezone/teclado configurados, e drivers de microcódigo/guest da VM habilitados automaticamente conforme o hardware detectado.

Como baixar?

A forma mais comum é utilizar o git para clonar o repositório, mas o download também pode ser feito diretamente pelo GitHub.

Link do repositório: dotfiles

  • Via git: git clone https://github.com/xyz-leo/dotfiles
  • Via GitHub: acesse o link acima e faça o download do repositório em formato .zip.

Para este artigo, a única pasta que interessa é a archinstall. Todo o restante do repositório pode ser desconsiderado.

Fluxo do script


Sem mais delongas, agora é hora de entender como tudo é orquestrado. Vamos começar pelo panorama geral do que acontece.

Abaixo está o fluxo do script, desde sua execução até a finalização.

text
Live ISO (root)
 └─ archinstall.sh
      ├─ sanity checks: root / internet
      ├─ user input: instalação minimalista ou com ambiente desktop
      ├─ user input: modo de boot BIOS ou UEFI
      ├─ detecta disco, fabricante da CPU, virtualização
      ├─ pergunta senhas + input: atualizar keyrings? + exibe o plano + confirmação
      ├─ particiona (parted) → formata → monta
      ├─ (opcional) atualiza o archlinux-keyring
      ├─ pacstrap: base + microcode + desktop + pacotes de virtualização
      ├─ genfstab
      └─ arch-chroot /mnt → chroot-setup.sh
              ├─ fuso horário, locale, layout de teclado, hostname
              ├─ habilita o NetworkManager
              ├─ define senhas, cria usuário, configura o sudo
              ├─ grub-install + grub-mkconfig
              ├─ habilita LightDM/Cinnamon (se configurado)
              └─ habilita serviços de VM guest (se detectado)
 └─ desmonta → concluído, reinicie

Uso


Requisitos:

  • Ter dado boot pela ISO do Arch
  • Conexão de internet funcional na sessão live
  • O modo de boot (BIOS/UEFI) é perguntado em tempo de execução, não é detectado automaticamente — escolha 1 (UEFI) somente se esta sessão realmente deu boot em modo UEFI (/sys/firmware/efi/efivars precisa existir), caso contrário escolha 0 (BIOS). O script avisa, mas não interrompe a execução se você escolher UEFI sem o efivars presente.

Você nunca executa o chroot-setup.sh manualmente. O archinstall.sh copia esse arquivo (além do config.sh e um arquivo temporário de senhas) para o sistema recém-instalado e o executa via arch-chroot, apagando esses arquivos temporários assim que termina.

Dito isso:

  1. Coloque os três arquivos no ambiente live. Em bare metal, a forma mais simples é instalar o git (pacman -Sy git) e clonar meu repositório (git clone https://github.com/xyz-leo/dotfiles).
  2. Revise/edite o config.sh para a instalação.
  3. chmod +x archinstall.sh chroot-setup.sh
  4. ./archinstall.sh
  5. Responda as perguntas conforme aparecem:
    • Tipo de instalação: 0 para minimal (sem ambiente desktop), 1 para ambiente desktop (Cinnamon). O padrão é o que estiver definido em DESKTOP_ENV no config.sh.
    • Modo de boot: 0 para BIOS, 1 para UEFI (padrão). Escolha com base em como esta sessão realmente deu boot — UEFI apenas se /sys/firmware/efi/efivars existir.
    • Senhas de root e de usuário.
    • Atualizar keyrings?: o padrão é Não. Responda y apenas se uma execução anterior falhou com erro de assinatura de pacote — geralmente significa que a ISO está desatualizada e seu archlinux-keyring está obsoleto.
  6. Leia o plano exibido com atenção e digite yes para confirmar — isso apaga o disco de destino.
  7. Quando aparecer "All done", reinicie (reboot).

Todas as perguntas acima são puladas por completo se AUTO_CONFIRM=true estiver definido em config.sh — a instalação então roda de forma desassistida usando os valores do config.sh como estão (DESKTOP_ENV inalterado, keyring não atualizado, modo de boot padrão UEFI).

Principais opções do config.sh

Disco e partições

  • DISK — Vazio = detecta automaticamente se houver um único disco; caso contrário, você escolhe manualmente.
  • EFI_SIZE_MIB — Tamanho fixo da partição EFI System Partition.
  • SWAP_MODEauto (dimensionado a partir da RAM) ou fixed (usa SWAP_SIZE_MIB).
  • ROOT_FS — Sistema de arquivos raiz (atualmente somente ext4).

Identidade do sistema

  • HOSTNAME, USERNAME, USER_GROUPS — Identidade do sistema.
  • LOCALE_LANG / LOCALE_REGIONAL — Locale base vs. categorias regionais (hora/moeda/papel/etc).
  • TIMEZONE — Ex.: UTC.
  • KEYMAP_CONSOLE / KEYMAP_X11_LAYOUT / KEYMAP_X11_MODEL — Layout de teclado do TTY vs. layout de teclado gráfico (X11).

Instalação

  • DESKTOP_ENVcinnamon ou none (headless) — resposta padrão para o tipo de instalação.
  • AUTO_CONFIRMtrue pula todas as perguntas (tipo de instalação, modo de boot, atualização de keyring, confirmação) e roda desassistido, com padrão UEFI — use com cautela.

Considerações finais


Por muito tempo enfrentei a dificuldade de ter ambientes Arch diferentes entre si, seja no meu computador ou em uma VM, já que a cada instalação eu podia esquecer algum pacote ou configuração.

Hoje, esse problema praticamente deixou de existir. Em poucos minutos saio do ambiente live para um sistema completo, padronizado e de acordo com as minhas (ou suas) necessidades. Além de economizar tempo, o processo elimina boa parte dos erros humanos e torna o resultado previsível.

Depois de instalar e configurar meus dotfiles, este foi o resultado:

Próximo post


No próximo post, farei um breakdown completo do código deste script. Vai ser um post longo, técnico e bem denso.