ひとりdebian勉強会 その1 .debファイル

ひそかに勉強会とか参加したいと思ってたりなのですが、地方民なのでなかなか足が踏みでてくれません。とはいえ、ひとりで調べて日記にでも書いておけば、突っ込んでくれる親切な方や初心者にも役に立つ情報が残せるはずだ!ということで、挑戦していきたいとおもいます。

決して、書くネタを無理矢理作ったわけじゃありません。*1

内容としてはパッケージ管理システムの中身を実際にみていこうかと思っています。

参考文献:
http://www.debian.org/doc/manuals/reference/ch-system.ja.html#s-pkg-basics

とりあえず、一番基本になりそうな.debファイルについて調べてみました。

今回の要点

  • .debファイルは debianバイナリパッケージ形式と呼ばれるファイル形式
  • .debファイルはarアーカイブ
  • .debファイルはdebian-binary, control.tar.gz, data.tar.gzで構成される。
  • data.tar.gzはルート(/)に展開されるファイル郡
  • control.tar.gzにはパッケージ情報やインストール時に実行されるスクリプト等が含まれる。

.debファイル

.debファイルはdebianバイナリパッケージファイル形式という形式だそうです。
.debファイルはただのarアーカイブで、debian-binary, control.tar.gz, data.tar.gzで構成されています。
.debファイルの詳しい形式については

$ man 5 deb

を参照してください。

hostnameパッケージを実際に展開してみました。

まずはダウンロード

$ wget http://snapshot.debian.net/archive/2009/03/02/debian/pool/main/h/hostname/hostname_2.95_amd64.deb

hostname_2.95_amd64.debがカレントディレクトリにダウンロードされます。

中身を確認してみます。

$ ar -t hostname_2.95_amd64.deb

arコマンドのオプションtを使うとアーカイブに含まれるファイルを確認できます。
実行結果は以下のとおりです。

debian-binary
control.tar.gz
data.tar.gz

3つのファイルで構成されていることが確認できます。

それぞれ実際に中身をみるので展開します。

ar -x hostname_2.95_amd64.deb

debian-binary

ファイル形式のバージョンが記述されたテキストファイルです。
ファイルの中身を確認してみると2.0と記述されているはずです。

$ cat debian-binary
2.0

control.tar.gz

control.tar.gzにはパッケージの情報やインストール時に実行されるスクリプトが含まれているそうです。中身をみてみましょう。

$ tar ztf data.tar.gz
./
./control
./md5sums

hostnameにはふたつのファイルしか含まれていませんが、パッケージによっては

  • preinst
  • postinst
  • prerm
  • postrm

などのファイルが含まれるようです。詳細は後日調べようとおもいます。

さて、controlファイルの中身も確認してみます。

$ tar zxf control.tar.gz ./control
$ cat control
Package: hostname
Version: 2.95
Architecture: amd64
Essential: yes
Maintainer: Daniel Baumann
Installed-Size: 84
Pre-Depends: libc6 (>= 2.7-1)
Section: base
Priority: required
Description: utility to set/show the host name or domain name
The hostname command can be used to either set or display the current host or
domain name of the system. This name is used by many of the networking programs
to identify the machine. The domain name is also used by NIS/YP.

apt-cache showやaptitude showで確認できる情報の一部であることに気づくでしょうか。
以下のようなコマンドと比較してみるといいと思います。

$ dpkg --info hostname_2.95_amd64.deb
$ apt-cache show hostname
$ aptitude show hostname
$ LANG=C aptitude show hostname

aptitudeは日本語環境だと日本語になるようなのでLANG=Cも用意してみました。

data.tar.gz

data.tar.gzにはインストールされるファイルそのものが詰め込んであるようです。
同様に中身をみてみましょう。

$ tar ztf data.tar.gz
./
./usr/
./usr/share/
./usr/share/doc/
./usr/share/doc/hostname/
./usr/share/doc/hostname/copyright
./usr/share/doc/hostname/changelog.gz
./usr/share/man/
./usr/share/man/man1/
./usr/share/man/man1/hostname.1.gz
./usr/share/man/fr/
./usr/share/man/fr/man1/
./usr/share/man/fr/man1/hostname.1.gz
./bin/
./bin/hostname
./bin/dnsdomainname
./usr/share/man/man1/dnsdomainname.1.gz

ルート(/)で展開するだけよさそうな感じです。

hostnameパッケージをインストールされるファイルを確認するdpkg -Lと比較してみるとよいと思います。

$ dpkg -L hostname
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/hostname
/usr/share/doc/hostname/copyright
/usr/share/doc/hostname/changelog.gz
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/hostname.1.gz
/usr/share/man/fr
/usr/share/man/fr/man1
/usr/share/man/fr/man1/hostname.1.gz
/bin
/bin/hostname
/bin/dnsdomainname
/usr/share/man/man1/dnsdomainname.1.gz

まとめ

これらのファイル構成から単純なパッケージファイルであれば、data.tar.gzをルートディレクトリに展開するだけのようです。実際には設定や依存関係が絡みますし、インストール状態なども保持しないといけません。controlファイルを用いてdpkgコマンドがなんとかしてくれるのだと予測ができます。今後はこのあたりの動作を追っていこうと思います。

たぶん、つづく。

*1:実際、日記に書こうと思って書き殴ったメモが整理されずに残ってるんだからね!