Lidando com atualizações de pacotes do FreeBSD usando pkg_add

Lidando com atualizações de pacotes do FreeBSD usando pkg_add

Estou tentando usar pkg_addo comando do FreeBSD para instalar e atualizar pacotes binários em um cenário do tipo build-once-install-on-multiple-machines. Funciona bem ao instalar um novo pacote, mas as atualizações estão me deixando perplexo. Por exemplo, se eu quiser atualizar um pacote que estádependia depor outro pacote, não posso simplesmente instalá-lo:

# pkg_add /path/to/somepackage-2.0.tbz
pkg_add: package 'somepackage' or its older version already installed

Neste ponto, posso excluir a versão mais antiga do pacote se passar -fpara o pkg_deletecomando:

# pkg_delete -f somepackage-1.0
pkg_delete: package 'somepackage-1.0' is required by these other packages
and may not be deinstalled (but I'll delete it anyway):
anotherpackage-1.0

Mas... e este é o assassino... agora a informação de dependência desapareceu! Posso instalar a atualização:

# pkg_add /path/to/somepackage-2.0.tbz

E agora as tentativas de excluí-lo serão bem-sucedidas sem erros:

# pkg_delete somepackage-2.0

Como faço para lidar com isso normalmente (em que "graciosamente" significa "de uma forma que preserva as informações de dependência sem exigir que eu reconstrua/reinstale toda a cadeia de dependências").

Obrigado!

Responder1

Como você descobriu, pkg_addnão é possível atualizar as portas normalmente. O portupgradepacote faz isso muito bem e é o método que uso e recomendo (existem outros disponíveis se você não gostar desse método).

Depois que a porta estiver instalada, você pode simplesmente executá-la portupgrade -aPPe ela atualizará todas as portas instaladas no sistema usando pacotes. Se não quiser atualizar nenhuma porta, você pode executar portupgrade -RPP [category/port]para atualizar uma porta específica e as portas das quais ela depende. Executar o programa sem argumentos atualizará a porta pertencente ao diretório atual (ou seja, cd /usr/ports/security/openssl ; portupgradeatualizará openssl, sem a -PPopção de construir a porta a partir da fonte); e se você não estiver em um diretório de porta, ele exibirá ajuda (igual à -hopção).

Editar:
Por padrão, o portupgrade instalará pacotes se eles existirem no diretório definido pela PKG_PATHvariável ambiental (o padrão é $PACKAGES/All, $PACKAGESo padrão é $PORTSDIR/packages; então o caminho padrão é /usr/ports/packages/All).

Se eles não existirem lá, ele fará o download dos pacotes (por preferência) de $PKG_SITES(pega um URI com subpastas Lateste All; sem valor padrão) ou $PACKAGEROOT(pega um URI com o caminho de espelho normal; o padrão é "ftp://ftp.freebsd.org").

Uma maneira fácil de fazer isso é usar uma máquina para compilar/armazenar em cache pacotes que serão instalados em outra máquina.

  • Você pode construir pacotes a partir da árvore de ports make packageno diretório do port (que também instalará o port).
  • Você pode usar portupgradepara atualizar uma máquina e armazenar em cache os arquivos do pacote para uso em outras máquinas. Os comandos mencionados acima irão armazenar em cache os arquivos do pacote no diretório padrão (veja acima).
  • Você pode usar o portupgrade para buscar apenas os pacotes, e não instalá-los, com portupgrade -aPPFou portupgrade -RPPF [category/port].

Depois de armazenar os arquivos do pacote em cache, você poderá compartilhar o diretório via NFS, FTP, HTTP, etc; desde que os arquivos estejam acessíveis em outras máquinas. Configure PACKAGESou PKG_SITEcom os valores apropriados para apontar para o servidor de cache. Execute o portupgradecomando típico, ele deve extrair os pacotes do servidor de cache e instalá-los.

Nota: A árvore de portas deve estar atualizada em todos os servidores para portupgradefuncionar corretamente (ele tentará atualizar para qualquer versão que esteja na árvore de portas locais). Se você tiver as mesmas portas/pacotes instaladas em todos os computadores, pode ser mais fácil compartilhar um /usr/portsdiretório de servidores (digamos, por NFS) e montá-lo em todos os outros servidores.

Responder2

Talvez pkg_replaceseja o que você está procurando.

Estou usando para sair há algum tempo. Uma das minhas máquinas FreeBSD atua como servidor de compilação e constrói (usando portmaster) todos os pacotes para as outras máquinas. Estou usando pkg_replacepara instalar esses pacotes pré-construídos em todas as outras máquinas.

http://www.FreeBSD.org/cgi/url.cgi?ports/ports-mgmt/pkg_replace/pkg-descr

Responder3

Ou você pode contar com Portsnap ou CVSup, descritos aqui:

http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ports-using.html

informação relacionada