Debian リポジトリ

このガイドでは

  1. Debian パッケージがどのように構成されているかの基本的な概要
  2. Debian パッケージを管理するためにどのようなパッケージマネージャ、 クライアント、ツールが使われているか
  3. GitLab Debian リポジトリの機能

Debian パッケージの基本

Debian パッケージにはバイナリとソースの 2 種類があります。

  • バイナリ- 通常は.deb ファイルで、実行可能ファイルや設定ファイル、 その他のデータを含んでいます。バイナリパッケージは既にコンパイルされているので、OS やアーキテクチャにマッチしていなければなりません。これらは通常、dpkg を使ってインストールします。バイナリパッケージをインストールする場合、システム上に依存関係が存在する 必要があります。
  • ソース- 通常、.dsc ファイルと圧縮された.tar ファイルから構成されます。ソースパッケージはシステム上でコンパイルすることができます。

パッケージはapt で取得され、dpkg でインストールされます。aptを使用すると、依存関係もフェッチしてインストールします。

.deb ファイルは、命名規則<PackageName>_<VersionNumber>-<DebianRevisionNumber>_<DebianArchitecture>.deb に従います。

このファイルには、パッケージに関するメタデータを含むcontrol file が含まれます。dpkg --info <deb_file> を使用すると、コントロール・ファイルを表示できます。

.changes ファイル は、Debian リポジトリにパッケージの更新をどのように処理す るかを指示するために使われます。このファイルには、アーキテクチャ、ディストリビューション、 バージョンなど、パッケージの様々なメタデータが含まれています。メタデータに加えて、チェックサムのリストが 3 つ含まれています:sha1 Files セクションの ,sha256,md5 です。これらのファイルがどのように構成されているかの例については、sample_1.2.3~alpha2_amd64.changesを参照してください。

Debian パッケージはどうやって手に入れるのですか?

.deb ファイルをダウンロードし、dpkgでインストールすることもできますが、 ほとんどのユーザはapt-get を使ってapt で Debian パッケージを利用します。aptdpkgをラップし、依存関係の管理とコンパイルを追加します。

Debian パッケージはどのようにして公開されるのですか?

作業している Debian リポジトリの種類によっては、curl を使ってパッケージを公開することも珍しくありません。しかし、.changes ファイルを元に関連ファイルをアップロードしてくれるdput-ng を使うのが一番良いツールです。

ディストリビューションとは何ですか?

Debian に関して言えば、パッケージは単体では存在しません。パッケージは_ディストリビューションに_属します。これにはいろいろな意味がありますが、一番注意すべきことは、 ユーザはディストリビューションを指定することに慣れているということです。

Debian リポジトリとはどのようなものですか?

  • Debian リポジトリは多くのリリースから構成されています。
  • 各リリースには安定コードネームが与えられています。公開 Debian リポジトリでは、”bullseye” や “jessie” といった名前です。
    • また、”stable” や “edge” といったリリースチャンネルと同義のコードネームのエイリアスであるスイートという概念もあります。時間の経過とともにそれらは変化し、異なる_コードネームを_指すようになります。
  • 各リリースには多くのコンポーネントがあります。公開リポジトリでは、”main”、”contrib”、”non-free “です。
  • 各リリースには、”amd64”、”arm64”、”i386” といった多くのアーキテクチャがあります。
  • 各リリースには署名されたReleaseファイルがあります (GPG 署名については以下を参照してください)。

標準的なディレクトリベースの Debian リポジトリは、以下のように構成されます:

dists\
      |--jessie/
      |--bullseye\
                  |Changelog
                  |Release
                  |InRelease
                  |Release.gpg
                  |--main\
                          |--amd64\
                          |--arm64\
                  |--contrib\
                  |--non-free\
pool\
     |--this is where the .deb files for all releases live

公開 Debian リポジトリのミラーサイトはこちらです:http://ftp.us.debian.org/debian/

公開 Debian リポジトリでは、ディレクトリ構造全体、リリースファイル、 GPG 鍵、その他のファイルはすべて、Debian Archive Kit (dak) と呼ばれる一連のスクリプトによって生成されます。

GitLab Debianリポジトリでは、特定のファイルディレクトリを扱うことはありません。その代わりに、コードと基礎となるPostgreSQL データベースを使って、これらの異なる部分間の関係を整理しています。

Debian リポジトリでは何をするのですか?

Debian コミュニティは、オブジェクトストレージのようなものが存在する以前から、 多くのパッケージリポジトリシステムを作成し、FTP を使ってアーティファクトを リモートサーバにアップロードしていました。現在のパッケージリポジトリやレジストリのほとんどは、どこかのサーバ上の ディレクトリに過ぎません。公式な Debian ディストリビューションに追加されたパッケージは、オープンソースのメン テナーグループが管理する中央公開リポジトリに存在します。パッケージメンテナーは、Debian Archive Kit (dakスクリプト) を使ってリリースファイルの生成やその他の保守作業を行います。そのため、完全な Debian リポジトリは、ファイルの保存や提供に加え、dak が提供するのと同じ動作を実現する必要があります。GitLab Debian レジストリが目指しているのは、この動作です。

GPGキーとは何か、署名付きリリースとは何か

GPG鍵は、セキュアなデータ転送のための公開鍵と秘密鍵のペアです。SSHキーと同様に、秘密鍵と公開鍵があります。公開_鍵を持っている人は_データを暗号化でき、_秘密鍵を持って_いる人は公開鍵を使って暗号化された_データを復号_できます。GPG 鍵を使ってデータに署名することもできます。秘密鍵を持っている人はデータやファイルに署名することができ、公開鍵を持っている人はその署名を確認し、一致する秘密鍵を持っている人の署名だと信用することができます。

私たちは Debian パッケージのリリースファイルに署名するのに GPG を使っています。リリースファイルは、あるディストリビューション内のすべてのパッケージと、 それぞれのダイジェストのインデックスです。

GitLab Debian レジストリでは、ユーザーが Debian リポジトリに新しいパッケージを公開するたびに、バックグラウンドプロセスが新しいリリースファイルを生成します。ディストリビューションごとに GPG 鍵が作成されます。ユーザがそのディストリビューションのリリースを要求した場合、そのリリースファイルの信頼性を検証するために、署名されたバージョンと公開 GPG 鍵を要求することができます。

GitLab リポジトリ内部

ファイルのアップロードが発生したとき

  1. 新しい「着信」パッケージレコードが見つかるか作成されます。すべての新しいファイルは「受信」パッケージに割り当てられます。これは、ファイルが実際にどのパッケージに関連付けられているかがわかるまで使用される保持領域です。
  2. 新しい「不明」ファイルが保存されます。このファイルが既存のパッケージに属するかどうかがまだわからないため、不明です。

ファイルがどのパッケージに属するかがわかると、そのファイルはそのパッケージに関連付けられ、それ以上ファイルが残らない場合は「incoming」パッケージは削除されます。ファイルの “unknown” ステータスは、正しいファイルタイプに更新されます。

次に、ファイルが.changes 形式の場合:

  1. .changes ファイルが解析され、その中にリストされているファイルが更新さ.changesれます。.changes アップロードされた非ファイルはすべて.changes、さまざまなディストリビューションやパッケージに正しく関連付けられます。
  2. ::Packages::Debian::GenerateDistributionWorker および::Packages::Debian::GenerateDistributionService が実行されます。
    1. コンポーネントファイルが作成または更新されます。.changes ファイルにリストされているパッケージファイルを更新しただけなので、変更されたチェックサム値に基づいてコンポーネント/アーキテクチャファイルをチェックします。
    2. 新しいリリースが生成されます:
      1. ディストリビューションに新しいGPG鍵が存在しない場合、新しいGPG鍵が生成されます。
      2. リリースファイルが作成され、GPG鍵で署名され、保存されます。
    3. 古いコンポーネントファイルは破棄されます。

以下の 3 つの図は、ファイルが Debian API にアップロードされた後の経路を示しています:

