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

224

Desejo 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-1ubuntu1com todas as dependências. Mesmo se houver uma nova versão deste pacote nos servidores, esta deverá ser instalada.

A solução precisa funcionar / escalar com várias (n) "configurações". 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 boas assim:

  1. Copie *.debmanualmente todos os requisitos necessários para todas as máquinas virtuais e digite: dpkg -i... -> Pode funcionar, mas é propenso a erros. (Scripts manuais etc.)
  2. Crie e use um novo repositório 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 um instantâneo. -> 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.

ayckoster
fonte

Respostas:

227

Você pode usar apt-getpara instalar uma versão específica do pacote, desde que esteja em um arquivo que o apt saiba. Na página de apt-getmanual:

Uma versão específica de um pacote pode ser selecionada para instalação, seguindo o nome do pacote com igual e a versão do pacote a ser selecionada. Isso fará com que a versão seja localizada e selecionada para instalação. Como alternativa, 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 morto (estável, congelado, instável).

Por exemplo, você pode fazer:

sudo apt-get install apache2=2.2.20-1ubuntu1

Note que você pode precisar resolver algumas dependências por conta própria neste caso, mas se houver algum problema, o apt-get dirá 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
fader
fonte
46
como saber quais versões estão disponíveis?
Rodrigo Gurgel
12
@Rodrigo Gurgel, "
Aptitude Versions Apache2
3
@ user169015 "versão existe"! = "a versão está empacotada para Ubuntu e disponível com apt"
Kyle Strand
Oi Kyle, Eu não recebi seu comentário, embora sim, o pacote também pode ser instalado usando o apt. Eu só ficar com aptidão porque eu tenho usado isso por um longo tempo ... :)
user169015
6
@ user169015 Acho que você está perdendo o objetivo do comentário de Kyle. Veja a resposta da psusi abaixo. Aparentemente, os repositórios do Ubuntu APT não continuam hospedando versões antigas de pacotes! Portanto, diferentemente dos gerenciadores de pacotes de tempo de execução (pip, gem, maven, etc.), você não pode confiar nos repositórios do Ubuntu APT se quiser reconstituir uma configuração antiga e em bom estado. Fiquei surpreso e decepcionado ao perceber isso sozinho. Talvez Arch lide com isso melhor? ( askubuntu.com/questions/728439/… )
algal
66

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

sudo apt-cache madison ^apache2

Se não funcionar, considere executar sudo apt-get updateantes para 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
kenorb
fonte
5
Muito obrigado por apontar a =2.2\*opção como forma de usar um curinga para selecionar qualquer subversão disponível. Isso é o que eu queria saber, mas não sabia como pedir :)
aexl
3
Ao listar as versões usando dpkg -l <packageName>, o número da versão às vezes é truncado. Para evitar isso, use COLUMNS=100 dpkg -l <packageName>
CJBS
Em Yakkety, o primeiro comando só me dá:N: Unable to locate package ^apache2
Jesse Glick
@JesseGlick Corra sudo apt-get updateprimeiro. Verifique se você tem as fontes adequadas do Apt configuradas.
Kenorb
1
N: Não foi possível localizar pacote ^ apache2 após $ sudo apt-get update, mas sudo apt-get install apache2 = 2.2 * trabalha para mim
Braian Mellor
17

Expandirei as respostas anteriores com outros comandos úteis de controle de versão da aptfamí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

Em seguida, 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 instalou executando apt-cache policynovamente:

# 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 deseja que versões mais recentes 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 do pacote e sua máquina esteja sincronizada apt-get update. Você verá isso na próxima execução 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.
gsf
fonte
6

Na prática, isso não é possível porque as versões antigas não são mantidas no arquivo, portanto, a menos que você tenha uma cópia da versão antiga em algum lugar, não poderá instalá-la. Você deve se perguntar por que deseja instalar uma versão mais antiga. Em uma versão estável, o principal motivo para o lançamento de uma nova versão é corrigir uma vulnerabilidade de segurança e você não deseja executar um servidor vulnerável, não é?

psusi
fonte
25
Eu preciso disso para reproduzir cópias exatas de ambientes antigos para fins de desenvolvimento. É possível configurar um espelho que não exclua versões antigas de pacotes para acessar os pacotes necessários ou eu preciso configurar vários repositórios que contêm apenas diffs?
precisa saber é
19
@psusi: Não é exatamente uma resposta justa, pode haver muitas razões. No meu caso, a versão mais recente pode realmente ter um erro e, para verificar novamente, é necessário a versão mais antiga. Apenas um exemplo.
28414 Cookie
2
@nomen, não, é uma distribuição única que não usa um modelo de release. É preciso muito cuidado para garantir que, quando erros críticos e vulnerabilidades de segurança forem corrigidos na versão estável, eles não causem regressões, mas se isso acontecer, arquive um relatório de bug marcado com a versão de regressão e ela será corrigida ou revertida de volta.
Psp #
5
@nomen, se você quiser criar seus próprios significados para as palavras, terá dificuldade em se comunicar com os outros. Para todos os outros no mundo, não é isso que é uma versão sem interrupção, e a liberação sem interrupção é exatamente o oposto e, portanto, mutuamente exclusiva com a liberação estável. E agora que penso nisso, a versão original fornecida com o lançamento é realmente mantida no bolso -release, e as atualizações vão para o bolso -updates ou -security, portanto, enquanto você não pode voltar para uma atualização anterior, você pode voltar para a versão originalmente lançada.
psusi
5
@psusi: Aqui está outro para você. É necessário que o Unison seja sempre a mesma versão em todas as máquinas. No entanto, na 13.10 é uma versão diferente da 12.04 LTS. Então agora o que? Ao chegar a uma pergunta como essa, receber uma resposta como por que você quer fazer isso é realmente incrivelmente inútil e uma perda de tempo para todos.
Cookie
2

Como psusi explica, as versões antigas não são mantidas no repositório do ubuntu, mas aparentemente você ainda pode encontrá-las na barra de lançamento. Então, você vai (substitua trusty e amd64 pela sua versão e arquitetura do ubuntu):

https://launchpad.net/ubuntu/trusty/amd64/apache2

e selecione a versão que você deseja. Então você baixa o deb como um arquivo e instala com:

dpkg -i apache2_2.4.7-1ubuntu4.20_amd64.deb

Mais uma vez, substitua o nome do arquivo no seu arquivo. Isso fica entediante se você precisar fazer o downgrade de muitos pacotes, mas é melhor que nada se estiver desesperado.

soger
fonte