Compilar a ISO do NLinux
Para quem quer compilar a distribuição ou modificá-la. Se você só quer instalar o NLinux, a documentação do usuário está em docs.html.
Quando usar esta página
Esta página é para quem quer compilar a distribuição ou modificá-la: montar a ISO do zero, entender como o sistema é construído, trocar a lista de pacotes ou ajustar o instalador. Não faz parte do caminho de quem só quer instalar o NLinux — para isso, veja a documentação do usuário.
O NLinux é uma distro rolling: não existe um "build oficial" com regras fixas, e o que você compila depende do estado dos repositórios no momento do build. Espera-se divergência entre duas máquinas. O que existe é um processo reproduzível, e é isso que está documentado aqui.
Requisitos do host: Arch Linux com git, archiso e qemu-desktop. O build roda makepkg e pacstrap em chroot, então precisa de root e de espaço para a imagem de trabalho. Não é preciso sudo em passo algum se você for root.
O repositório é Nilsonlinux/nlinux-iso-build. Correções e pull requests são bem-vindos.
Gerar a ISO
Tudo o que monta a ISO é aberto: o projeto Nilsonlinux/nlinux-iso-build reúne o build-iso.sh, a camada iso/airootfs/, o install.sh do instalador, a lista de pacotes do live e o make-splash.sh. Em uma máquina Arch Linux, dentro do projeto:
# pegando o projeto (precisa de git; o build usa sudo)
git clone https://github.com/Nilsonlinux/nlinux-iso-build.git
cd nlinux-iso-build
# gera iso/out/nlinux-<data>-x86_64.iso
./build-iso.sh
# regerar a arte do menu de boot BIOS (precisa de Python + Pillow)
./make-splash.sh
O que o build-iso.sh faz, em ordem:
- Instala o
archisose faltar e regeneraiso/profile/a partir do perfil releng instalado (compatível com a versão domkarchiso). - Aplica os metadados de
iso/profiledef.sh(nome/label/versão =nlinux, publisherNLinux <https://nlinux.dev>). - Anexa
iso/packages.liveà lista de pacotes do live e copia a camadaiso/airootfs/(autologin, auto-run, branding, serviços do live). - Embute o projeto em
/opt/noctalia-installerno live (install.sh,install/,config/,packages/,web/) e a Loja NLinux Software em/opt/nlinux-software, a partir da cópia publicada emnlinux-software/. - Transforma o boot: systemd-boot (UEFI), GRUB (UEFI) e syslinux (BIOS), com títulos, itens e a splash do NLinux.
- Roda
mkarchiso -v— que executa a camadaiso/airootfs/root/customize_airootfs.shno chroot do build (AUR, greetd, usuário do live, autologin) — e gera a ISO (~3,0 GB).
Atualizar a loja embutida na ISO
nlinux-software/ é a cópia do build publicado da loja (Nilsonlinux/nlinux-software) que o build-iso.sh embute em /opt/nlinux-software. O script não instala a loja: ele monta a imagem a partir do que está commitado na pasta, e por isso ela nunca pode ficar modificada sem commit — uma pasta editada faria a ISO usar uma loja diferente da que está no repositório.
Na maior parte das vezes não é preciso fazer isso à mão. Ao gerar a versão da loja, o passo 8 do build da curadoria (sync_iso_store) apaga, recopla e commita nlinux-software/ a partir do build recém-gerado, antes de publicar. Basta abrir a curadoria e clicar em “Gerar versão da loja”. Só a subpasta da loja entra no commit — se você estiver editando outras coisas do projeto da ISO, elas ficam pendentes e intactas.
# dentro de nlinux-iso-build
grep revision nlinux-software/catalog-head.json
git log -1 --oneline
O próprio build-iso.sh faz essa conferência antes de embutir a loja: ele compara a revisão do catalog-head.json embarcado com a publicação no GitHub. Se a publicada for maior, sai um aviso em amarelo dizendo que a imagem vai ficar com a loja velha. Sem curl ou sem rede, ele avisa e segue — a conferência nunca segura o build. Caso a curadoria falhe ao espelhar, o caminho manual continua valendo:
# dentro de nlinux-iso-build
rm -rf nlinux-software && mkdir nlinux-software
git clone --depth 1 https://github.com/Nilsonlinux/nlinux-software.git /tmp/loja
cp -a /tmp/loja/. nlinux-software/
rm -rf nlinux-software/.git nlinux-software/*.tar.gz nlinux-software/*.tar.gz.asc
# conferindo a revisão e a assinatura do pacote publicado
cat nlinux-software/catalog-head.json
gpg --verify nlinux-software/nlinux-software-v<N>.tar.gz.asc nlinux-software/nlinux-software-v<N>.tar.gz
A pasta é apagada antes de recoplar. É o que impede programas removidos do catálogo de continuarem embarcados na imagem por causa de um espelho parcial. A assinatura só pode ser conferida no repositório, porque o .tar.gz não existe dentro da pasta embute.
Desde a v117 o app não grava mais dentro do /opt: o catálogo e as mídias ficam em ~/.local/share/nlinux/store/apps e a árvore em /opt/nlinux-software é só a semente, somente-leitura. Por isso customize_airootfs.sh (live) e 40-user-config.sh (instalado) semeiam a pasta do usuário em vez de chown no /opt — a primeira abertura da loja já encontra tudo, sem esperar cópia.
Não rode dois builds ao mesmo tempo: o script roda em um namespace de mounts privado e desmonta mounts deixados por builds interrompidos antes de começar. A camada do live compila os pacotes AUR via yay em duas etapas (noctalia-greeter, xdg-desktop-portal-umbriel-git e xwayland-satellite-git primeiro; depois umbriel-git e whatsapp-linux-desktop-bin, que dependem do portal) — por isso o build é lento (Rust/cargo) e precisa de internet.
Depois de gerar, grave a ISO com dd ou balenaEtcher e valide na máquina de destino. Detalhes da release na página do NLinux.
Estrutura do projeto
Esse é o layout do repositório Nilsonlinux/nlinux-iso-build, com o README.md detalhando cada etapa.
build-iso.sh gera a ISO (sudo; limpa mounts de builds interrompidos)
make-splash.sh gera splash.png a partir de NLinux.jpg (menu BIOS)
install.sh instalador principal (web-installed; GUI_DRIVEN=1)
install/translations.py traduções do instalador (7 idiomas)
install/chroot/ etapas executadas dentro do chroot do sistema instalado
web/ servidor + UI do instalador web (server.py, static/)
packages/ listas de pacotes do sistema instalado
iso/packages.live pacotes extras do live (ISO)
iso/airootfs/ camada over do live (branding, auto-run, atalhos)
iso/profiledef.sh metadados da ISO (nome, label, versão)
config/ dotfiles aplicados ao usuário (live e instalado)
nlinux-software/ Loja NLinux Software embutida no live
NLinux.jpg / splash.png arte do menu de boot
Etapas do chroot
Roteiro da instalação: install.sh → install/chroot/all.sh → as etapas abaixo. No modo offline a etapa de AUR é pulada.
| # | Arquivo | O que faz |
|---|---|---|
| 1 | 10-system.sh | Fuso, locale, keymap, hostname/hosts, branding do os-release, pacman, pacman-key, initramfs (com sd-encrypt quando há LUKS), zram, usuários e senhas (shell fish), sudoers e systemd-boot com a entrada NLinux |
| 2 | 20-aur.sh | Usuário de sistema greeter; usuário temporário builder (sudo sem senha) para instalar o yay-bin e rodar yay -S dos pacotes AUR; remove o builder no final |
| 3 | 30-greetd.sh | /etc/greetd/config.toml com o noctalia-greeter (sessão padrão umbriel) |
| 4 | 40-user-config.sh | Copia config/.config → ~/.config e config/.local → ~/.local (ícones/cursor Bibata, logo do fastfetch), resolvendo templates .tpl com o layout do teclado |
| 5 | 41-welcome.sh | Marca /etc/nlinux-installed e instala o nlinux-welcome (janela única no 1º login) |
| 6 | 50-services.sh | Habilita NetworkManager, bluetooth, greetd, accounts-daemon e packagekit; adiciona o Flathub como remoto Flatpak do usuário; roda appstreamcli refresh --force (metadados AppStream para a loja e o App Center); escreve /etc/environment (Wayland + cursor Bibata-Modern-Ice) e liga o NTP com systemd-timesyncd |
Listas de pacotes
| Lista | Conteúdo |
|---|---|
| packages/base.packages | Kernel e firmware, rede (NetworkManager, bluez), áudio (PipeWire + WirePlumber), cryptsetup/lvm2, fontes, ferramentas de terminal (fzf, ripgrep, fd, eza, bat, starship, fastfetch, btop, htop) e pacman-contrib |
| packages/desktop.packages | Stack Noctalia (noctalia, greetd), kitty, fish, starship, fastfetch, apps (firefox, nautilus, discord, telegram, spotify-launcher, gnome-text-editor), swaylock/idle, wl-clipboard, grim/slurp, zram-generator, mpv/ffmpeg/imagemagick, jq/yq e as dependências da loja (python, python-gobject, webkit2gtk-4.1) |
| packages/aur.packages | xdg-desktop-portal-umbriel-git, umbriel-git, noctalia-greeter, xwayland-satellite-git (X11 no Umbriel) e whatsapp-linux-desktop-bin — via yay no chroot |
| iso/packages.live | Ferramentas do instalador (cryptsetup, gdisk, btrfs-progs, parted, python, webkit2gtk-4.1, efibootmgr, polkit), rede, bluetooth, áudio e os mesmos apps do desktop, para o live ser uma cópia fiel do sistema instalado |
As listas são arquivos de texto: um pacote por linha, comentários com #. No modo online o pacstrap usa base.packages + desktop.packages + os drivers da GPU escolhida + o microcódigo detectado.
Personalizar
Metadados da ISO
iso/profiledef.sh: nome, label, aplicação e versão.
Pacotes
Edite packages/ e iso/packages.live.
Dotfiles
config/: kitty, fish, starship, fastfetch, Umbriel e os cursores Bibata. Aplicados ao usuário do live e do sistema instalado.
Camada do live
iso/airootfs/: autologin, auto-run, branding e serviços (root/customize_airootfs.sh roda no chroot do build).
Etapas da instalação
install/chroot/*.sh — edite ou adicione etapas no all.sh.
Textos do instalador
install/translations.py é a fonte única dos textos do instalador web nos 7 idiomas. O web/server.py e o web/static/app.js só pedem as chaves (stage.*, web.*, tui.*, part.*) — para traduzir, edite só esse arquivo.
Arte do boot
Substitua NLinux.jpg e rode ./make-splash.sh (640×480, menu syslinux).
Arquivos com sufixo .tpl são templates: __KEYBOARD_LAYOUT__ é substituído pelo layout derivado do keymap escolhido (br-abnt2 → br, us → us…). O fish_variables não é versionado porque guarda caminhos específicos da máquina.
Variáveis do instalador
Para instalar sem passar pelo navegador, exporte as variáveis antes de rodar o install.sh:
sudo env INSTALL_USER=felipe INSTALL_USER_PASS=senha123 ROOT_PASS=senha123 \
INSTALL_DISK=/dev/nvme0n1 FS_TYPE=btrfs USE_LUKS=1 GPU=amd ./install.sh
| Variável | Padrão | Para que serve |
|---|---|---|
| INSTALL_USER / INSTALL_USER_PASS | nlinux / nlinux | Nome e senha do usuário criado |
| ROOT_PASS | nlinux | Senha do root (o padrão é a mesma do usuário) |
| LUKS_PASS | nlinux | Senha de desbloqueio do disco |
| HOSTNAME | nlinux | Nome da máquina |
| LOCALE / KEYMAP / ZONEINFO | pt_BR.UTF-8 / br-abnt2 / America/Sao_Paulo | Idioma, teclado e fuso do sistema |
| MIRROR | (vazio = automático) | URL base do espelho de repositórios |
| OFFLINE | 1 | 1 = rápida (offline), 0 = completa (online) |
| INSTALL_DISK (DISK) | (escolhido no menu) | Disco de destino |
| INSTALL_MODE | wipe | wipe apaga o disco; dual instala ao lado de outro sistema |
| DUAL_RESIZE_PARTITION / DUAL_RESIZE_BYTES | (vazio / 0) | Partição NTFS a reduzir e tamanho a liberar no dual boot |
| FS_TYPE | (escolhido no menu) | ext4 ou btrfs |
| USE_LUKS | (escolhido no menu) | 1 criptografa a raiz com LUKS2 |
| GPU | (escolhido no menu) | intel, amd, nvidia ou vm (genérico) |
| MICROCODE | detectado | intel-ucode / amd-ucode |
| NLLANG | pt | Idioma da interface do instalador (pt, en, es, fr, de, it, ja) |
Pré-checagens do instalador: exige root, UEFI e o pacstrap (isto é, rodar a partir do ambiente live do Arch). Sem rede aparente, ele avisa que o modo online pode falhar e sugere o rápido offline. Sem gdisk ou cryptsetup, instala o que falta no live.