sequenceDiagram autonumber actor Client Client->>+DebianProjectPackages: PUT projects/:id/packages/debian/:file_name Note over DebianProjectPackages: If `.changes` file or distribution param present DebianProjectPackages->>+CreateTemporaryPackageService: Create temporary package Note over DebianProjectPackages: Else DebianProjectPackages->>+FindOrCreateIncomingService: Create "incoming" package Note over DebianProjectPackages: Finally DebianProjectPackages->>+CreatePackageFileService: Create "unknown" file Note over CreatePackageFileService: If `.changes` file or distribution param present CreatePackageFileService->>+ProcessPackageFileWorker: Schedule worker to process the file DebianProjectPackages->>+Client: 202 Created ProcessPackageFileWorker->>+ProcessPackageFileService: Start service

ProcessPackageFileWorker バックグラウンドジョブ

sequenceDiagram autonumber ProcessPackageFileWorker->>+ProcessPackageFileService: Start service ProcessPackageFileService->>+ExtractChangesMetadataService: Extract changes metadata ExtractChangesMetadataService->>+ExtractMetadataService: Extract file metadata ExtractMetadataService->>+ParseDebian822Service: run `dpkg --field` to get control file ExtractMetadataService->>+ExtractDebMetadataService: If .deb, .udeb or ddeb ExtractDebMetadataService->>+ParseDebian822Service: run `dpkg --field` to get control file ParseDebian822Service-->>-ExtractDebMetadataService: Parse String as Debian RFC822 control data format ExtractDebMetadataService-->>-ExtractMetadataService: Return the parsed control file ExtractMetadataService->>+ParseDebian822Service: if .dsc, .changes, or buildinfo ParseDebian822Service-->>-ExtractMetadataService: Parse String as Debian RFC822 control data format ExtractMetadataService-->>-ExtractChangesMetadataService: Parse Metadata file ExtractChangesMetadataService-->>-ProcessPackageFileService: Return list of files and hashes from the .changes file loop process files listed in .changes ProcessPackageFileService->>+ExtractMetadataService: Process file ExtractMetadataService->>+ParseDebian822Service: run `dpkg --field` to get control file ExtractMetadataService->>+ExtractDebMetadataService: If .deb, .udeb or ddeb ExtractDebMetadataService->>+ParseDebian822Service: run `dpkg --field` to get control file ParseDebian822Service-->>-ExtractDebMetadataService: Parse String as Debian RFC822 control data format ExtractDebMetadataService-->>-ExtractMetadataService: Return the parsed control file ExtractMetadataService->>+ParseDebian822Service: if .dsc, .changes, or buildinfo ParseDebian822Service-->>-ExtractMetadataService: Parse String as Debian RFC822 control data format ExtractMetadataService-->>-ProcessPackageFileService: Use parsed metadata to update "unknown" (or known) file end ProcessPackageFileService->>+GenerateDistributionWorker: Find distribution and start service GenerateDistributionWorker->>+GenerateDistributionService: Generate distribution

GenerateDistributionWorker バックグラウンドジョブ

sequenceDiagram autonumber GenerateDistributionWorker->>+GenerateDistributionService: Generate distribution GenerateDistributionService->>+GenerateDistributionService: generate component files based on new archs and updates from .changes GenerateDistributionService->>+GenerateDistributionKeyService: generate GPG key for distribution GenerateDistributionKeyService-->>-GenerateDistributionService: GPG key GenerateDistributionService-->>-GenerateDistributionService: Generate distribution file GenerateDistributionService->>+SignDistributionService: Sign release file with GPG key SignDistributionService-->>-GenerateDistributionService: Save the signed release file GenerateDistributionService->>+GenerateDistributionService: destroy no longer used component files

ディストリビューション

ディストリビューションにパッケージを公開する前に、ディストリビューションを作成する必要があります。プロジェクトまたはグループディストリビューションAPIを使用してディストリビューションを作成または更新すると、データベースに最初のバッキングレコードを作成することに加えて、GenerateDistributionService 、上のシーケンス図に示すように実行されます。