Debianパッケージは、DebianおよびDebianベースのLinuxディストリビューション(Ubuntu等)で使用されるソフトウェアパッケージの形式です。
Debian系のLinuxユーザーであれば1度は使用したことがあると思いますが、パッケージ管理ツールによって管理されるため、直接的にDebianパッケージに触れる機会はそれほど多くないと思います。
本記事では、Debianパッケージの仕組みについて解説していきます。
特徴
Debianパッケージは以下のような特徴を持っています。
- 拡張子が「.deb」で表される
- APT(Advanced Package Tool)やdpkgなどのパッケージ管理ツールによって管理(インストール、アップグレード、削除等)される
- 複数のディレクトリやファイルがアーカイブされたものである
- 依存関係を管理するためのcontrolファイル(依存関係などのメタデータを記載したファイルが含まれる)が含まれている
構成要素
Debianパッケージは、以下の3つの構成要素によって構成されています。
- 制御アーカイブ
- データアーカイブ
- debian-binary ファイル
各ファイルやアーカイブ内のファイル詳細は「helloパッケージの展開」で説明しています。
制御アーカイブ
「control.tar.zst」や「control.tar.xz」、「control.tar.gz」で表されます。制御アーカイブには、パッケージのメタデータと設定スクリプトが含まれます。以下のようなファイルが含まれます。
- control:パッケージ名、バージョン、依存関係、説明などのメタデータが記されたファイル。
- preinst:パッケージがインストールされる前に実行されるスクリプト。
- postinst:パッケージがシステムにインストールされた後に実行されるスクリプト。
- prerm:パッケージがシステムから削除される前に実行されるスクリプト。
- postrm:パッケージがシステムから削除された後に実行されるスクリプト。
データアーカイブ
「data.tar.zst」や「data.tar.xz」、「data.tar.gz」で表されます。データアーカイブには、パッケージに含まれる実際のファイル(例:バイナリ、ライブラリ、設定ファイル)が格納されています。ファイルは、インストール時にシステムの適切な場所(バイナリは「/usr/bin」、ライブラリは「usr/lib」)に配置されます。
debian-binary ファイル
debian-binaryファイルはテキストファイルで、パッケージフォーマットのバージョンが記載されています。
helloパッケージの展開
例として、helloパッケージをダウンロード・展開して中身を確認しながら、含まれているファイルについて説明していきます。
[手順]
① 「apt download」コマンドで「hello」パッケージをダウンロードします。
~$ sudo apt download hello
Get:1 http://archive.ubuntu.com/ubuntu jammy/main amd64 hello amd64 2.10-2ubuntu4 [26.6 kB]
Fetched 26.6 kB in 1s (21.7 kB/s)
~$ ls
hello_2.10-2ubuntu4_amd64.deb
② 「ar」コマンドで展開します。
~$ mkdir hello
~$ cd hello
~/hello$ ar x ../hello_2.10-2ubuntu4_amd64.deb
~/hello$ ls
control.tar.zst data.tar.zst debian-binary
③ .tar.zstファイルを展開します。(zstファイルの展開は「zstd」コマンドで行います。)
~/hello$ unzstd control.tar.zst data.tar.zst && rm control.tar.zst data.tar.zst
2 files decompressed : 71680 bytes total
~/hello$ ls
control.tar data.tar debian-binary
~/hello$ tar -xvf control.tar && rm control.tar
./
./control
./md5sums
~/hello$ tar -xvf data.tar && rm data.tar
./
./usr/
./usr/bin/
./usr/bin/hello
./usr/share/
./usr/share/doc/
./usr/share/doc/hello/
./usr/share/doc/hello/NEWS.gz
./usr/share/doc/hello/changelog.Debian.gz
./usr/share/doc/hello/copyright
./usr/share/info/
./usr/share/info/hello.info.gz
./usr/share/man/
./usr/share/man/man1/
./usr/share/man/man1/hello.1.gz
展開後、treeコマンドでディレクトリ構造を確認してみます。
~/hello$ tree
.
├── control
├── debian-binary
├── md5sums
└── usr
├── bin
│ └── hello
└── share
├── doc
│ └── hello
│ ├── NEWS.gz
│ ├── changelog.Debian.gz
│ └── copyright
├── info
│ └── hello.info.gz
└── man
└── man1
└── hello.1.gz
8 directories, 13 files
展開したhelloパッケージの中身のディレクトリやファイルの詳細は以下のようになります。
control
controlファイルはテキストファイルで、パッケージに関するメタデータが含まれています。controlファイルには以下の用途があります。
- パッケージシステムのサポート:APTなどパッケージ管理システムにおける、パッケージのインストール、アップグレード、削除のプロセスを支援します。
- 依存関係の解決:パッケージの依存関係が記載されているため、システムは必要な他のパッケージを自動的にインストールすることができます。
- パッケージ情報の提供:ユーザーやシステム管理者がパッケージについて知る必要がある重要な情報を提供します。例えば、パッケージの名前やバージョン番号、CPUアーキテクチャ1、概要などが記載されています。
~/hello$ cat control
Package: hello
Version: 2.10-2ubuntu4
Architecture: amd64
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Installed-Size: 108
Depends: libc6 (>= 2.34)
Conflicts: hello-traditional
Breaks: hello-debhelper (<< 2.9)
Replaces: hello-debhelper (<< 2.9), hello-traditional
Section: devel
Priority: optional
Homepage: http://www.gnu.org/software/hello/
Description: example package based on GNU hello
The GNU hello program produces a familiar, friendly greeting. It
allows non-programmers to use a classic computer science tool which
would otherwise be unavailable to them.
.
Seriously, though: this is an example of how to do a Debian package.
It is the Debian version of the GNU Project's `hello world' program
(which is itself an example for the GNU Project).
Original-Maintainer: Santiago Vila <sanvila@debian.org>
debian-binary
debian-binaryファイルはテキストファイルで、パッケージフォーマットのバージョンが記載されています。パッケージ管理システムが「.deb」ファイルを正しく認識し、処理するために重要な役割を果たしています。
~/hello$ cat debian-binary
2.0
md5sums
md5sumsファイルはテキストファイルで、パッケージ内の各ファイルのMD5ハッシュを記録しています。このファイルの主な目的は、パッケージ内のファイルの整合性と認証を確保することです。
~/hello$ cat md5sums
e990a5299a3412f6d4f7d39e0e0c0a01 usr/bin/hello
9dbc678a728a0936b503c0aef4507f5d usr/share/doc/hello/NEWS.gz
e54b964772fdd8847d9f217d3037c7df usr/share/doc/hello/changelog.Debian.gz
bf4bad78d5cf6787c6512b69f29be7fa usr/share/doc/hello/copyright
c5162d14d046d9808bf12adac2885473 usr/share/info/hello.info.gz
29b51e7fcc9c18e989a69e7870af6ba2 usr/share/man/man1/hello.1.gz
各ファイルのハッシュ値はmd5sumコマンドで確認することが可能です。
~/hello$ md5sum usr/bin/hello
e990a5299a3412f6d4f7d39e0e0c0a01 usr/bin/hello
usr/bin/helloファイルはハッシュ値が等しいかったため、整合性が取れていることが確認できました。
usr
usrディレクトリ配下のファイルは、パッケージをインストールしたときに/usr/binや/usr/shareなどのディレクトリ配下に配置されます。例えば、helloパッケージをインストールした場合、/usr/bin配下にusr/bin/helloが置かれます。
usr/bin/hello
helloファイルは実行可能なバイナリファイルです。helloパッケージインストール後、コマンドラインからhelloコマンドを実行することでhelloファイルが実行され、”Hello, World!“メッセージを表示させることができます。
~hello$ hello
Hello, world!
usr/share/doc/hello
usr/share/doc/helloディレクトリは、helloパッケージに関するドキュメントが置かれています。各ファイルは以下のような内容となっています。
- NEWS.gz:helloプログラムの新機能や重要な変更点に関する情報が記載されています。
- changelog.Debian.gz:helloパッケージのバージョン履歴と各バージョンでの変更や修正内容が記録されています。
- copyright:helloプログラムの著作権情報やライセンス情報が記載されています。
usr/share/info
usr/share/infoディレクトリには、GNU Info システムによって使用されるドキュメントファイルが格納されており、helloプログラムに関連するinfoドキュメント(hello.info.gz)が置かれています。
helloパッケージをインストールすると、「info hello」コマンドを実行するとhelloパッケージのinfoドキュメントを表示することが可能です。
~$ info hello
Next: Overview, Up: (dir)
GNU Hello
*********
This manual is for GNU Hello (version 2.10, 19 July 2014), which prints
a friendly greeting (and serves as an example GNU package).
* Menu:
* Overview:: General purpose and information.
* Sample output:: Sample output from 'hello'.
* Invoking hello:: How to run 'hello'.
* Reporting bugs:: Sending bug reports and feature suggestions.
* GNU Free Documentation License:: Copying and sharing this documentation.
* Concept index:: Index of concepts.
usr/share/man
usr/share/manディレクトリは、helloコマンドにか関するマニュアルページ(manページ)が格納されています。このディレクトリ内のファイルはhelloコマンドの使い方、オプション、動作に関する公式ドキュメントを提供します。
helloパッケージをインストールすると、「man hello」コマンドを実行することでhelloコマンドのマニュアルを表示することが可能です。
今回展開したhelloパッケージではmanディレクトリの下にman1ディレクトリがありその下にドキュメントファイル(hello.1.gz)が格納されています。このディレクトリはカテゴリを識別するためのものです。man1は一般的なユーザーコマンドのマニュアルのカテゴリを意味しています。
~$ man hello
HELLO(1) User Commands HELLO(1)
NAME
hello - friendly greeting program
SYNOPSIS
hello [OPTION]...
DESCRIPTION
Print a friendly, customizable greeting.
-h, --help
display this help and exit
-v, --version
display version information and exit
-t, --traditional
use traditional greeting
-g, --greeting=TEXT
use TEXT as the greeting message
まとめ
今回の記事では、Debianパッケージの概要とhelloパッケージをもとにパッケージの中身について解説しました。本記事ではざっくりとした内容しか説明できていないので、より具体的な内容に興味あればDebianの公式ページ等で確認お願いできればと思います。
また、パッケージの作成方法についても記事を書いたのでもしよければ読んでいただければ幸いです。
引き続きよろしくお願いします。
参考文献
- Debianパッケージ公式サイト (https://www.debian.org/distrib/packages)
脚注
- ここでのCPUアーキテクチャは、命令セットアーキテクチャ(ISA)のことを指します。命令セットアーキテクチャ(ISA)の詳細に関しては「命令セットアーキテクチャ(Instruction Set Architecture:ISA)について分かりやすく解説」の記事を参考にしてください。 ↩︎