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
- Debian/Ubuntu: o Universo apt
- RHEL/Fedora: o Mundo dnf e rpm
- Repositórios: sources.list, .repo e PPAs
- Chaves GPG: Verificar e Importar
- Snap: Pacotes Universais da Canonical
- Flatpak: Aplicações Sandboxed
- Erros Comuns na Gestão de Pacotes
- Checklist de Gestão de Pacotes
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:
- Confirmar origem — o repositório tem domínio oficial do vendor ou é um mirror desconhecido? Verificar o
baseurl/URIno ficheiro de repo. - Importar chave GPG por canal seguro — sempre via HTTPS, nunca HTTP. Validar a fingerprint publicada pelo vendor (ex.: na documentação oficial).
- Usar keyring dedicado — em Debian,
signed-by=/usr/share/keyrings/<vendor>.gpg; nunca importar paratrusted.gpgglobal. - Correr
update/check-updateantes de instalar — metadados desactualizados causam falhas silenciosas. - Rever o que vai ser instalado — em dnf,
dnf install --best --assumenolista o plano sem instalar; em apt, ler o prompt com atenção. - Verificar scripts pre/post-install para .rpm/.deb de terceiros —
rpm -qp --scripts pacote.rpmoudpkg-deb -e pacote.deb. - Snapshot / backup — antes de upgrades massivos (
full-upgradeou upgrade de release), ter VM snapshot ou backup testado. - 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). - Limpar cache depois —
apt cleanoudnf clean allliberta espaço em servidores pequenos. - 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:
- Dia 1: Terminal, Shell e Comandos Essenciais — base do terminal usado em todos os exemplos
- Dia 2: Sistema de Ficheiros Linux — FHS, Mounts e Links — onde vivem os ficheiros de configuração dos repositórios
- Dia 3: Gestão de Utilizadores e Grupos no Linux — permissões para instalar software exigem sudo
- Dia 4: Permissões Avançadas em Linux — ACLs, SUID e SGID — como os gestores de pacotes aplicam permissões a binários instalados
- Dia 5: Processos, Jobs e Sinais — reiniciar serviços após upgrades de pacotes
- Dia 7: Systemd — Services, Timers, Targets e Journalctl — gerir serviços instalados via pacotes
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.