Dia 6: Gestão de Pacotes em Linux — apt, dnf, Snap e Flatpak

No Dia 6 do curso Linux em 30 Dias entramos num dos pilares da administração de sistemas: a gestão de pacotes. Saber instalar, actualizar, pesquisar e remover software de forma controlada é a diferença entre um servidor estável e um sistema em que ninguém confia. Neste dia cobrimos as duas famílias de gestores tradicionais — apt (Debian/Ubuntu) e dnf (RHEL/Fedora) — os repositórios, as chaves GPG que lhes dão confiança, e os formatos universais modernos Snap e Flatpak.

O guia é distribuição-agnóstico: sempre que apt e dnf divergem, mostramos ambos lado a lado.

Neste artigo

O que é um Sistema de Gestão de Pacotes

Um pacote é um ficheiro comprimido que contém binários, bibliotecas, ficheiros de configuração, documentação e metadados (nome, versão, dependências, maintainers). Um sistema de gestão de pacotes resolve quatro problemas: distribuir software de forma reprodutível, resolver dependências automaticamente, garantir integridade via assinaturas criptográficas, e permitir actualizações incrementais seguras.

Em Linux existem duas grandes famílias tradicionais, mais dois formatos universais modernos:

Família Formato Gestor de alto nível Distribuições
Debian .deb apt (apt-get) Debian, Ubuntu, Mint, Pop!_OS
Red Hat .rpm dnf (antigo yum) RHEL, Fedora, CentOS Stream, Rocky, Alma
Universal .snap snapd Multi-distro (Canonical)
Universal .flatpak flatpak Multi-distro (independente)

ℹ Nota: Por baixo de apt está o dpkg, que instala um .deb individual sem resolver dependências. Por baixo de dnf está o rpm, com a mesma relação. O gestor de alto nível é que contacta repositórios e resolve dependências; o de baixo nível manipula o ficheiro local.

Debian/Ubuntu: o Universo apt

O apt é o frontend moderno do conjunto Debian (a documentação oficial está em manpages.debian.org — apt(8)). Substitui gradualmente o apt-get e o apt-cache para uso interactivo, embora apt-get continue recomendado em scripts (output estável).

Operações essenciais

# Actualizar lista de pacotes disponíveis (sempre antes de instalar)
sudo apt update

# Actualizar pacotes instalados (seguro, mantém dependências)
sudo apt upgrade

# Actualização completa — pode remover/instalar pacotes para resolver deps
sudo apt full-upgrade

# Instalar um pacote
sudo apt install nginx

# Instalar versão específica
sudo apt install nginx=1.24.0-1

# Remover pacote (mantém config)
sudo apt remove nginx

# Remover pacote E ficheiros de configuração
sudo apt purge nginx

# Remover dependências que ficaram órfãs
sudo apt autoremove --purge

# Pesquisar pacotes na cache
apt search webserver

# Mostrar detalhes de um pacote (versão, deps, tamanho)
apt show nginx

# Listar pacotes instalados
apt list --installed

# Ver que pacotes têm actualizações pendentes
apt list --upgradable

dpkg — o nível inferior

Quando tem um .deb manual (descarregado do site do vendor), usa-se o dpkg. Ele não resolve dependências — se faltar alguma, apt pode reparar depois:

# Instalar .deb local
sudo dpkg -i pacote_1.0_amd64.deb

# Se falhar por dependências em falta, reparar com apt
sudo apt install -f

# Listar ficheiros instalados por um pacote
dpkg -L nginx

# Ver a que pacote pertence um ficheiro
dpkg -S /usr/sbin/nginx

# Reconfigurar pacote (ex.: reexecutar postinst)
sudo dpkg-reconfigure postfix

RHEL/Fedora: o Mundo dnf e rpm

O dnf é o sucessor do yum (introduzido no Fedora 22, 2015) e é o gestor de alto nível da família Red Hat. Documentação oficial em dnf.readthedocs.io e docs.fedoraproject.org — dnf.

