- Debian パッケージの基本
- Debian パッケージはどうやって手に入れるのですか?
- Debian パッケージはどのようにして公開されるのですか?
- ディストリビューションとは何ですか?
- Debian リポジトリとはどのようなものですか?
- Debian リポジトリでは何をするのですか?
- GPGキーとは何か、署名付きリリースとは何か
- GitLab リポジトリ内部
Debian リポジトリ
このガイドでは
- Debian パッケージがどのように構成されているかの基本的な概要
- Debian パッケージを管理するためにどのようなパッケージマネージャ、 クライアント、ツールが使われているか
- 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 パッケージを利用します。apt
はdpkg
をラップし、依存関係の管理とコンパイルを追加します。
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 リポジトリ内部
ファイルのアップロードが発生したとき
- 新しい「着信」パッケージレコードが見つかるか作成されます。すべての新しいファイルは「受信」パッケージに割り当てられます。これは、ファイルが実際にどのパッケージに関連付けられているかがわかるまで使用される保持領域です。
- 新しい「不明」ファイルが保存されます。このファイルが既存のパッケージに属するかどうかがまだわからないため、不明です。
ファイルがどのパッケージに属するかがわかると、そのファイルはそのパッケージに関連付けられ、それ以上ファイルが残らない場合は「incoming」パッケージは削除されます。ファイルの “unknown” ステータスは、正しいファイルタイプに更新されます。
次に、ファイルが.changes
形式の場合:
-
.changes
ファイルが解析され、その中にリストされているファイルが更新さ.changes
れます。.changes
アップロードされた非ファイルはすべて.changes
、さまざまなディストリビューションやパッケージに正しく関連付けられます。 -
::Packages::Debian::GenerateDistributionWorker
および::Packages::Debian::GenerateDistributionService
が実行されます。- コンポーネントファイルが作成または更新されます。
.changes
ファイルにリストされているパッケージファイルを更新しただけなので、変更されたチェックサム値に基づいてコンポーネント/アーキテクチャファイルをチェックします。 - 新しいリリースが生成されます:
- ディストリビューションに新しいGPG鍵が存在しない場合、新しいGPG鍵が生成されます。
- リリースファイルが作成され、GPG鍵で署名され、保存されます。
- 古いコンポーネントファイルは破棄されます。
- コンポーネントファイルが作成または更新されます。
以下の 3 つの図は、ファイルが Debian API にアップロードされた後の経路を示しています:
ProcessPackageFileWorker
バックグラウンドジョブ
GenerateDistributionWorker
バックグラウンドジョブ
ディストリビューション
ディストリビューションにパッケージを公開する前に、ディストリビューションを作成する必要があります。プロジェクトまたはグループディストリビューションAPIを使用してディストリビューションを作成または更新すると、データベースに最初のバッキングレコードを作成することに加えて、GenerateDistributionService
、上のシーケンス図に示すように実行されます。