特定のUbuntuパッケージを正確なバージョンでインストールする方法は?


224

提供されているいくつかの指定されたパッケージ(名前とバージョン)で新しい仮想マシンをセットアップしたい。

たとえば2.2.20-1ubuntu1、すべての依存関係を持つバージョンのapache2 。サーバーにこのパッケージの新しいバージョンがある場合でも、このパッケージをインストールする必要があります。

ソリューションは、複数(n)の「セットアップ」で動作/スケーリングする必要があります。別の仮想マシンには、古いバージョンのapache2が必要になる場合があります。

私は現在、正確なパッケージをインストールする可能性をいくつか知っていますが、それほど良いスケールではありません:

  1. すべての*.deb仮想マシンに必要なすべてを手動でコピーし、次を入力しdpkg -iます。(手動スクリプトなど)
  2. セットアップごとに新しいUbuntuリポジトリを作成して使用します。-> n個のリポジトリが必要になるため、機能しません。
  3. マシンを一度セットアップし、VMをコピーしてスナップショットを作成します。-> n個のVMを保存する必要があるため、機能しません。

私の問題はパッチ管理とラベル付けできますが、パッケージを現在のバージョンに更新したくありません。私の目標は、古いパッケージをインストールすることです。

回答:


227

apt-getaptが認識しているアーカイブにある限り、パッケージの特定のバージョンをインストールするために使用できます。apt-getマンページから:

パッケージの特定のバージョンをインストール用に選択するには、パッケージ名の後に「=」と選択するパッケージのバージョンを指定します。これにより、そのバージョンが検索され、インストール用に選択されます。または、パッケージ名の後にスラッシュとディストリビューションのバージョンまたはアーカイブ名(安定、凍結、不安定)を続けることで、特定のディストリビューションを選択できます。

たとえば、次のことができます。

sudo apt-get install apache2=2.2.20-1ubuntu1

この場合、あなた自身でいくつかの依存関係の解決を行う必要があるかもしれないことに注意してください。しかし、何か問題がある場合、apt-getはそれらの原因を教えてくれます。11.10システムでは、これを機能させるために以下を行う必要があります。

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

46
利用可能なバージョンを知る方法は?
ロドリゴグーゲル

12
@Rodrigo Gurgel、「aptitudeバージョンapache2」
-user169015

3
!@ user169015 =「バージョンはUbuntuのためにパッケージ化され、利用可能とされる「バージョンが存在する」apt
カイルストランド

こんにちはカイル、私はあなたのコメントを受け取りませんでしたが、はい、パッケージもaptを使用してインストールできます。私はそれを長い間使用しているので、適性に固執しています... :)
user169015

6
@ user169015カイルのコメントの要点が欠けていると思います。下記のpsusiの回答をご覧ください。どうやらUbuntu APTリポジトリは古いバージョンのパッケージをホストし続けていないようです!そのため、ランタイムパッケージマネージャー(pip、gem、mavenなど)とは異なり、古い既知の良好な構成を再構成する場合、Ubuntu APTリポジトリに依存することはできません。私はこれを自分で実現することに驚き、失望しました。たぶんArchがこれをうまく処理しているのでしょうか?(askubuntu.com/questions/728439/...
藻類

66

利用可能なバージョンを確認するには、次の方法で確認できます。

sudo apt-cache madison ^apache2

動作しない場合は、sudo apt-get update前に実行してパッケージリストを更新することを検討してください。

次に、バージョンをコピーするか、次の構文を使用します。

sudo apt-get install apache2=2.2\*

インストールされているバージョンを確認するには、次を実行します。

dpkg -l 'apache2*' | grep ^i

5
=2.2\*使用可能なサブバージョンを選択するためにワイルドカードを使用する方法としてオプションを指摘してくれてありがとう。それは私が知りたかったが、尋ねる方法がわからなかった:)
aexl