Operações essenciais

# Verificar e descarregar metadados dos repositórios
sudo dnf check-update

# Actualizar todos os pacotes
sudo dnf upgrade

# Instalar pacote
sudo dnf install httpd

# Instalar versão específica
sudo dnf install httpd-2.4.58

# Remover pacote (inclui dependências que não são usadas por outros)
sudo dnf remove httpd

# Pesquisar pacote por nome
dnf search nginx

# Mostrar detalhes de um pacote
dnf info httpd

# Listar pacotes instalados
dnf list --installed

# Listar actualizações disponíveis
dnf list --upgrades

# Ver a que pacote fornece um ficheiro/comando
dnf provides */htpasswd

# Histórico de transacções (auditável, permite undo)
sudo dnf history
sudo dnf history undo 12

# Limpar cache de metadados
sudo dnf clean all

ℹ Diferença vs apt: O dnf tem history com undo/redo transaccional — algo que o apt não tem nativamente. Em Debian, o equivalente aproximado é o apt-log ou ferramentas externas como o aptitude.

rpm — o nível inferior

O rpm manipula ficheiros .rpm individuais sem resolver dependências (docs: rpm(8) — man7.org). Não é para instalar software, é para inspecionar e auditar.

# Query: que pacote instalou /usr/sbin/httpd
rpm -qf /usr/sbin/httpd

# Listar ficheiros de um pacote instalado
rpm -ql httpd

# Info de pacote instalado
rpm -qi httpd

# Ver scripts de pre/post install de um .rpm (auditar antes de instalar)
rpm -qp --scripts pacote-1.0.x86_64.rpm

# Verificar integridade de ficheiros instalados (checksum, permissões)
rpm -V httpd

Repositórios: sources.list, .repo e PPAs

Os repositórios são servidores (HTTP/HTTPS) que fornecem pacotes e metadados assinados. A configuração difere entre famílias — ver wiki.debian.org — DebianRepository e a documentação Fedora.

Debian/Ubuntu — /etc/apt/sources.list e .sources

# Formato clássico (one-line) em /etc/apt/sources.list
deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
deb http://deb.debian.org/debian bookworm-updates main contrib
deb http://deb.debian.org/debian-security bookworm-security main contrib

# Formato deb822 (multi-line) em /etc/apt/sources.list.d/debian.sources
Types: deb
URIs: http://deb.debian.org/debian
Suites: bookworm bookworm-updates
Components: main contrib non-free
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

# Adicionar repositório de terceiros (ex.: HashiCorp)
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com bookworm main" \
  | sudo tee /etc/apt/sources.list.d/hashicorp.list

# PPA (apenas Ubuntu) — adiciona repo e importa chave automaticamente
sudo add-apt-repository ppa:ondrej/php
sudo apt update

RHEL/Fedora — ficheiros .repo

# /etc/yum.repos.d/hashicorp.repo
[hashicorp]
name=HashiCorp Stable - $basearch
baseurl=https://rpm.releases.hashicorp.com/RHEL/$releasever/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://rpm.releases.hashicorp.com/gpg

