ひとりDebian勉強会 その2 dpkg-deb

前回から2ヶ月近くあきましたが、そろそろ書かないと忘れてしまいそうです。すでに忘れてますが。

前回はバイナリパッケージ(.deb ファイル)の構造を確認し、手動で展開しましたが、dpkg-debを使うとこれを簡単に行うことができます。他にもバイナリパッケージを作成したり、情報を確認したりできます。

ということで、今回はdpkg-debを試してみます。
ここでは実例を紹介する程度ですので、詳細はdpkg-deb(1)を参照してください。

$ man dpkg-deb

今回の要点

  • バイナリパッケージを作るにはdpkg-debを使う。(--buld -b) (次回にまわします。)
  • バイナリパッケージを展開するにはdpkg-debを使う。(--extract -x)
  • バイナリパッケージの含まれるファイルを確認するにはdpkg-debを使う。(--contents -c)
  • バイナリパッケージから制御ファイルをとりだすにはdpkg-debを使う。(--control -e)
  • バイナリパッケージから制御ファイルを確認するにはdpkg-debを使う。(--field -f)
  • バイナリパッケージの情報を確認するにはdpkg-debを使う。(--info -I)
  • とりあえず、バイナリパッケージをなにやらするのはdpkg-deb(書くのにつかれた)

バイナリパッケージを作る。dpkg-deb --buld

バイナリパッケージが作れます。順序の都合、次回解説する予定。

バイナリパッケージを展開する。 dpkg-deb --extract

パイナリパッケージの中身をとりだします。平たくいうと、バイナリパッケージに含まれたdata.tar.gzを展開します。実際にhostname_2.95_amd64.deb(第1回で使ったものです。)で、試してみます。
カレントディレクトリのhostnameに展開してみます。

$ dpkg-deb --extract hostname_2.95_amd64.deb hostname
$ find hostname
hostname
hostname/bin
hostname/bin/dnsdomainname
hostname/bin/hostname
hostname/usr
hostname/usr/share
hostname/usr/share/man
hostname/usr/share/man/fr
hostname/usr/share/man/fr/man1
hostname/usr/share/man/fr/man1/hostname.1.gz
hostname/usr/share/man/man1
hostname/usr/share/man/man1/dnsdomainname.1.gz
hostname/usr/share/man/man1/hostname.1.gz
hostname/usr/share/doc
hostname/usr/share/doc/hostname
hostname/usr/share/doc/hostname/copyright
hostname/usr/share/doc/hostname/changelog.gz

dpkg -L hostnameや前回のtar ztf data.tar.gzと比較してみましょう。

    • extractの省略形は-xになりますので、以下のようにしてもよいです。
$ dpkg-deb --extract hostname_2.95_amd64.deb hostname

バイナリパッケージに含まれるファイルを確認する (--contents -c)

中身だけ確認したいんだよ!ってときに使います。
文章で書くより見たほうが早いです。

$ dpkg-deb --contents hostname_2.95_amd64.deb
drwxr-xr-x root/root         0 2007-12-28 00:50 ./
drwxr-xr-x root/root         0 2007-12-28 00:50 ./usr/
drwxr-xr-x root/root         0 2007-12-28 00:50 ./usr/share/
drwxr-xr-x root/root         0 2007-12-28 00:50 ./usr/share/doc/
drwxr-xr-x root/root         0 2007-12-28 00:50 ./usr/share/doc/hostname/
-rw-r--r-- root/root      1089 2007-11-15 07:22 ./usr/share/doc/hostname/copyright
-rw-r--r-- root/root      2447 2007-12-27 20:47 ./usr/share/doc/hostname/changelog.gz
drwxr-xr-x root/root         0 2007-12-28 00:50 ./usr/share/man/
drwxr-xr-x root/root         0 2007-12-28 00:50 ./usr/share/man/man1/
-rw-r--r-- root/root      1709 2007-12-28 00:50 ./usr/share/man/man1/hostname.1.gz
drwxr-xr-x root/root         0 2007-12-28 00:50 ./usr/share/man/fr/
drwxr-xr-x root/root         0 2007-12-28 00:50 ./usr/share/man/fr/man1/
-rw-r--r-- root/root      1176 2007-12-28 00:50 ./usr/share/man/fr/man1/hostname.1.gz
drwxr-xr-x root/root         0 2007-12-28 00:50 ./bin/
-rwxr-xr-x root/root     11712 2007-12-28 00:50 ./bin/hostname
-rwxr-xr-x root/root     11712 2007-12-28 00:50 ./bin/dnsdomainname
lrwxrwxrwx root/root         0 2007-12-28 00:50 ./usr/share/man/man1/dnsdomainname.1.gz -> hostname.1.gz

パーミッションやらも確認できてよい感じです。
-c が省略形になります。

パッケージファイルから制御情報ファイルをとりだす(--control -e)

data.tar.gzを展開しましたので.control側も展開したいです。--controlを使います。
hostname_controlに展開してみる例です。

$ dpkg-deb --control hostname_2.95_amd64.deb hostname_controln
$ find hostname_control
hostname_control
hostname_control/control
hostname_control/md5sums

tar ztf control.tar.gzの結果を比較してみるとよいかもしれません。
省略形は法則には(?)従わずに-eになるので注意です。

パッケージファイルに含まれる制御情報ファイルの中身を確認する。

いちいち展開してcontrolファイルなんて確認したくない人のために。

$ dpkg-deb --field hostname_2.95_amd64.deb
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.

特定の値だけみたい場合は引数を指定すると幸せになります。

$ dpkg-deb --field hostname_2.95_amd64.deb Pre-Depends
libc6 (>= 2.7-1)

忘れてしまってもgrep cutでなんとかしてしまいそうだとかいってはいけません。

$ dpkg-deb --field hostname_2.95_amd64.deb | grep Pre-Depends: | cut -d ' ' -f 2-
libc6 (>= 2.7-1)

バイナリパッケージの情報を確認するにはdpkg-debを使う。(--info -I)

fieldよりやや詳しい情報が得られます。

$ dpkg-deb --info hostname_2.95_amd64.deb
 新形式 debian パッケージ、バージョン 2.0。
 サイズ 12370 バイト: コントロールアーカイブ = 655 バイト。
     484 バイト、   13 行      control              
     373 バイト、    6 行      md5sums              
 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.

省略形は大文字となり、-Iです。

まとめ

dpkg-debについては次回もすこしつづく予定です。dpkg-debは公式パッケージ以外のどこかで拾ってきたdebファイルを確認するのに使うとよさそうです。