ウェブサイト検索

Debian ピンニングの方法


Debianは「ユニバーサルオペレーティングシステム」としても知られ、最も古いLinuxディストリビューションの一つです。常に「安定版」、「テスト版」、「不安定版」の3つの主要なDebianリリースがあります。「安定版」は公式のDebianリリースを表し、非常に堅牢で、製品向けに準備が整っており、ほとんど変更されないパッケージが含まれています。「テスト版」は安定版に受け入れられる準備中のパッケージが含まれており、最後に「不安定版」はソフトウェアの最も新しいバージョンが含まれ、ディストリビューション開発に使用されます。

このチュートリアルでは、安定版のDebianにおいて「ピンニング」技術を使用して、テスト版および不安定版からパッケージをインストールする方法を説明します。

このチュートリアルでは、あなたは学びます:

  • Debianの「安定版」ソフトウェアソースにテストおよび不安定リポジトリを追加する方法
  • パッケージの優先順位がデフォルトでどのように割り当てられるか
  • ピン留めの設定方法
  • 「テスト」または「不安定」からパッケージを明示的にインストールする方法

安定版にDebianのテストおよび不安定リポジトリを追加する

異なるDebianリリースからのパッケージの混合は、代替手段がない場合を除いて避けるべきです。とはいえ、テストまたは不安定なパッケージをDebianの安定リリースにインストールするために最初に行うべきことは、各リポジトリを配布ソフトウェアソースに追加することです。この作業を最も簡単に実行する方法は、次のエントリを/etc/apt/sources.listファイルに追加することです:

deb http://deb.debian.org/debian testing main contrib
deb http://deb.debian.org/debian unstable main contrib

Debianのリリースはトイ・ストーリーのキャラクターの名前にちなんでいます。執筆時点では、例えば、安定版は「bullseye」と名付けられており、テスト版は「bookworm」と名付けられています(不安定版は常に「sid」と呼ばれます)。/etc/apt/sources.listファイルでは、リリースは名前で参照するか、リリースのクラス(安定版/テスト版/不安定版)で参照することができます。以下の例では後者の戦略を採用しています。

各Debianリリースリポジトリには基本的に3つの「コンポーネント」があります:main、contrib、non-freeです。「main」コンポーネントには自由でオープンソースのソフトウェアのみが含まれています。「contrib」コンポーネントには一部の非自由な依存関係を持つ自由でオープンソースのソフトウェアが含まれています。最後に、「non-free」コンポーネントにはDebianの自由ソフトウェアガイドラインに準拠していないソフトウェアが含まれています。「backports」コンポーネント(現在のDebian「stable」リリースの場合はbullseye-backports)も、より最新のソフトウェアを「testing」から再コンパイルし、「stable」で既に利用可能なライブラリに対して提供する安全な方法として利用可能です。上記の例では、最初の2つのコンポーネントのみを使用したことがわかります。

テスト用および不安定なリポジトリをソフトウェアソースとして追加したら、システムの動作をどのようにしたいかに応じてパッケージの優先順位を変更する必要があります。それでは、どのように行うか見てみましょう。

デフォルトで優先順位がどのように割り当てられるか

同じパッケージの複数のバージョンが利用可能な場合、どのバージョンをインストールするかを選択するために、APTは優先順位システムを使用します。/etc/apt/preferencesファイル(または/etc/apt/preferences.dディレクトリ内の専用ファイル)でパッケージの優先順位を明示的に設定する方法を学ぶ前に、優先順位がどのように割り当てられるかを理解する必要があります。これは、ターゲットリリースが定義されているかどうかに依存します。Debianのターゲットリリースはデフォルトでは未定義ですが、/etc/apt/apt.confファイルに設定できます。たとえば、ターゲットリリースとして「stable」を設定するには、次のように書きます:

APT::Default-Release "stable"

ターゲットリリースが定義されている場合、そこからのパッケージが最優先されます:

  • 優先度100は、すでにインストールされているパッケージに割り当てられています。
  • ターゲットリリースからのパッケージには優先度900が割り当てられています。
  • 優先度500は他のパッケージに割り当てられています

ターゲットリリースが定義されていない場合、代わりに、インストールされたパッケージには優先度100が割り当てられ、すべての利用可能なパッケージには優先度500が設定されます。パッケージの最高利用可能バージョンがインストール候補として選択され、パッケージは優先度が明示的に> 1000に設定されない限り、ダウングレードされることは決して許可されません。具体的には、優先度値(整数)はAPTによって次のように解釈されます:

  • 優先度 < 0: パッケージのバージョンのインストールを防ぎます
  • 1 から 99 の優先値:パッケージのインストール済みバージョンがない場合のみ、バージョンをインストールする原因となります。
  • 100 と 499 の間の優先度: 他のディストリビューションに属するバージョンが利用可能でない限り、またはインストールされているバージョンが最近のものでない限り、バージョンがインストールされます。
  • 500 と 989 の間の優先度: ターゲットリリースに属するバージョンが利用可能でない限り、あるいはインストールされているバージョンが最近のものでない限り、バージョンがインストールされる原因となる
  • 990 と 999 の間の優先度: インストールされているバージョンが新しい場合を除き、ターゲットリリースからでなくてもバージョンがインストールされる原因となります。
  • 優先度 > 1000: これはパッケージのダウングレードを構成する場合でも、バージョンがインストールされる原因となります。

優先順位は、/etc/apt/preferences ファイルにルールを定義することで上書きできます。それについて見てみましょう。

/etc/apt/preferencesファイル

