RPMパッケージの情報を調べるには

 RPMパッケージでプログラムをインストール/アップデート/アンインストールする場合、システムに入っているRPMパッケージのバージョン番号を調べる必要がある。

 インストール済みのパッケージを調べるには、「-qa」オプション付きでrpmコマンドを実行する。ただし、そのまま実行すると、システムにインストールされている全RPMパッケージが表示されるので、grepコマンドと組み合わせて、目的のパッケージを検索するといい。

 例えば、BINDのRPMパッケージを表示するには、以下のコマンドを実行する。

# rpm -qa | grep bind
bind-8.2.2P5-1
bind-utils-8.2.2P5-1
ypbind-3.3-16

 RPMパッケージの情報を表示するには、「-qi」オプションを使用する。

# rpm -qi bind
Name        : bind                      Relocations: (not relocatable)
Version     : 8.2.2P5                        Vendor: (none)
Release     : 1                          Build Date: Thu Nov 25 13:34:59 1999
Install date: Sat Feb 12 04:58:51 2000   Build Host: build.turbolinux.co.jp
Group       : System Environment/Daemons Source RPM: bind-8.2.2P5-1.src.rpm
Size        : 1141347                       License: distributable
URL         : http://www.isc.org/bind.html
Summary     : An Internet name server.
Description :
Bind includes the named name server, which resolves host names to IP
addresses (and vice versa), and a resolver library (a set of routines
(省略)

 インストールされたRPMパッケージのディレクトリを調べるには、「-ql」オプションを使用する。

# rpm -ql bind
/etc/rc.d/init.d/named
/etc/rc.d/rc0.d/K45named
/etc/rc.d/rc1.d/K45named
/etc/rc.d/rc2.d/K45named
/etc/rc.d/rc3.d/S55named
(省略)

 また、プログラムなどがどのRPMパッケージに入っているかを調べるには、「-qf」オプションを使用する。

# rpm -qf /etc/rc.d/init.d/named
bind-8.2.2P5-1

プログラムをi686に最適化するには

 「i386用」となっているRPMは、x86系CPUを搭載しているPCのほとんどで利用できる。しかし、i386用は最大公約数的なものであり、最新のCPUの機能を十分に活用しているとはいえない。そこで、SRPMからi686に最適化したRPMファイルを作成し、それをインストールする手順を紹介する。i686に最適化したからといって必ずしも体感速度が向上するわけではないが、数値演算を多用するプログラムなどは処理時間が短くなる可能性がある。

 今回は、OpenOffice.orgをi686に最適化してみる。使用したディストリビューションはFedora Core 2だ。Fedora Core 2のFTPサイトからFedora Projectが作成したOpenOffice.orgのSRPMファイルをダウンロードする。Fedora Core 2が採用しているのは、OpenOffice.org 1.1.1で、ファイル名はopenoffice.org-1.1.1-4.src.rpmだ。

 ダウンロードしたファイルを適当なディレクトリに保存し、rpmbuildコマンドでRPMファイルを作成する。その際に、「--target i686」というオプションを付ける。これが、i686に最適化したRPMファイルを作成する指定だ。ちなみに、x86系のCPUで指定可能なオプションには、以下のようなものがある。

オプション
対応CPU
i386 i386およびその互換CPU
i486 i486およびその互換CPU
i586 Pentium、MMX Pentiumおよびその互換CPU
i686 Pentium Pro、Pentium II、Pentium III、Pentium4、Celeronなど
k6 K6、K6-2、K6-III
athlon Athlon、Athlon MP、Athlon XP
x86_64 Opteron、Athlon64、Xeon(EM64T)

 rootになって以下のコマンドを実行すると、i686に最適化したRPMファイルが作成される。

# rpmbuild --rebuild --target i686 openoffice.org-1.1.1-4.src.rpm

 OpenOffice.orgは非常に大きなプログラムなので、RPMファイルの作成には長い時間が必要となる。1GHzのCeleronで実行したところ、14時間以上かかった。また、リビルドにはディスクにかなりの空き容量が必要だ(7GBの空きがあるシステムでリビルドに成功)。

 RPMファイルは、/usr/src/redhat/RPMS/i686というディレクトリに作成される。

# cd /usr/src/redhat/RPMS/i686
# ls
openoffice.org-1.1.1-4.i686.rpm            openoffice.org-i18n-1.1.1-4.i686.rpm
openoffice.org-debuginfo-1.1.1-4.i686.rpm  openoffice.org-libs-1.1.1-4.i686.rpm

 RPMファイルは、以下のようにインストールする。ファイル名に「debuginfo」と入ったRPMファイルも作成されるが、これはインストールする必要はない。また、使用したシステムでは一部のファイルがコンフリクトしているというエラーメッセージが表示されたため、--forceオプションを付けてアップデートした。

# rpm -Uhv --force openoffice.org-1.1.1-4.i686.rpm openoffice.org-i18n-1.1.1-4.i686.rpm openoffice.org-libs-1.1.1-4.i686.rpm
Preparing...                ################################# [100%]
   1:openoffice.org-libs    ################################# [ 33%]
   2:openoffice.org-i18n    ################################# [ 67%]
   3:openoffice.org         ################################# [100%]

インストールされているファイルをオリジナルと比較するには

 システムのクラックやウイルス感染、操作ミスなどによって、システムにとって重要なファイルが変更されている可能性があるときは、rpmコマンドを-Vオプション付きで実行することにより、インストールされているファイルがインストール直後と異なっているかどうかを比較できる。

 ファイルの比較は、各ファイルのサイズ、MD5のチェックサム、許可属性、ファイルの種類、所有者およびグループなどについて行われる。比較の結果は、以下のように8文字の文字列と設定ファイルの場合はそれを表す「c」という文字、そしてファイル名という形式で表示される。

S.5....T  c /etc/yum.conf

 
記号
意味
S ファイルサイズが異なる
M モード(許可属性とファイルの種類を含む)が異なる
5 MD5チェックサムが異なる
D デバイスファイルが異なる
L シンボリックリンクが異なる
U ユーザーが異なる
G グループが異なる
T 改変時間(mtime)が異なる
? 不明の理由により異なる

 すべてのRPMパッケージを検証するには、-Vaオプションだけでrpmコマンドを実行する。

# rpm -Va
(省略)
S.5....T  c /etc/yum.conf
.......T    /usr/share/icons/locolor/16x16/apps/ktimemon.png
(省略)
全ファイルを検証

 特定のRPMパッケージに含まれるファイルについて検証するときは、パッケージを指定する。

# rpm -V samba-common
S.5....T  c /etc/samba/smb.conf
特定のRPMパッケージを検証

 特定のファイルを検証するときは、ファイル名を指定する。

# rpm -Vf /etc/yum.conf
S.5....T  c /etc/yum.conf
特定のファイルを検証

最近インストールしたRPMパッケージを調べるには

 RPMパッケージをインストールしたりアップデートすると、その日時が記録される。そのため、rpmコマンドで--lastオプションを指定すると、新しい順でインストール済みのパッケージを表示できる。以下のようにrpmコマンドを実行すると、最近インストールまたはアップデートしたRPMパッケージが表示される。

$ rpm -qa --last | head
j2re-1.4.2_01-fcs                         2003年10月21日 10時15分05秒
sane-backends-devel-1.0.9-5.1             2003年10月17日 18時26分28秒
mysql-server-3.23.58-1.9                  2003年10月17日 18時26分27秒
mysql-devel-3.23.58-1.9                   2003年10月17日 18時26分25秒
sane-backends-1.0.9-5.1                   2003年10月17日 18時26分19秒
mysql-3.23.58-1.9                         2003年10月17日 18時26分03秒
openssl-perl-0.9.7a-20                    2003年10月02日 11時04分29秒
openssl-devel-0.9.7a-20                   2003年10月02日 11時04分24秒
openssl096-0.9.6-23.9                     2003年10月02日 11時04分09秒
openssl096b-0.9.6b-12                     2003年10月02日 11時04分08秒

 headコマンドで最初の10行を表示しているが、これを指定しないとインストールされている全RPMファイルが表示されるので注意が必要だ。

 また、例えば、

$ rpm -qa --last | more

とすれば1画面ずつ確認できる。

$ rpm -qa --last | grep openssh
openssh-server-3.5p1-11                   2003年09月18日 11時03分19秒
openssh-clients-3.5p1-11                  2003年09月18日 11時03分18秒
openssh-askpass-gnome-3.5p1-11            2003年09月18日 11時03分17秒
openssh-askpass-3.5p1-11                  2003年09月18日 11時03分16秒
openssh-3.5p1-11                          2003年09月18日 11時03分15秒

のようにして、特定のRPMパッケージを検索することもできる。

ソースファイルからRPMファイルを作成するには

 インストールしたいプログラムが、tarボールのみで配布されていることも多い。しかし、ソースファイルをそのままコンパイル/インストールすると、RPMによる恩恵(インストール済みプログラムの検索やプログラムのアップグレードなど)が得られないので、プログラムはできるだけRPMファイルでインストールしたいものだ。

 「tarボールからRPMファイルを作成するには」で説明したとおり、SPECファイルが用意されていればrpmbuildコマンドでtarボールからRPMファイルを作成できる。しかし、ここで紹介するCheckInstallを使うと、SPECファイルが用意されていなくてもRPMファイルを作成できる。

 まず、CheckInstallのWebサイト(http://asic-linux.com.mx/~izto/checkinstall/)からソースファイルをダウンロードしてインストールする。原稿執筆時点での最新版は、checkinstall-1.6.0beta2だ。

$ tar zxvf checkinstall-1.6.0beta2.tgz
$ cd checkinstall-1.6.0beta2
$ make
$ su
Password:
# make install
# /usr/local/sbin/checkinstall
(省略)
Slackware [S], RPM [R] or Debian [D]?r ←「r」を入力して[Enter]キーを押す

This package will be built according to these values:

1 -  Summary: [ CheckInstall installations tracker, version 1.6.0beta2 ]
2 -  Name:    [ checkinstall ]
3 -  Version: [ 1.6.0beta2 ]
4 -  Release: [ 1 ]
5 -  License: [ GPL ]
6 -  Group:   [ Applications/System ]
7 -  Architecture: [ i386 ]
8 -  Source location: [ checkinstall-1.6.0beta2 ]
9 -  Alternate source location: [  ]
10 - Provides: [ checkinstall ]
11 - Requires: [  ]

Enter a number to change any of them or press ENTER to continue: ←[Enter]キーを押す

 以上で、/usr/src/redhat/RPMS/i386ディレクトリにcheckinstall-1.6.0beta2-1.i386.rpmというファイルが作成されるので、これをインストールする。

# rpm -ihv checkinstall-1.6.0beta2-1.i386.rpm
Preparing...            ####################################### [100%]
   1:checkinstall       ####################################### [100%]

 これでCheckInstallのインストール作業は終了だ。ここでは、checkinstallコマンドの動作確認のため、SylpheedのRPMファイルを作成してみる。Sylpheedのtarボールを展開したら、./configureコマンドを実行してMakefileを作成し、checkinstallコマンドを実行する。

$ tar jxf sylpheed-0.9.7.tar.bz2
$ cd sylpheed-0.9.7
$ ./configure
$ su
Password:
# /usr/local/sbin/checkinstall
(省略)
The package documentation directory ./doc-pak does not exist.
Should I create a default set of package docs? [y]:y ←「y」を入力して[Enter]キーを押す
(省略)
Please choose the packaging method you want to use.
Slackware [S], RPM [R] or Debian [D]?r ←「r」を入力して[Enter]キーを押す

Please write a description for the package.
End your description with an empty line or EOF.
>> ←[Enter]キーを押す

This package will be built according to these values:

1 -  Summary: [ Package created with checkinstall 1.6.0beta2 ]
2 -  Name:    [ sylpheed ]
3 -  Version: [ 0.9.7 ]
4 -  Release: [ 1 ]
5 -  License: [ GPL ]
6 -  Group:   [ Applications/System ]
7 -  Architecture: [ i386 ]
8 -  Source location: [ sylpheed-0.9.7 ]
9 -  Alternate source location: [  ]
10 - Provides: [ sylpheed ]
11 - Requires: [  ]

Enter a number to change any of them or press ENTER to continue: ←[Enter]キーを押す

 以上で、/usr/src/redhat/RPMS/i386ディレクトリにsylpheed-0.9.7-1.i386.rpmが作成される。

# ls -l /usr/src/redhat/RPMS/i386/
合計 13072
(省略)
-rw-r--r--    1 root     root      1533239 11月 30 02:44 sylpheed-0.9.7-1.i386.rpm

RPMパッケージからファイルを取り出すには

 rpmコマンドの問い合わせ機能はインストールしたファイルが対象となるため、インストール前にRPMファイルにどのようなファイルが含まれているかを調べたり、一部のファイルを取り出したりすることはできない。

 インストール前にそのようなことを行いたいときは、RPMパッケージをcpio形式のアーカイブファイルに変換して、そこからファイルの一覧を表示したり、ファイルを取り出せばいい。

 RPMファイルをcpioファイルに変換するには、rpm2cpioコマンドを使う。また、cpio形式のアーカイブファイルからファイルを取り出したり、ファイルの一覧を表示するにはcpioコマンドを使用する。

 例えば、smartmontools-5.23-1.i386.rpmというRPMファイルに含まれるファイルを一覧表示するには、以下のコマンドを実行する。

$ rpm2cpio smartmontools-5.23-1.i386.rpm | cpio --list
./etc/rc.d/init.d/smartd
./etc/smartd.conf
./usr/sbin/smartctl
./usr/sbin/smartd
(省略)

 また、smartmontools-5.23-1.i386.rpmに含まれるファイルを取り出すには、作業用のディレクトリを作成して、そのディレクトリから以下のコマンドを実行する。すると、本来ファイルがインストールされるはずのディレクトリが作成され、その下にファイルが作られる。

$ mkdir work
$ cd work
$ rpm2cpio ../smartmontools-5.23-1.i386.rpm | cpio -id
872 blocks
$ ls -l
合計 8
drwx------    3 nori     nori         4096 11月  4 06:19 etc
drwx------    4 nori     nori         4096 11月  4 06:19 usr
$ tree
.
|-- etc
|   |-- rc.d
|   |   `-- init.d
|   |       `-- smartd
|   `-- smartd.conf
`-- usr
    |-- sbin
    |   |-- smartctl
(省略)

Red Hat LinuxでRPMの依存関係を調べるには

 RPMパッケージのインストール時に、以下のように依存関係のエラーが発生することがある。

# rpm -ihv xxxxxx.rpm
エラー: 依存性の欠如:
        yyyyyy は xxxxxx に必要とされています

 Red Hat Linuxの場合はRPMのデータベースが用意されているので、該当するファイルがどのパッケージに入っているかを簡単に調べることができる。例えば、インストール時に「libldap.so.1」が存在しないというエラーが出たときは、以下のコマンドでどのパッケージにlibldap.so.1が入っているかを表示させることができる。

# rpm -q --redhatprovides libldap.so.1
openldap12-1.2.13-5

 上記の例では、libldap.so.1はopenldap12-1.2.13-5に入っていることが分かるので、openldap12-1.2.13-5も同時にインストールすればいいことになる。

tarボールからRPMファイルを作成するには

 Red Hat Linuxなどはパッケージ管理システムとしてRPMを採用しているが、インストールしたいプログラムがtarボールのみで配布されていることも多い。多くの場合、tarボールを展開してコンパイルを行い、インストールするのは簡単だ。しかし、この方法でインストールしたプログラムはRPMの管理からは外れてしまうので、RPMによって得られるサービス(インストール済みプログラムの検索やプログラムのアップグレードなど)が受けらない。

 tarボールで配布されているプログラムの中には、RPMファイルを作成するためのSPECファイルを含んでいるものがある。このような場合は、rpmbuildコマンドでtarボールからRPMファイルを作成できる。具体的には、-taオプションを付けてrpmbuildコマンドを実行する。

# rpmbuild -ta xine-lib-1-rc0a.tar.gz

 RPMファイルは、通常の場所(Red Hat Linuxの場合は/usr/src/redhat/RPMS/i386/)に作成される。SPECファイルのないtarボールに対してrpmbuildコマンドを実行すると、エラーが発生する。

# rpmbuild -ta xxxxx.tar.gz
error: Name field must be present in package: (main package)
(省略)