Questão Como instalar pacotes específicos do Ubuntu, com a versão exata?


Eu quero configurar uma nova máquina virtual com alguns pacotes especificados (nome e versão), que são fornecidos.

Por exemplo apache2 na versão 2.2.20-1ubuntu1 com todas as dependências. Mesmo se houver uma nova versão deste pacote nos servidores, este deve ser instalado.

A solução tem que funcionar / escalar com múltiplos (n) "setups". Outra máquina virtual pode precisar de uma versão mais antiga do apache2.

Atualmente conheço algumas possibilidades que instalam os pacotes exatos, mas não são tão bons assim:

  1. Copie todos os requerimentos *.deb para cada máquina virtual manualmente e digite: dpkg -i ... -> Poderia funcionar, mas é muito propenso a erros. (Scripts manuais etc.)
  2. Crie e use um novo repositório do Ubuntu para cada configuração. -> Não funciona porque eu precisaria de n repositórios.
  3. Configure a máquina uma vez e copie a VM / crie uma captura instantânea. -> Não funciona porque eu precisaria armazenar n VMs.

Meu problema pode ser rotulado como gerenciamento de patches, mas não quero atualizar meus pacotes para a versão atual. Meu objetivo é instalar pacotes antigos.


188
2018-01-01 20:39


origem




Respostas:


Você pode usar apt-get para instalar uma versão específica do pacote, desde que esteja em um arquivo que o apt saiba. De apt-get manpage:

Uma versão específica de um pacote pode ser selecionada para instalação seguindo o nome do pacote com um igual e a versão do pacote a ser selecionada. Isso fará com que essa versão seja localizada e selecionada para instalação. Alternativamente, uma distribuição específica pode ser selecionada seguindo o nome do pacote com uma barra e a versão da distribuição ou o nome do arquivo (estável, congelado, instável).

Por exemplo, você poderia fazer:

sudo apt-get install apache2=2.2.20-1ubuntu1

Note que você pode precisar fazer alguma resolução de dependência por conta própria nesse caso, mas se houver algum problema, o apt-get informará o que está causando isso. No meu sistema 11.10, eu precisaria fazer o seguinte para que isso funcionasse:

sudo apt-get install apache2=2.2.20-1ubuntu1 \
                     apache2.2-common=2.2.20-1ubuntu1 \
                     apache2.2-bin=2.2.20-1ubuntu1 \
                     apache2-mpm-worker=2.2.20-1ubuntu1

190
2018-01-01 20:57



como saber quais versões estão disponíveis? - Rodrigo Gurgel
@Rodrigo Gurgel, "aptitude versões apache2" - user169015
@ user169015 "version exists"! = "a versão está empacotada para o Ubuntu e disponível com apt" - Kyle Strand
Oi Kyle, eu não recebi o seu comentário, embora sim, o pacote pode ser instalado usando o apt também. Eu apenas continuo com o aptitude porque eu tenho usado isso por um longo tempo ... :) - user169015
@ user169015 Eu acho que você está perdendo o ponto do comentário de Kyle. Dê uma olhada na resposta de psusi abaixo. Aparentemente, os repositórios do APT do Ubuntu não continuam hospedando versões antigas de pacotes! Assim, ao contrário dos gerenciadores de pacotes em tempo de execução (pip, gem, maven, etc.), você não pode confiar nos repositórios do APT do Ubuntu se quiser reconstituir uma configuração antiga e válida. Fiquei surpreso e desapontado ao perceber isso sozinho. Talvez Arch lide com isso melhor? ( askubuntu.com/questions/728439/… ) - algal


Para verificar quais versões estão disponíveis, você pode verificar via:

sudo apt-cache madison ^apache2

Se não funcionar, considere correr sudo apt-get update antes de atualizar a lista de pacotes.

Em seguida, copie a versão ou use a seguinte sintaxe:

sudo apt-get install apache2=2.2\*

Para verificar qual versão você instalou, execute:

dpkg -l 'apache2*' | grep ^i

51
2018-04-01 12:44



Muito obrigado por apontar o =2.2\* opção como uma maneira de usar um caractere curinga para selecionar qualquer subversão disponível. Isso é o que eu queria saber, mas não sabia como perguntar :) - aexl
Ao listar as versões usando dpkg -l <packageName>, o número da versão é algumas vezes truncado. Para evitar isso, use COLUMNS=100 dpkg -l <packageName> - CJBS
Em Yakkety, o primeiro comando apenas me dá: N: Unable to locate package ^apache2 - Jesse Glick
@JesseGlick Run sudo apt-get update primeiro. Certifique-se de que você tenha as fontes corretas do Apt configuradas. - kenorb
N: Não é possível localizar o pacote ^ apache2 após $ sudo apt-get update, mas o sudo apt-get install apache2 = 2.2 * funciona para mim - Braian Mellor