/etc/apt/preferencesファイルにルールを定義するには、3つの情報を提供する必要があります:

  1. ルールを適用するために一致すべきパターン(これにはパッケージ名、POSIX拡張正規表現、または利用可能なすべてのパッケージに一致させるための「*」が含まれる場合があります)
  2. パッケージのバージョン、起源、またはリリース
  3. パッケージの優先度

いくつかの例を見てみましょう。上記で指定したように、ターゲットリリースが定義されていない場合、パッケージの最新バージョンがインストール候補として選択されます。私たちはテストおよび不安定なリリースをソフトウェアソースとして追加しました。したがって、後者には最新のパッケージが含まれているため、インストールを試みるソフトウェアはそこから引き出されるべきです(利用可能な場合)。ansibleをインストールしたいとします。私たちが述べたことが正しいかどうかを確認するために、apt-cache policyコマンドを使用できます。このコマンドは、各ソフトウェアソースの優先度と、パッケージ名が引数として渡された場合にインストール候補として選択されるパッケージのバージョンを表示します。実行します:

apt-cache policy ansible

コマンドは次の出力を返します:

ansible:
  Installed: (none)
  Candidate: 7.3.0+dfsg-1
  Version table:
     7.3.0+dfsg-1 500
        500 http://deb.debian.org/debian testing/main amd64 Packages
        500 http://deb.debian.org/debian unstable/main amd64 Packages
     2.10.7+merged+base+2.10.8+dfsg-1 500
        500 http://deb.debian.org/debian bullseye/main amd64 Packages

ご覧の通り、7.3.0+dfsg-1のパッケージバージョンは「テスト」および「不安定」リポジトリの両方で利用可能ですが、「安定」リポジトリには古い2.10.7+merged+base+2.10.8+dfsg-1バージョンが含まれています。すべてのバージョンは同じ優先度(500)ですが、最新のものが選択されます。

さて、私たちのDebian「安定」システムにテストおよび不安定リポジトリを追加したいとしますが、それらのリポジトリからのパッケージは明示的な要求があった場合のみインストールしたいとします。ターゲットリリースを設定せずに、次のルールを定義し、テストおよび不安定からのパッケージに低い優先度を割り当てることができます:

Package: *
Pin: release a=stable
Pin-Priority: 900

Package: *
Pin: release a=testing
Pin-Priority: 600

Package: *
Pin: release a=unstable
Pin-Priority: 500

上記のルールはすべてのパッケージに一致します。なぜなら、私たちは「*」(グロブ表現)を使用したからです。POSIX拡張正規表現も使用可能です。特定のパッケージに一致させるには、その名前を入力すればよかったのです。私たちはリリースアーカイブによってパッケージを固定しました(「a=stable」の「a」はその意味で)、そして「stable」(優先度900)から始まり「testing」(優先度600)、最後に「unstable」(優先度500)という順に優先度を下げていきました。また、リリースは「名前」によっても選択できます。たとえば、次のように書けます:

Package: *
Pin: release n=bullseye
Pin-Priority: 900

私たちはルールを保存し、apt-cacheコマンドの出力を再確認します。ご覧のように、今回インストール候補として選ばれたパッケージは、優先度が高い安定リポジトリからのものです:

ansible:
  Installed: (none)
  Candidate: 2.10.7+merged+base+2.10.8+dfsg-1
  Version table:
     7.3.0+dfsg-1 600
        600 http://deb.debian.org/debian testing/main amd64 Packages
        500 http://deb.debian.org/debian unstable/main amd64 Packages
     2.10.7+merged+base+2.10.8+dfsg-1 900
        900 http://deb.debian.org/debian bullseye/main amd64 Packages

このような状況では、テスト版や不安定版からパッケージを明示的にインストールするにはどうすればよいでしょうか?コマンドラインから一時的に「ターゲットリリース」を定義することができます。これは、実行時に -t オプション ( --target-release) を使用することで、単一のコマンドに対して行うことができます。これにより、指定されたリリースからパッケージとその依存関係がインストールされるか、すでにインストールされている場合は、パッケージがそれを要求する場合にターゲットリリースのバージョンに更新されます。例えば、「ansible」パッケージを「testing」をターゲットリリースとしてインストールするには、次のように実行します:

sudo apt-get install -t testing ansible

特定のリリースからパッケージのみをインストールしようとするが、代わりに確立された優先順位に従ってその依存関係を満たそうとするには、次のように実行します:

sudo apt-get install ansible/testing

しかし、これはほとんどの場合、以下のようなエラーにつながる可能性があります。

The following packages have unmet dependencies:
 ansible-core : Depends: python3-jinja2 (>= 3.0.0~) but 2.11.3-1 is to be installed

異なるDebianリリースからのパッケージを混ぜる際には、非常に慎重になり、事前インストールレポートを注意深く検査することが自明であることは言うまでもありません。異なるDebianリリースからソフトウェアを混ぜる前に、常に「backports」リポジトリにパッケージの更新版が利用可能かどうかを確認するべきです。

結論

このチュートリアルでは、Debianのテストおよび不安定なソフトウェアリポジトリを安定版リリースに含め、"ピンニング"技術を使用してパッケージの優先度を定義する方法を見ました。優先度がどのように割り当てられるかは、ターゲット/デフォルトのDebianリリースが定義されているかどうかによって異なり、優先度ルールを指定することでデフォルトの動作をオーバーライドする方法も見ました。具体例については、apt_preferencesのマニュアルページをご覧ください。

関連記事: