Pkg
Table of Contents
PKG - Gerenciamento de pacotes do FreeBSD
O que é
O pkg é o atual gerenciador de pacotes do FreeBSD (a partir da versão 10.0 - lançado em 14/01/2014).
Ele veio como uma evolução do antigo pkg_add, pkg_delete, pkg_info e pkg_version, que lidava com pacotes binários .txz e não possuia um repositório com resolução de dependências.
Agora o novo pkg possui um repositório de pacotes com resolução automática das dependências, tornando fácil instalar, remover e gerenciar pacotes.
É facílimo de usar, uma vez que os comandos são bem sugestivos; seguro, pois utiliza assinaturas digitais para verificar a autenticidade e integridade dos pacotes; e rápido, uma vez que foi construído em linguagem C.
Em uma instalação padrão do FreeBSD, é instalado o Kernel e o Sistema Base (binários essenciais para o funcionamento do sistema).
Dessa forma, utilitários não essenciais (mas que costumam vir instalados por padrão em distribuições GNU/Linux) não vem instalados por padrão no FreeBSD (como por exemplo o nano e o sudo).
É necessário que esses pacotes sejam instalados separadamente utilizando o pkg.
Estrutura de diretórios
O FreeBSD cria uma separação na estrutura de diretórios entre os binários que vem no sistema base e dos binários de terceiros instalados no sistema via pkg.
Todos os binários de terceiros (ex: sudo, nano, vim) instalados pelo pkg ficam sempre dentro da estrutura de diretório /usr/local/
Diferente de distribuições GNU/Linux, onde dentro de /usr/bin/ ficam tanto binários da base do sistema quanto binários instalados posteriormente (misturando tudo), o FreeBSD mantém uma estrutura de diretórios mais limpa e organizada.
Por exemplo, após instalado o apache, os binários estarão localizados em /usr/local/sbin/ e os arquivos de configuração em /usr/local/etc/apache2/
Importante mencionar que os pacotes do FreeBSD são em sua maioria instalados da forma mais “pura” possível, sem muitas modificações.
Algo muito comum de acontecer com quem sai do GNU/Linux para o universo do FreeBSD, ao instalar o apache se perguntam:
- Mas cadê o /var/www/ ?
- Cadê o a2ensite e outros utilitários do apache?
Como dito no começo, tudo que é instalado fora do Sistema Base via pkg, fica dentro da estrutura /usr/local/, então vocês encontrarão o diretório www dentro de /usr/local/www/apache24/
Também, o a2ensite e outros utilitários para gerencimento de sites e arquivos de configuração não existe originalmente no apache! Ele é um utilitário criado para algumas distribuições GNU/Linux (geralmente baseado em Debian) para facilitar o gerenciamento do webserver, mas não faz parte do apache.
Diferentemente de distribuições GNU/Linux baseadas em Debian, os pacotes são construídos da forma mais pura possível, sem modificações drásticas com relação ao software original.
Busca, Instalação, Atualização e Remoção de Pacotes
Para localizar um pacote no repositório, podem utilizar o parâmetro - search <nome_do_pacote>
pkg search neovim
Nesse caso, todos os pacotes que contenham o termo vim serão listados.
Em seguida, para instalar um pacote binário existente no repositório, podem utilizar o parâmetro - install <nome_do_pacote>
pkg install editors/vim
Observe que no repositório do FreeBSD, todo pacote é incluído dentro de uma categoria (ex: editors/ , graphics/ , databases/ ).
Mas não existe a obrigatoriedade de especificar a categoria do pacote (que é uma convenção), bastando para isso apenas informar o nome do pacote:
pkg install neovim
O pacote será instalado, assim como todas as dependencias dele.
A lista dos pacotes do repositório do FreeBSD pode ser atualizada rodando o comando:
pkg update
E a atualização das versões desatualizadas desses pacotes, rodando:
pkg upgrade
Para simular a lista de pacotes que serão atualizados (dry-run), pode-se executar:
pkg upgrade -n
Seria algo semelhante ao apt list –upgradable das distribuições baseadas em Debian.
Os pacotes podem ser excluídos utilizando o parâmetro - delete <nome_do_pacote> ou - remove <nome_do_pacote>
pkg remove editors/neovim
Vale mencionar que na instalação de um pacote, as dependências deste pacote também são instaladas.
Mas na remoção deste pacote, apenas o pacote em si é removido, não as dependências, deixando pacotes “soltos”.
Para que as dependências também sejam removidas, podem executar o comando:
pkg autoremove
A sintaxe lembra muito o gerenciador de pacotes apt do Debian.
Obter informações de um pacote
Para obter informações de um pacote instalado, podem utilizar o parâmetro - info <nome_do_pacote>
# pkg info editors/nano
nano-8.2
Name : nano
Version : 8.2
Installed on : Fri Dec 6 15:48:48 2024 UTC
Origin : editors/nano
Architecture : FreeBSD:14:amd64
Prefix : /usr/local
Categories : editors
Licenses : GPLv3
Maintainer : danilo@FreeBSD.org
WWW : https://www.nano-editor.org/
Flat size : 2.81MiB
Description :
nano is a small, free and friendly editor which aims to replace
Pico, the default editor included in the non-free Pine package.
Para obter a lista de todos os pacotes instalados no sistema, basta não informar o nome do pacote, e apenas digitar:
# pkg info
curl-8.11.1_1 Command line tool and library for transferring data with URLs
git-2.48.1 Distributed source code management tool
nano-8.2 Nano's ANOther editor, an enhanced free Pico clone
perl5-5.36.3_2 Practical Extraction and Report Language
pkg-2.0.5 Package manager
python311-3.11.11 Interpreted object-oriented programming language
sqlite3-3.46.1,1 SQL database engine in a C library
tmux-3.5a Terminal Multiplexer
vim-9.1.1043 Improved version of the vi editor (console flavor)
xxd-9.1.1043 Hexdump and reverse hexdump utility from vim distribution
Para obter a informação de todas as dependencias de um pacote, utilizar o subparâmetro -d <nome_do_pacote>:
pkg info -d editors/nano
nano-8.2:
indexinfo-0.3.1
gettext-runtime-0.23.1
Para verificar quais pacotes dependem de um pacote específico no sistema, utilizar o subparâmetro -r <nome_do_pacote>, muito útil quando se deseja verificar quem faz uso de determinado pacote, para fins de auditoria.
# pkg info -r databases/sqlite3
sqlite3-3.46.1,1:
php82-pdo_sqlite-8.2.27
php82-sqlite3-8.2.27
Para listar todo o conteúdo de um pacote e onde esse conteúdo foi instalado, pode-se utilizar o parâmetro - list <nome_do_pacote>
# pkg list editors/nano
/usr/local/bin/nano
/usr/local/bin/rnano
/usr/local/share/doc/nano/faq.html
/usr/local/share/doc/nano/nano.1.html
/usr/local/share/doc/nano/nano.html
...
Bloqueio de Pacotes
É comum ao gerenciar um servidor, que surja a necessidade de bloquear um pacote,
impedindo a atualização dele pelo pkg upgrade, seja para manter compatibilidade do sistema com aquela versão,
seja para não atualizar pacotes críticos em um ambiente de produção.
Para isso, pode-se bloquear a atualização de um pacote utilizando o parâmetro - lock
pkg lock www/apache24
Dessa forma o pacote apache24 não será atualizado ao rodar o comando pkg upgrade
Para voltar a desbloquear o pacote para posterior atualiação, utilize o parâmetro - unlock
pkg unlock www/apache24
Segurança e Auditoria
Branches (Ramificações)
O FreeBSD oferece duas ramificações para instalação e atualização de pacotes:
- Quarterly (padrão): Versão estável de pacotes, atualizado a cada 3 meses. Nessa ramificação, apenas bugs são corrigidos e atualizados no repositório, novas versões dos pacotes com novas funcionalidades não.
- Latest: Os pacotes são sempre atualizados com a versão mais recente. Note que em ambiente de produção, essa opção deve ser avaliada com cautela.
No FreeBSD, a definição se o repositório segue a ramificação Quarterly ou Latest fica em /etc/pkg/FreeBSD.conf:
FreeBSD: {
url: "pkg+https://pkg.FreeBSD.org/${ABI}/quarterly",
mirror_type: "srv",
signature_type: "fingerprints",
fingerprints: "/usr/share/keys/pkg",
enabled: yes
}
Caso queira alterar a ramificação, nunca se deve alterar os arquivos de configuração do sistema base.
Ao inves disso, deve-se replicar a alteração dentro de /usr/local/ , que é a estutura de diretórios reservada para isso, mantendo o Sistema Base intocável.
Assim, o arquivo /usr/local/etc/pkg/repos/FreeBSD.conf deve ser criado com o conteúdo que difere do original, alterando de quarterly para latest:
FreeBSD: {
url: "pkg+https://pkg.FreeBSD.org/${ABI}/latest",
mirror_type: "srv",
signature_type: "fingerprints",
fingerprints: "/usr/share/keys/pkg",
enabled: yes
}
Auditoria
O FreeBSD possui uma auditoria de segurança de pacotes que verifica se algum pacote instalado no sistema está vulnerável, se existe alguma falha de segurança publicada.
pkg audit -F
Se houver alguma vulnerabilidade de algum pacote instalado, ela será exibida com informações da vulnerabilidade e CVE, indicando que esse pacote deve ser atualizado imediatamente.
# pkg audit -F
curl-7.50 is vulnerable:
cURL -- buffer overflow
CVE: CVE-2016-9586
Integridade
É possível também verificar a integridade dos pacotes instalados no sistema com relação ao pacote original no momento da instalação.
Isso é importante para analisar casos em que um binário foi propositalmente alterado por um hacker ou agente malicioso.
# pkg check -s
Checking all packages: 96%
weechat-4.5.1: checksum mismatch for /usr/local/bin/weechat
Checking all packages: 100%
No caso acima, o binário weechat está diferente do binário original fornecido pelo pacote, e deve ser um sinal de alerta.
Muitos ataques do tipo APT (Ameaça Persistente Avançada) consiste em alterar binários do sistema,
para incluir um backdoor ou alguma forma para que o atacante tenha acesso permanente na máquina e possa entrar e sair despercebido.
Ou ataques em que binários comuns do sistema são alterados por agentes maliosos para mineração de criptomoedas.
Portanto essa checagem de integridade é importante, e vai garantir que todos os binários sejam aqueles originalmente instalados.
Base de Dados do PKG
O pkg constrói os pacotes, dependencias e demais informações em uma base de dados sqlite3. Isso permite que o pkg possa fazer a leitura dessa base de dados e apresentar de forma eficiente os dados. Quando se deseja fazer uma consulta mais granular, é possível consultar diretamente essa base dados, que fica localizado em /var/db/pkg/
Por exemplo, posso consultar a base de dados procurando por todos os pacotes instalados no meu sistema que dependem exclusivamente do pacote tiff:
# sqlite3 /var/db/pkg/local.sqlite
sqlite> select name from packages where id in (select package_id from deps where name='tiff') order by name;
libgd
webp
PORTS - O que é?
Muito se fala do famigerado PORTS do FreeBSD.
A coleção do ports é o sistema de compilação de pacotes do FreeBSD, semelhante ao portage do Gentoo GNU/Linux.
O ports permite instalar o software a partir do código fonte, e o mais importante, oferencendo opções de personalização que a instalação de binário (pkg) não permite.
O ports fornece uma árvore de diretórios (/usr/ports/) com a categoria e nome do pacote.
Se o FreeBSD foi instalado sem o ports, o ports pode ser instalado separadamente:
git clone --depth 1 https://git.FreeBSD.org/ports.git /usr/ports
O ports sempre considera a versão dos pacotes do topo (HEAD), ou seja, sempre a última versão disponibilizada pelo mantenedor.
No entanto ele precisa ser sempre atualizada antes da instalação ou atualização de algum pacote, para refletir a posição do HEAD:
git -C /usr/ports pull
Caso queiram utilizar a coleção ports na ramificação Quarterly (estável), pode-se fazer com:
git -C /usr/ports switch 2024Q1
Sendo o ano (2024) seguido pelo trimestre (Q1).
Para instalar um pacote pelo ports, basta entrar no diretório do ports, escolher a categoria, o pacote e em seguida executar make install clean
:
# cd /usr/ports/editors/vim
# make install clean
A instrução make install clean
irá baixar o código fonte direto do fornecedor original do software,
aplicar os patches específicos para o FreeBSD (se houver), instalar todas as dependencias (elas também serão compiladas!)
juntamente com o software do port em si.
Personalização do pacote
A vantagem na utilização do ports está nas opções de personalização das opções de compilação do pacote, onde é possível abrir uma interface para escolher suporte a opções específicas, como uso de certas bibliotecas; assim como também retirar suporte a bibliotecas que não há interesse em serem utilizadas.
Isso pode ser feito de diversas maneiras. Interativamente entrando dentro do port e invocando o comando:
make config
Ou de modo não interativo, listando as opções de compilação do pacote com make showconfig
:
# cd /usr/ports/irc/irssi/
# make showconfig
===> The following configuration options are available for irssi-1.4.5_1,2:
BOT=on: Bot support
CAPSICUM=on: Capsicum support
DOCS=on: Build and/or install documentation
OTR=off: OTR (off-the-record) support
PERL=on: Perl scripting language support
PROXY=on: Proxy support
UTF8PROC=off: utf8proc support
E desabilitando alguns suportes ou incluindo outros. Por exemplo, no port do IRSSI, posso habilitar suporte a criptografia OTR:
make OPTIONS_SET+=OTR install clean
Uma vez que o pacote é compilado e instalado no sistema, o mesmo passa a compor a base de dados do pkg.
Isso significa que todas as opções do pkg (como pkg version, pkg list, …) estarão disponíveis para esse pacote compilado e instalado via ports.
Importante mencionar isso, pois o ports não é um gerenciador de pacotes.
Ele é um sistema de compilação de um pacote a partir do código fonte, mas que após instalado pode ser gerenciado pelo pkg.
Pode misturar pacotes instalados via pkg e pacotes instalados via ports?
Pode, mas não é recomendado.
Pense em um pacote instalado via pkg junto com todas as dependencias. Se por um acaso for compilado e instalado um outro software pelo ports que use as mesmas dependencias, essas dependencias serão recompiladas para a última versão do pacote, e isso pode “quebrar o software”.
Então a recomendação é instalar todos os pacotes via pkg, ou instalar todo os pacotes via ports, exceto se você tiver plena certeza e ciencia do que estiver fazendo.
Lembre-se também que instalar pacotes via ports exige uma alta carga de processamento para a compilação.
Portanto em máquinas com poucos recursos, não é recomendável utilizar o ports.
E se você não precisa de uma instalação mais granular e personalizada do software, também não há necessidade de utilizar o ports.
Otimizações de compilação
É possível otimizar a compilação, orientando o sistema de compilação com informações úteis do hardware utilizado.
Entre elas por exemplo o número de núcleos do processador para compilação em paralelo, e modelo do processador para uma construção mais refinada e performática, otimizando as instruções para esse hardware.
Isso pode ser feito dentro do arquivo /etc/make.conf:
MAKE_JOBS_NUMBER=8 # número de núcleos
CPUTYPE?=haswell # otimização para processador Intel Haswell
Algo semelhante existe no Gentoo GNU/Linux (como as flags MAKEOPTS e -march).
Aliás, o Gentoo GNU/Linux criou o portage fortemente inspirado no Ports do FreeBSD!