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.

HostArch Linux
Ferramentasarchiso
Formatox86_64
Tempo de build~50 min
Resultado~3 GB
Licença da ISOCC-BY-SA 4.0

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:

terminal
# 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:

  1. Instala o archiso se faltar e regenera iso/profile/ a partir do perfil releng instalado (compatível com a versão do mkarchiso).
  2. Aplica os metadados de iso/profiledef.sh (nome/label/versão = nlinux, publisher NLinux <https://nlinux.dev>).
  3. Anexa iso/packages.live à lista de pacotes do live e copia a camada iso/airootfs/ (autologin, auto-run, branding, serviços do live).
  4. Embute o projeto em /opt/noctalia-installer no live (install.sh, install/, config/, packages/, web/) e a Loja NLinux Software em /opt/nlinux-software, a partir da cópia publicada em nlinux-software/.
  5. Transforma o boot: systemd-boot (UEFI), GRUB (UEFI) e syslinux (BIOS), com títulos, itens e a splash do NLinux.
  6. Roda mkarchiso -v — que executa a camada iso/airootfs/root/customize_airootfs.sh no 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.

terminal · conferir o que está embarcado
# 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:

terminal · espelhar a loja manualmente (fallback)
# 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.

nlinux-iso-build
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.

#ArquivoO que faz
110-system.shFuso, 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
220-aur.shUsuá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
330-greetd.sh/etc/greetd/config.toml com o noctalia-greeter (sessão padrão umbriel)
440-user-config.shCopia config/.config → ~/.config e config/.local → ~/.local (ícones/cursor Bibata, logo do fastfetch), resolvendo templates .tpl com o layout do teclado
541-welcome.shMarca /etc/nlinux-installed e instala o nlinux-welcome (janela única no 1º login)
650-services.shHabilita 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

ListaConteúdo
packages/base.packagesKernel 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.packagesStack 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.packagesxdg-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.liveFerramentas 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:

terminal
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ávelPadrãoPara que serve
INSTALL_USER / INSTALL_USER_PASSnlinux / nlinuxNome e senha do usuário criado
ROOT_PASSnlinuxSenha do root (o padrão é a mesma do usuário)
LUKS_PASSnlinuxSenha de desbloqueio do disco
HOSTNAMEnlinuxNome da máquina
LOCALE / KEYMAP / ZONEINFOpt_BR.UTF-8 / br-abnt2 / America/Sao_PauloIdioma, teclado e fuso do sistema
MIRROR(vazio = automático)URL base do espelho de repositórios
OFFLINE11 = rápida (offline), 0 = completa (online)
INSTALL_DISK (DISK)(escolhido no menu)Disco de destino
INSTALL_MODEwipewipe 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)
MICROCODEdetectadointel-ucode / amd-ucode
NLLANGptIdioma 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.