Lidando com upgrades de pacotes do FreeBSD usando o pkg_add

4

Eu estou tentando usar o comando pkg_add do FreeBSD para instalar e atualizar pacotes binários em um tipo de cenário de criar uma única vez em instalar em várias máquinas. Funciona bem ao instalar um novo pacote, mas as atualizações estão me desconcertando. Por exemplo, se eu quiser atualizar um pacote que dependa de por 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 eu passar -f para o comando pkg_delete :

# 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! Eu 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 graciosamente (em que "graciosamente" significa "de uma maneira que preserva as informações de dependência sem exigir que eu reconstrua / reinstale e toda a cadeia de dependências").

Obrigado!

    
por larsks 20.12.2010 / 22:32

3 respostas

4

Como você descobriu, pkg_add não pode atualizar as portas normalmente. O pacote portupgrade faz isso muito bem, e é o método que eu uso e recomendo (há outros disponíveis se você não gostar desse método).

Quando a porta estiver instalada, você pode simplesmente executar portupgrade -aPP e atualizará todas as portas instaladas no sistema usando pacotes. Se você não quiser atualizar a porta, poderá 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 (por exemplo, cd /usr/ports/security/openssl ; portupgrade atualizará openssl , sem a opção -PP que construirá a porta a partir da origem); e se você não estiver em um diretório de portas, ele mostrará a ajuda (igual à opção -h ).

Editar:
Por padrão, o portupgrade instalará pacotes se eles existirem no diretório definido pela variável PKG_PATH environmental (o padrão é $PACKAGES/All , $PACKAGES é padronizado como $PORTSDIR/packages ; portanto, 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 (recebe um URI com subpastas Latest e All ; nenhum valor padrão) ou $PACKAGEROOT (leva um URI com o caminho do espelho normal abaixo dele; o padrão é "ftp://ftp.freebsd.org" ).

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

  • Você pode criar pacotes a partir da árvore de portes com make package no diretório da porta (que também instalará a porta).
  • Você pode usar portupgrade para atualizar uma máquina e armazenar em cache os arquivos do pacote para uso em outras máquinas, os comandos mencionados anteriormente armazenarão em cache os arquivos de pacote no diretório padrão (veja acima).
  • Você pode usar o portupgrade para buscar somente os pacotes e não instalá-los, com portupgrade -aPPF ou portupgrade -RPPF [category/port] .

Depois de ter os arquivos do pacote em cache, você pode compartilhar o diretório via NFS, FTP, HTTP, etc; desde que os arquivos estejam acessíveis nas outras máquinas. Defina o PACKAGES ou PKG_SITE com os valores apropriados para apontar para o servidor de armazenamento em cache. Execute o comando típico portupgrade , ele deve extrair os pacotes do servidor de armazenamento em cache e instalá-los.

Nota: A árvore de portas precisa estar atualizada em todos os servidores para que portupgrade funcione corretamente (ela tentará atualizar para qualquer versão que esteja na árvore de ports locais). Se você vai ter as mesmas portas / pacotes instalados em todos os computadores, pode ser mais fácil compartilhar um diretório /usr/ports de servidores (digamos sobre NFS) e montá-lo em todos os outros servidores.

    
por 20.12.2010 / 22:40
2

Talvez pkg_replace seja o que você está procurando.

Estou usando isso 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_replace para instalar esses pacotes de pré-construção em todas as outras máquinas.

link

    
por 13.01.2011 / 16:08
0

Ou você pode confiar no Portsnap ou no CVSup, descritos aqui:

link

    
por 21.12.2010 / 00:09