web-dev-qa-db-ja.com

Debian 7 aptは、カスタムバックポートパッケージを「公式」の同一バージョンにアップグレードしています。

明けましておめでとうございます。

最近、私はdebianバックポートソースからnginx debパッケージv1.4.4をビルドしましたが、もちろんaptsources.listに追加しました。

今日はapt-get update、次にapt-get -V upgradeを実行して、debian 7aptがどのように動作するかを確認しました。これが私が得たものです。

root@debian-lab:~/nginx-1.4.4-packages# apt-get -V upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be upgraded:
   nginx-full (1.4.4-1~bpo70+1 => 1.4.4-1~bpo70+1)
1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/464 kB of archives.
After this operation, 9,027 kB disk space will be freed.
Do you want to continue [Y/n]?

ご覧のとおり、aptは(1.4.4-1〜bpo70 + 1 => 1.4.4-1〜bpo70 + 1)からアップグレードしようとしています。これは基本的に2つの同一バージョンですが、インストール済みですdebパッケージにはデフォルトのnginx-fullに追加されたカスタムnginxモジュールがあり、更新後、カスタムモジュールはすべてなくなり、標準のdebian wheezy backportdebに置き換えられました。debianbackportソースからnginxbackport debパッケージをビルドし、ビルドをインストールしました-バックポートを介してdebも行いますが、いくつかの依存関係は安定版から自動的にインストールされます。これは、詳細な出力から見たものです。

例を挙げてこれを防ぐのを手伝ってくれませんか。ピン留めについて聞いたのですが、それが私の問題の答えですか?


[〜#〜] update [〜#〜]

パッケージをaptpinしようとしましたが、機能しませんでした。次の出力が得られました。

apt-cache policy nginx-full
nginx-full:
Installed: 1.4.4-1~bpo70+1
Candidate: 1.4.4-1~bpo70+1
Version table:
 1.4.4-1~bpo70+1 0
    100 http://ftp.uk.debian.org/debian/ wheezy-backports/main AMD64 Packages
*** 1.4.4-1~bpo70+1 0
    100 /var/lib/dpkg/status
 1.2.1-2.2+wheezy2 0
    500 http://ftp.uk.debian.org/debian/ wheezy/main AMD64 Packages
    500 http://security.debian.org/ wheezy/updates/main AMD64 Packages

そして、以下はapt-cacheポリシーnginxです:

/etc/apt/preferences.d# apt-cache policy nginx
nginx:
  Installed: 1.4.4-1~bpo70+1
  Candidate: 1.4.4-1~bpo70+1
  Package pin: 1.4.4-1~bpo70+1
  Version table:
 *** 1.4.4-1~bpo70+1 1001
        100 http://ftp.uk.debian.org/debian/ wheezy-backports/main AMD64 Packages
        100 /var/lib/dpkg/status
     1.2.1-2.2+wheezy2 1001
        500 http://ftp.uk.debian.org/debian/ wheezy/main AMD64 Packages
        500 http://security.debian.org/ wheezy/updates/main AMD64 Packages

しかし、それでもaptはアップグレードして交換しようとしています!!

Sources.listのコンテンツ:

deb http://ftp.uk.debian.org/debian/ wheezy main
deb-src http://ftp.uk.debian.org/debian/ wheezy main

deb http://security.debian.org/ wheezy/updates main
deb-src http://security.debian.org/ wheezy/updates main

# wheezy-updates, previously known as 'volatile'
deb http://ftp.uk.debian.org/debian/ wheezy-updates main
deb-src http://ftp.uk.debian.org/debian/ wheezy-updates main

# Wheezy Backports repository
deb http://ftp.uk.debian.org/debian wheezy-backports main
deb-src http://ftp.uk.debian.org/debian wheezy-backports main

パッケージ名「nginx」とnginx-fullを使用して、ピンをaptしようとしました。

しかし、両方ともパッケージを保持できません!!!

1
Dr.SMS

問題を回避するために、まず、カスタムパッケージにカスタム(およびそれ以上)のバージョン番号を使用する、例:1.4.4-1~bpo70+1-mrsmsをお勧めします。パッケージが「公式」バックポートとまったく同じバージョンではないため、これは公正なことです。ビルドする前に、ファイルdebian/changelogからバージョン番号を変更できます。

dpkgを使用してバージョン比較をテストできます(ここで、gtは「より大きい」を表し、式がtrueの場合の戻りコードは0です):

$ dpkg --compare-versions 1.4.4-1~bpo70+1-mrsms gt 1.4.4-1~bpo70+1
$ echo $?

オンラインリポジトリでさらに大きなバージョンが見つかった場合でも、カスタムパッケージはアップグレードされるため、注意してください。次に、使用 ピン留め それを回避するman apt_preferencesを参照)することをお勧めします。

これを試すには、次の内容のファイル(/etc/apt/preferences.d/nginx-fullなど)を作成します。

Package: nginx-full
Pin: version 1.4.4-1~bpo70+1-mrsms
Pin-Priority: 1001

パッケージを保持することもできます現在のインストール状態では、非常に効果的ですが、あまりエレガントではありません(将来のアップグレードで問題が発生する可能性があります)。

# aptitude hold nginx-full
# echo "nginx-full" hold |dpkg --set-selections
5
Totor

チャットで、OPはパッケージをdpkg --installでインストールしたと述べました。さらに、IIRC、APTは、次の方法で優先するパッケージを解析します。

  1. パッケージが固定されている場合は、何もしないでください。
  2. システムに認識されているパッケージの中で、プログラムのバージョンが最も高いものを優先します。
  3. 競合がある場合は、システムで認識されているパッケージのバージョンが最も高いパッケージを優先してください。
  4. それでも競合が発生する場合は、/etc/apt/sources.listにリストされているリポジトリのパッケージを優先してください。
  5. それでも競合が発生する場合は、sources.listの最初に来るリポジトリのパッケージを優先してください。

この情報があれば、ステップ4でAPTがローカルにインストールされたバージョンではなくリポジトリバージョンを選択していると推測できます。したがって、この問題を解決するには4つの方法があります。

  1. パッケージのバージョンを、公式のDebianリポジトリが提供するものを超えるものに増やします。これにより、ステップ3でローカルにインストールされたパッケージがDebianパッケージよりも選択されます(@Totorが私を打ち負かしたので、これを行う方法については彼の回答に従います)。
  2. プログラムのバージョンを、公式のDebianリポジトリが提供するものを超えるものに増やします。これにより、手順2でパッケージが選択されますが、これを行わず、代わりにパッケージバージョンをインクリメントすることを強くお勧めします。技術的な理由はなく、より正確です。ただし、この方法を選択した場合は、パッケージバージョンと基本的に同じ方法で実行されますが、 debian/controlファイル (またはその他のフィールド)を変更する点が異なります。それ以外の場合は、パッケージの生成に使用しています)。
  3. パッケージを固定します。これにより、ステップ1でパッケージが選択されます。これも@Totorの回答で説明されています。
  4. ローカルリポジトリを作成し、パッケージをその中に入れ、それをsources.listに追加するときに、公式のDebianリポジトリの前に来るようにします。これにより、ステップ5で選択がトリガーされます。これを行うには、 このDebian Wikiページ を参照してください。より簡単なチュートリアルスタイルのリファレンスが必要な場合は、 このUbuntuの質問をする にも興味があるかもしれません。
3
strugee