# Adicionar repo via dnf (cria o ficheiro .repo automaticamente)
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# Activar/desactivar repo pontualmente
sudo dnf --enablerepo=epel install htop
sudo dnf --disablerepo=updates check-update
Conceito apt (Debian) dnf (Red Hat)
Ficheiro de repo principal /etc/apt/sources.list /etc/yum.repos.d/*.repo
Repositório de terceiros /etc/apt/sources.list.d/*.list /etc/yum.repos.d/*.repo
Adicionar repo add-apt-repository / manual dnf config-manager --add-repo
Activar/desactivar repo Comentar linha em sources.list --enablerepo / enabled=0
Chaves GPG keyring em /usr/share/keyrings/ gpgkey= no .repo

Chaves GPG: Verificar e Importar

Cada repositório assina os seus metadados e pacotes com uma chave GPG. Sem a chave pública instalada, o gestor recusa-se a descarregar — é a primeira linha de defesa contra pacotes adulterados. Detalhes em wiki.debian.org — Secure Apt e na documentação do apt-key(8).

⚠ Aviso: O apt-key add está deprecated desde Debian 11. Importar chaves para o keyring global (/etc/apt/trusted.gpg) é inseguro porque a chave passa a ser confiada para todos os repositórios. Usar keyrings dedicados com signed-by=.

Debian/Ubuntu — keyring dedicado (método moderno)

# 1. Descarregar chave para keyring dedicado (formato .gpg binário)
curl -fsSL https://apt.hashicorp.com/gpg \
  | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg

# 2. Referenciar o keyring no ficheiro do repo com signed-by=
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" \
  | sudo tee /etc/apt/sources.list.d/hashicorp.list

# 3. Actualizar e verificar
sudo apt update
sudo apt install terraform

# Listar chaves confiadas
apt-key list   # legacy, mostra aviso de deprecation

# Remover chave antiga importada por engano
sudo rm /etc/apt/trusted.gpg.d/hashicorp.gpg

RHEL/Fedora — gpgkey no .repo

# Importar chave pública de um repo antes de instalar
sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

# Ver chaves importadas no keyring RPM
rpm -qa gpg-pubkey --qf '%{NAME}-%{VERSION}-%{RELEASE}\t%{SUMMARY}\n'

# No ficheiro .repo, indicar a chave via URL ou fingerprint
[elasticsearch]
name=Elasticsearch repository
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1

# Remover chave do keyring RPM (pelos 8 últimos hex da fingerprint)
sudo rpm -e gpg-pubkey-d88e42b4-52371eca

Snap: Pacotes Universais da Canonical

Snap é um formato de empacotamento universal desenvolvido pela Canonical. Um snap inclui o binário e todas as dependências necessárias (runtime incluído), funcionando em qualquer distro com o snapd instalado. Instalação em snapcraft.io/docs/installing-snapd.

# Instalar snapd (em Debian/Ubuntu)
sudo apt install snapd

# Pesquisar snaps
snap find code

# Instalar snap
sudo snap install code --classic

# Listar snaps instalados
snap list

# Actualizar todos os snaps
sudo snap refresh

# Actualizar um snap específico
sudo snap refresh code

# Voltar à versão anterior (rollback)
sudo snap revert code

# Remover snap
sudo snap remove code

# Ver serviços de um snap (snapd gerencia serviços via systemd)
snap services

ℹ Confinamento: Snaps correm em sandbox (strict por defeito). A flag --classic desactiva o sandbox e dá acesso total ao sistema — só usar para software de confiança (ex.: VS Code, Slack). Sem --classic a instalação falha para esses snaps.

Flatpak: Aplicações Sandboxed

Flatpak é a alternativa independente a Snap, mais adoptada em Fedora, elementary e outras distros não-Canonical. Foca-se em aplicações gráficas desktop com sandbox baseada em namespaces. Setup em flatpak.org/setup e docs em wiki.archlinux.org — Flatpak.

# Instalar flatpak (em Debian/Ubuntu)
sudo apt install flatpak
# Em Fedora já vem pré-instalado

# Adicionar repositório Flathub (principal fonte de apps)
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

# Pesquisar aplicações
flatpak search vlc

# Instalar aplicação do Flathub
flatpak install flathub org.videolan.VLC

# Listar flatpaks instalados
flatpak list

# Actualizar todas as aplicações
flatpak update

# Remover aplicação
flatpak uninstall org.videolan.VLC

# Ver permissões concedidas a uma app
flatpak info org.videolan.VLC

# Revogar/gerir permissões (ex.: acesso à rede)
flatpak override --user --unset=network org.videolan.VLC
Característica Snap Flatpak
Mantido por Canonical Comunidade independente
Foco Apps + serviços CLI Apps GUI desktop
Loja central Snap Store (Canonical) Flathub (multi-vendor)
Actualizações auto Sim (snapd refresh.timer) Manuais (ou via cron)
Sandboxing AppArmor + interfaces Namespaces + portals (Bubblewrap)

Erros Comuns na Gestão de Pacotes

Erro Causa Resolução
NO_PUBKEY ... Chave GPG do repo não está importada Importar via gpg --dearmor + signed-by=
E: Unmet dependencies Conflito de versões entre pacotes sudo apt --fix-broken install ou aptitude
GPG check FAILED (dnf) Chave do repo ausente ou expirada sudo rpm --import <url-chave> ou actualizar gpgkey= no .repo
dpkg: error processing archive Instalou .deb manual sem dependências sudo apt install -f para resolver deps em falta
The repository is no longer signed Chave GPG do repo expirou (ex.: antigo) Actualizar a chave oficial do maintainers OU remover o repo se descontinuado
Cannot retrieve metalink Repo offline ou DNS/network down Validar rede, dnf clean all e re-check-update
Error: Conflicting requests (dnf) Dois pacotes exigem versões incompatíveis do mesmo dep Inspecionar com dnf repoquery --requires e desactivar repo conflituoso

⚠ Nunca desactive GPG check globalmente (gpgcheck=0 ou --allow-unauthenticated) para contornar um erro de chave. É equivalente a desligar o UAC no Windows — o ataque de superfície explode. Importar a chave correcta é sempre a solução.

Checklist de Gestão de Pacotes

Antes de instalar qualquer software de terceiros num servidor de produção, verifique estes pontos:

  1. Confirmar origem — o repositório tem domínio oficial do vendor ou é um mirror desconhecido? Verificar o baseurl / URI no ficheiro de repo.
  2. Importar chave GPG por canal seguro — sempre via HTTPS, nunca HTTP. Validar a fingerprint publicada pelo vendor (ex.: na documentação oficial).
  3. Usar keyring dedicado — em Debian, signed-by=/usr/share/keyrings/<vendor>.gpg; nunca importar para trusted.gpg global.
  4. Correr update / check-update antes de instalar — metadados desactualizados causam falhas silenciosas.
  5. Rever o que vai ser instalado — em dnf, dnf install --best --assumeno lista o plano sem instalar; em apt, ler o prompt com atenção.
  6. Verificar scripts pre/post-install para .rpm/.deb de terceiros — rpm -qp --scripts pacote.rpm ou dpkg-deb -e pacote.deb.
  7. Snapshot / backup — antes de upgrades massivos (full-upgrade ou upgrade de release), ter VM snapshot ou backup testado.
  8. Registar a transacção — anotar o que foi instalado, quando, e porquê (runbook, ticket, ou dnf history / log do apt em /var/log/dpkg.log).
  9. Limpar cache depois — apt clean ou dnf clean all liberta espaço em servidores pequenos.
  10. Reiniciar serviços se necessário — ver Dia 5 sobre gestão de processos e sinais para systemctl restart.

Artigos Relacionados

Este artigo faz parte do curso Linux em 30 Dias. Para contextualizar, recomendamos os dias anteriores:

Conclusão

No Dia 6 cobrimos a fundação da administração de software em Linux: o apt das distribuições Debian/Ubuntu e o dnf das Red Hat/Fedora, os repositórios e a sua configuração, as chaves GPG que garantem autenticidade, e os formatos universais Snap e Flatpak para aplicações desktop sandboxed.

A regra de ouro: sempre que instalar software de terceiros, validar a chave GPG por HTTPS, usar keyring dedicado, e nunca desactivar a verificação de assinaturas. Um servidor comprometido por um pacote adulterado é um incidente evitável.

No Dia 7 entramos em systemd: serviços, targets, journalctl e a gestão de processos persistente. Continua o curso para dominar o Linux em 30 dias.