3
を使用してバージョンをリストするときdpkg -l <packageName>に、バージョン番号が切り捨てられることがあります。これを回避するには、次を使用しますCOLUMNS=100 dpkg -l <packageName>
-CJBS

Yakketyでは、最初のコマンドは、私だけを与える:N: Unable to locate package ^apache2
ジェシーグリック

@JesseGlick sudo apt-get update最初に実行します。適切なAptソースが設定されていることを確認してください。
ケノーブ

1
N:$ sudo apt-get updateの後、パッケージ^ apache2を見つけることができませんが、sudo apt-get install apache2 = 2.2 *は動作します
Braian Mellor

17

aptファミリ内の他の便利なバージョン管理コマンドを使用して、以前の回答を拡張します。使用可能なバージョンを確認するには、次を実行します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

次に、別の場所で述べたように、特定のバージョンをインストールしapt-getます:

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

apt-cache policy再度実行すると、インストールしたバージョンを確認できます。

# 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

更新時に新しいバージョンをインストールしたくない場合は、パッケージをapt-mark次のように固定します。

# apt-mark hold apache2
apache2 set on hold.

apache2の新しいバージョンがパッケージインデックスに追加され、マシンがと同期されているとしapt-get updateます。次の実行時にこれが表示されます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.

6

実際には、古いバージョンはアーカイブに保存されないため、これは不可能です。したがって、古いバージョンのコピーがどこかにある場合を除き、インストールすることはできません。そもそも古いバージョンをインストールする理由を自問するべきです。安定したリリースでは、新しいバージョンがリリースされる主な理由はセキュリティの脆弱性を修正することであり、脆弱なサーバーを実行したくないのですか?


25
開発目的で古い環境の正確なコピーを再現するためにこれが必要です。古いパッケージバージョンを削除しないミラーをセットアップして必要なパッケージにアクセスすることはできますか、または差分のみを保持する複数のリポジトリをセットアップする必要がありますか?
アイコスター

19
@psusi:正確な回答ではありません。多くの理由が考えられます。私の場合、新しいバージョンには実際にバグがある可能性があり、それを再確認するには古いバージョンが必要です。ほんの一例です。
クッキー14年

2
@nomen、いいえ、それはローリングリリースモデルを使用しない単一のディストリビューションです。安定リリースで重大なバグとセキュリティ脆弱性が修正された場合、それらがリグレッションを引き起こさないように細心の注意が払われますが、もしそれが起こった場合は、regression-releaseでタグ付けされたバグレポートを提出し、修正またはロールバックされますバック。
psusi

5
@nomen、言葉の意味を自分で作りたい場合、他の人とコミュニケーションするのに苦労します。世界中のすべての人にとって、それはローリングリリースとは異なり、ローリングリリースは正反対であり、したがって安定したリリースと相互に排他的です。考えてみると、リリースに同梱されている元のバージョンは実際には-releaseポケットに保持され、アップデートは-updatesまたは-securityポケットに移動するため、前のアップデートに戻ることはできませんが、最初にリリースされたバージョンに戻ることができます。
psusi

5
@psusi:ここにもう1つあります。Unisonは、すべてのマシンで常に同じバージョンである必要があります。しかし、13.10では、12.04 LTSとは異なるバージョンです。んで、どうする?このような質問に答えるとき、なぜこれをしたいのかというような答えを受け取ることは、本当に信じられないほど役に立たず、すべての人にとって時間の無駄です。
クッキー14

2

psusiが説明するように、古いバージョンはubuntuリポジトリに保持されませんが、明らかにランチパッドでそれらを見つけることができます。だから、あなたは(あなたのubuntuバージョンとアーキテクチャでtrustyとamd64を置き換えて)に行きます:

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

必要なバージョンを選択します。次に、debをファイルとしてダウンロードし、次を使用してインストールします。

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

繰り返しますが、ファイル名をファイルに置き換えます。多数のパッケージをダウングレードする必要がある場合、これは退屈になりますが、必死であれば、何もしないよりはましです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.