💡 Transparência Técnica & Engenharia: Este projeto foi concebido e homologado pelo autor utilizando o Antigravity IDE e o modelo Gemini 3.8 Flash (plano gratuito da Google) em fluxo agêntico autônomo.
📋 Documento de Arquitetura Base: Todo o projeto foi planejado e executado com base no Plano de Implementação e Especificação Técnica. Esse arquivo contém todas as diretrizes de arquitetura em camadas, tratamento defensivo do PAM/Keyring, suporte a máquinas virtuais e decisões de projeto utilizadas pela IA para construir o instalador.
Consulte o Catálogo de Pacotes e Dependências para ver a listagem completa e detalhada de tudo o que é provisionado pelo sistema e as Diretrizes de Arquitetura e Boas Práticas para os padrões de engenharia e regras de programação defensiva adotadas.
Instalador modular, em camadas e automatizado para transformar uma instalação mínima do Fedora Everything Netinstall em uma workstation gráfica moderna com suporte à seleção exclusiva de Interface Gráfica (Desktop Shell) e Compositor Wayland:
- Interfaces Gráficas (Desktop Interfaces):
- iNiR Shell: Interface moderna baseada em Quickshell, C++/Qt e theming dinâmico Material You via COPR
errornointernet/quickshell(utiliza exclusivamente o compositor Niri). - Noctalia Shell: Interface gráfica desktop nativa em C++/Qt via pacote nativo Fedora (permite escolher entre o compositor Niri ou Umbriel).
- Dux Shell / DMS (Dux Labs): Interface gráfica e ambiente completo da Dux Labs (a antiga DankLinux/DankMaterialShell, renomeada no release 2.0) via COPR
avengemedia/danklinuxe o instalador oficial headlessinstall.duxlabs.dev(utiliza Niri, terminal Kitty,dms-greeter,danksearchedankcalendar).
- iNiR Shell: Interface moderna baseada em Quickshell, C++/Qt e theming dinâmico Material You via COPR
- Compositores Wayland de Alta Performance:
- Niri: Scrollable tiling Wayland compositor com rolagem horizontal contínua de colunas via COPR
yalter/niri. - Umbriel: Compositor Wayland dinâmico via Repositório Terra do Fyra Labs, com suporte à rolagem contínua de janelas (horizontal e vertical), além de múltiplos modos de exibição dinâmicos (Dwindle e Master).
- Niri: Scrollable tiling Wayland compositor com rolagem horizontal contínua de colunas via COPR
- Display Manager / Gerenciador de Login: SDDM nativo ou Greetd (
noctalia-greeter/dms-greeter) com integração e desbloqueio silencioso do PAM GNOME Keyring. - Emulador de Terminal & CLI: Kitty (acelerado por GPU) +
fastfetch(resumo de hardware). - Compatibilidade X11:
xwayland-satellite(rootless isolado). - Navegador Web: Brave Origin (sem telemetria, IA ou criptomoedas).
- Loja de Apps: GNOME Software (Loja gráfica nativa com integração ao Flathub e atualizações de sistema).
- Reprodutor de Vídeo: Cine (
io.github.diegopvlk.Cinevia Flatpak). - Documentação Técnica: Consulte o Plano de Implementação e Especificação Técnica.
Amostras reais do visual de cada Desktop Shell (Fedora Linux 44), para você escolher com base no estilo de cada interface antes de instalar:
Usa exclusivamente o compositor Niri.
Central de configurações com a família de painéis iRiS ativa — barra superior, dock e theming dinâmico Material You:
Permite escolher entre os compositores Niri e Umbriel.
Painel de Acesso Rápido (Quick Access) com widgets de sistema, mídia, energia e rede — captura abaixo mostrando o Noctalia sobre o compositor Umbriel:
O projeto adota os princípios de Separação de Preocupações (SoC), Idempotência, Infraestrutura como Código (IaC) e Padrão Strategy para despachar submódulos de compositores e interfaces gráficas. Os pacotes de usuário (fontes, terminal Kitty e codecs) são instalados no Módulo 03, garantindo ambiente pronto antes de subir a stack visual:
fedora-multishell/
├── install.sh # Ponto de entrada: validações, menu interativo pt-BR e orquestrador
├── docs/
│ ├── PLANO_DE_IMPLEMENTAÇÃO_E_ESPECIFICAÇÃO_TÉCNICA.md # Especificação técnica completa
│ ├── CATALOGO_DE_PACOTES.md # Catálogo detalhado e mapeamento de dependências
│ ├── DIRETRIZES_DE_ARQUITETURA_E_BOAS_PRATICAS.md # Regras de engenharia e boas práticas
│ └── preview/ # Capturas de prévia visual das Desktop Shells (iNiR, Noctalia)
├── config/
│ ├── settings.conf # Variáveis globais, repositórios e flags padrão
│ ├── packages/ # Manifestos declarativos de pacotes (DNF / Flatpak)
│ │ ├── apps.conf # Aplicações universais de usuário (Kitty, Nautilus, Codecs)
│ │ ├── base.conf # Infraestrutura base do sistema (Hardware, Som, Rede, VM)
│ │ ├── brave.conf # Manifesto de instalação do navegador Brave Browser
│ │ ├── flatpak.conf # Lista declarativa de aplicativos Flatpak do Flathub (com overrides)
│ │ ├── greetd.conf # Daemons base do Display Manager Greetd
│ │ ├── inir.conf # Dependências, runtimes e shaders do iNiR / Iris / Quickshell
│ │ ├── mesa.conf # Pilha gráfica aberta Mesa (DRI/Vulkan/VA-API/PRIME)
│ │ ├── niri.conf # Pacotes do compositor Niri, xwayland-satellite e portais
│ │ ├── noctalia.conf # Pacotes nativos da interface Noctalia e Greeter
│ │ ├── nvidia.conf # Pilha proprietária de drivers e módulos NVIDIA (akmods)
│ │ ├── sddm.conf # Pacotes base do Display Manager SDDM
│ │ └── umbriel.conf # Pacotes do compositor Umbriel Nightly e portais
│ ├── desktop/ # Configurações declarativas de interface do usuário (~/.config)
│ │ ├── niri/
│ │ │ └── config.kdl # Configuração com atalhos 1:1 equivalentes em sintaxe KDL
│ │ └── umbriel/
│ │ ├── config.toml # Configuração personalizada (atalhos, mouse, teclas Fn)
│ │ └── noctalia.toml # Include opcional intencionalmente vazio para customizações locais
│ └── system/ # Modelos declarativos do sistema operacional (/etc)
│ ├── greetd.toml.template # Modelo de configuração do Greetd
│ ├── pam_greetd.template # Modelo de autenticação PAM para o Greetd
│ └── pam_sddm.template # Modelo de autenticação PAM para o SDDM
├── lib/
│ ├── ui.sh # Renderização ANSI: banner dinâmico (TARGET_FEDORA_VERSION), caixas temáticas e prompts validados (ui_ask_choice/ui_ask_yn)
│ ├── logger.sh # Registro em $XDG_STATE_HOME/fedora-multi-shell/install.log (fora de /tmp) e traps de erro
│ └── utils.sh # Validação de não-root, resolução segura via getent, install_packages_from_conf e cleanup do sudoers
└── modules/
├── 00_repos.sh # Repositórios (RPM Fusion, Brave, Flathub, COPRs condicionais, Terra e Dux Labs)
├── 01_system_hardware.sh # Firmware, microcódigo de CPU, PipeWire, som e energia (Tuned)
├── 02_gpu_drivers.sh # Drivers Mesa abertos (via mesa.conf) ou NVIDIA com akmods
├── 03_desktop_apps.sh # Camada de Usuário: Kitty, fontes, codecs, Brave Origin e Flatpaks
├── 04_display_stack.sh # Camada de Display Manager: SDDM ou Greetd (Noctalia/DMS) e integração PAM Keyring
├── 05_compositor.sh # Roteador de Compositor (Padrão Strategy)
├── 06_desktop_interface.sh # Roteador de Interface Gráfica (Padrão Strategy)
├── 07_post_install.sh # Autostart/config da interface, VM flags, ativação DM e validações
├── compositors/
│ ├── niri.sh # Niri (alacritty filtrado por nome), remoção defensiva, xwayland-satellite e portais
│ └── umbriel.sh # Umbriel Nightly, xwayland-satellite e portais Umbriel/GTK
└── interfaces/
├── inir.sh # Deno (sha256/arquitetura), clone e ./setup install -y sob o usuário real
├── noctalia.sh # Pacote nativo 'noctalia' e 'noctalia-greeter' via DNF
└── duxshell.sh # Instalador oficial headless do Dux Shell (DMS)
| Opção de Interface Gráfica | Compositor Wayland | Características Principais |
|---|---|---|
| iNiR Shell | Niri (Fixo) | Estética moderna com cores dinâmicas Material You, widgets e rolagem horizontal de janelas contínua. |
| Noctalia Shell | Niri | Shell nativa em C++/Qt com painel clássico/moderno sobre o motor de rolagem horizontal contínua do Niri. |
| Noctalia Shell | Umbriel | Shell nativa em C++/Qt sobre Umbriel, compositor Wayland dinâmico com rolagem contínua de janelas (horizontal e vertical), além de múltiplos modos de janelas (Dwindle e Master). |
| Dux Shell (DMS) | Niri (Fixo) | Ambiente Dux Labs com painéis Material You, dms-greeter (Greetd), danksearch, dankcalendar e terminal Kitty fixado. |
- Baixe a imagem ISO do Fedora Everything no site oficial do Fedora.
- Na tela de Seleção de Programas (Software Selection) do instalador Anaconda:
- Selecione Minimal Install (Instalação Mínima).
- Crie o seu usuário comum e marque a opção para torná-lo administrador.
Após reiniciar no console TTY com seu usuário comum:
# 1. Instale o git para clonar o repositório
sudo dnf install -y git
# 2. Clone o instalador
git clone https://github.com/danieldemoura/fedora-multishell.git
cd fedora-multishell
# 3. Dê permissão de execução
chmod -R +x install.sh modules/
# 4. Inicie o instalador como USUÁRIO COMUM (NÃO execute com sudo!)
./install.shO instalador conta com um menu interativo sem poluição visual:
- Prompts numéricos utilizam a sintaxe direta:
Escolha uma opção:(pressionar Enter assume1). - Prompts booleanos adotam a convenção Unix de letra maiúscula para a opção padrão:
Deseja instalar os drivers proprietários da NVIDIA? [s/N]:(Enter assumeN).Deseja iniciar a instalação com estas definições? [S/n]:(Enter assumeS).Deseja reiniciar o sistema agora? [S/n]:(Enter assumeSe executa reinicialização imediata comsudo reboot).
| Decisão Arquitetural / Defensiva | Justificativa Técnica e Prevenção de Falhas |
|---|---|
Autorização do Noctalia Greeter (passwordless-sync) |
O diretório /var/lib/noctalia-greeter com posse de greetd:greetd e a execução de noctalia-greeter passwordless-sync enable autorizam formalmente via Polkit a sincronização bidirecional do papel de parede e temas do desktop com a tela de login sem exigir senha administrativa. |
| Desativação preventiva de GDM / LightDM / Greetd | Evita conflitos de display manager caso o script seja reexecutado ou utilizado sobre Fedora Workstation/Spins que contenham outros gerenciadores pré-instalados. Previne dois daemons disputando o mesmo dispositivo DRM/KMS. |
Execução de sudo -v antecipado em interfaces/inir.sh |
Em etapas anteriores demoradas (como o download de aplicativos e codecs no Módulo 03), o timestamp padrão do sudo pode expirar. Atualizar o timestamp explicitamente antes de acionar ./setup install -y impede que o instalador do iNiR trave esperando senha de administrador em background. |
Isolamento e verificação SHA-256 do download do Deno na Home (${REAL_HOME}) |
Em sistemas Fedora modernos, /tmp é montado como tmpfs em memória RAM. Em máquinas virtuais com 2GB-4GB de memória, arquivos temporários podem esgotar inodes/espaço (curl: (23) Failure writing output to destination). Utilizar a Home garante armazenamento persistente em disco. Além disso, a arquitetura do binário é detectada por uname -m e o pacote é confrontado com o checksum SHA-256 oficial da release antes de ser instalado em /usr/local/bin. |
| Instalação antecipada de aplicativos no Módulo 03 | Instalar Kitty, fontes Google Noto e codecs antes da configuração do compositor e da shell garante que todas as dependências visuais e ferramentas de terminal já estejam no disco antes de a interface gráfica ser compilada, configurada ou validada. |
Templates Declarativos vs /usr/share/doc |
A adoção de templates próprios na pasta do instalador elimina a dependência de arquivos de exemplo do sistema operacional (que sofrem com caminhos versionados no Fedora e causavam o erro de atalhos vazios not bound), garantindo que tanto o Niri quanto o Umbriel iniciem com mapeamento completo de atalhos, mouse e teclas Fn. |
| Injeção Dinâmica de Variáveis de VM vs Templates Limpos | Os arquivos em config/desktop/ são mantidos intencionalmente limpos e otimizados para Máquinas Físicas (Bare Metal). A injeção das variáveis de ambiente (LIBGL_ALWAYS_SOFTWARE=1, WLR_NO_HARDWARE_CURSORS=1 e hardware_cursor = false) ocorre em tempo de execução via 07_post_install.sh somente se IS_VM=true, protegida por guarda de idempotência (grep -qF). Isso previne que computadores reais com GPU dedicada tenham sua aceleração desativada, ao mesmo tempo em que blinda máquinas virtuais contra telas pretas e fechamentos inesperados (crashes) do QtQuick. |
| Isolamento de Templates por Shell | A cópia dos templates do Umbriel e Niri ocorre estritamente quando SELECTED_SHELL="noctalia", preservando a autonomia e configuração gerada pelo instalador nativo do iNiR quando este for o escolhido. |
| Autostart e VM Flags do iNiR no Niri | O instalador nativo do iNiR copia seus arquivos para ~/.config/quickshell/inir, mas não registra a inicialização automática. O Módulo 07 vincula a shell como serviço de usuário systemd (inir.service ligado a niri.service por wants link — caminho canônico upstream e pré-requisito das trocas de família de painéis em runtime, como o iRiS), pré-ativa a família iRiS no config operativo da shell (~/.config/illogical-impulse/config.json, caminho que o Directories.qml lê em runtime, semeado a partir do default instalado em ~/.config/inir/config.json e espelhado nele) e injeta o bloco environment de software rendering para VM no config.kdl. O spawn-at-startup "inir" "run" permanece apenas como contingência quando a unidade de usuário do Niri não existe, prevenindo tela cinza vazia após o login no SDDM. |
Exclusão e Remoção Defensiva do Alacritty (compositors/niri.sh) |
O pacote upstream do Niri pode trazer o Alacritty como dependência recomendada ou fraca. A exclusão nominal de alacritty (filtrado localmente antes do dnf, pois o dnf5 rejeita argumentos combinados com --exclude) aliada à remoção defensiva subsequente garante que apenas o Kitty permaneça como emulador de terminal oficial do sistema, sem quebrar as outras dependências normais e fracas do Niri. |
Autorização Administrativa Temporária no Sudoers (validada via visudo) |
A criação do drop-in /etc/sudoers.d/99-fedora-installer-temp com trap de autodestruição (EXIT HUP INT TERM) elimina o timeout de credenciais do sudo (5 minutos) durante etapas demoradas não-interativas. O fluxo é endurecido: a regra é montada em mktemp, validada com sudo visudo -cf antes de tocar /etc/sudoers, instalada com install -m 0440 e precedida da remoção de drop-in órfão de execuções anteriormente interrompidas, sem deixar resquícios NOPASSWD. |
Atalhos extraídos diretamente de
config/desktop/niri/config.kdl(Mod= Super).
| Atalho | Ação |
|---|---|
| Super + Return | Abre o Terminal GPU (kitty) |
| Super + Space | Abre o lançador de aplicativos (launcher do Noctalia) |
| Super + Q | Fecha a janela em foco |
| Super + H ou ← | Foca a coluna anterior (rolagem horizontal) |
| Super + → | Foca a coluna próxima |
| Super + J / K ou ↓ / ↑ | Foca a janela inferior / superior dentro da coluna |
| Super + Shift + ← / → | Move a coluna atual para a esquerda / direita |
| Super + Shift + ↑ / ↓ | Move a janela dentro da coluna |
| Super + L | Bloqueia a sessão (noctalia msg session lock) |
| Super + Esc | Encerra a sessão (logout) |
| Atalho | Ação |
|---|---|
| Super + Return | Abre o Terminal GPU (kitty) |
| Super + Q | Fecha a janela em foco |
| Super + Navegação de Janelas | Rolagem contínua bidirecional e comutação de layouts (Dwindle e Master) |
⚠️ Os atalhos do DMS são definidos pelos padrões upstream do Dux Shell e do Niri (instalados pelo instalador da Dux Labs), não por templates deste instalador. A tabela abaixo é ilustrativa — confira o painel/atalhos oficiais do DMS após a instalação.
| Atalho | Ação |
|---|---|
| Super + T | Abre o Terminal GPU (kitty) |
| Super + Q | Fecha a janela em foco |
| Super + Space / D | Lança o menu de aplicativos / busca (danksearch) |
| Super + H / L ou ← / → | Foca a coluna anterior / próxima no compositor Niri |
| Super + Shift + H / L | Move a coluna atual para a esquerda / direita |
| Controles DMS / Niri | Gestão de painéis, notificações e widgets integrados do Dux Shell |