Vou expandir as respostas anteriores com outros comandos úteis de versão no apt família. Para ver quais versões estão disponíveis, execute apt-cache policy:

# apt-cache policy apache2
apache2:
  Installed: (none)
  Candidate: 2.4.7-1ubuntu4.5
  Version table:
     2.4.10-1ubuntu1.1~ubuntu14.04.1 0
        100 http://us.archive.ubuntu.com/ubuntu/ trusty-backports/main amd64 Packages
     2.4.7-1ubuntu4.5 0
        500 http://security.ubuntu.com/ubuntu/ trusty-security/main amd64 Packages
     2.4.7-1ubuntu4 0
        500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages

Então, como mencionado em outro lugar, instale uma versão específica com apt-get:

# apt-get install apache2=2.4.7-1ubuntu4.5
...

Agora você pode ver qual versão você instalou executando apt-cache policy novamente:

# apt-cache policy apache2
apache2:
  Installed: 2.4.7-1ubuntu4.5
  Candidate: 2.4.7-1ubuntu4.5
  Version table:
     2.4.10-1ubuntu1.1~ubuntu14.04.1 0
        100 http://us.archive.ubuntu.com/ubuntu/ trusty-backports/main amd64 Packages
 *** 2.4.7-1ubuntu4.5 0
        500 http://security.ubuntu.com/ubuntu/ trusty-security/main amd64 Packages
        100 /var/lib/dpkg/status
     2.4.7-1ubuntu4 0
        500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages

Se você não quiser que novas versões sejam instaladas nas atualizações, fixe o pacote com apt-mark:

# apt-mark hold apache2
apache2 set on hold.

Digamos que uma nova versão do apache2 seja adicionada ao índice de pacotes e sua máquina esteja sincronizada com apt-get update. Você vai ver isso quando você correr na próxima apt-get upgrade:

# apt-get upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
  apache2
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

10
2017-07-15 17:25





Praticamente falando, isso não é possível porque as versões antigas não são mantidas no arquivo, então, a menos que você tenha uma cópia da versão antiga em algum lugar, não será possível instalá-la. Você deve estar se perguntando por que você deseja instalar uma versão mais antiga em primeiro lugar. Em uma versão estável, o principal motivo para uma nova versão ser lançada é corrigir uma vulnerabilidade de segurança e você não quer estar executando um servidor vulnerável, não é?


8
2018-01-02 00:33



Eu preciso disso para reproduzir cópias exatas de ambientes antigos para fins de desenvolvimento. É possível configurar um espelho que não exclua as versões antigas do pacote para acessar os pacotes necessários ou preciso configurar vários repositórios que só mantêm os diffs? - ayckoster
@psusi: Não é exatamente uma resposta justa, pode haver muitas razões. No meu caso, a versão mais nova pode realmente ter um bug e, para verificar novamente, é necessário que a versão mais antiga seja necessária. Apenas um exemplo. - Cookie
@nomen, não, é uma única distro que faz não use um modelo de lançamento. Grande cuidado é tomado para garantir que quando bugs críticos e vulnerabilidades de segurança são corrigidos na versão estável, que eles não causem regressões, mas se isso acontecer, em seguida, arquive um relatório de bug marcado com o lançamento de regressão e ele será corrigido ou rolado costas. - psusi
@nomen, se você quiser criar seus próprios significados para palavras, terá dificuldade em se comunicar com outras pessoas. Para todos os outros no mundo, não é isso que é uma versão de lançamento, e o lançamento é exatamente o oposto e, portanto, mutuamente exclusivo com o lançamento estável. E agora que penso nisso, a versão original enviada com o lançamento é realmente mantida no bolso -release, e as atualizações vão para o -updates ou -security pocket, por isso, enquanto você não pode voltar para uma atualização anterior, você pode voltar para a versão originalmente lançada. - psusi
@psusi: Aqui está outro para você. É necessário que o Unison seja sempre a mesma versão em todas as máquinas. Ainda em 13.10 é uma versão diferente do que em 12.04 LTS. Então agora o que? Quando chegar a uma pergunta como esta, receber uma resposta como por que você quer fazer isso é realmente incrivelmente inútil e uma perda de tempo para todos. - Cookie