3.3 RPM—パッケージマネージャ

SUSE Linuxでは、RPM (RPM Package Manager)がソフトウェアパッケージを管理するのに使用されます。RPMの主要なプログラムは、rpmrpmbuildです。ユーザ、システム管理者、およびパッケージの作成者は、強力なRPMデータベースでクエリーを行って、インストールされているソフトウェアに関する情報を取得できます。

rpmの基本的なモードは、ソフトウェア・パッケージのインストール、アンインストール、またはアップデート、RPMデータベースの再構築、RPMベースまたは個別RPMアーカイブのクエリー、パッケージの整合性チェック、パッケージの署名の5つです。 rpmbuildは、基本ソースからインストール可能パッケージをビルドするために使用できます。

インストール可能なRPMアーカイブは、特殊なバイナリ形式でパックされています。それらのアーカイブは、インストールするプログラムファイルとある種のメタ情報で構成されます。 メタ情報は、ソフトウェアパッケージを設定するためにrpmによってインストール時に使用されるか、または文書化の目的でRPMデータベースに格納されています。通常、RPMアーカイブには拡張子.rpmが付けられます。

[Tip]ソフトウェア開発パッケージ

多くのパッケージにおいて、ソフトウェア開発に必要なコンポーネント(ライブラリ、ヘッダ、インクルードファイルなど)は、別々のパッケージに入れられています。それらの開発パッケージは、最新のGNOMEパッケージのように、ソフトウェアを自分自身でコンパイルする場合にのみ、必要になります。それらのパッケージは、パッケージalsa-develgimp-develkdelibs3-develなどのように、名前の拡張子-develで識別できます。

3.3.1 パッケージの信頼性の検証

SUSE Linux RPMパッケージにはGnuPG署名があります。フィンガープリントを含む鍵は、次のとおりです。


1024D/9C800ACA 2000-10-19 SuSE Package Signing Key <build@suse.de>
Key fingerprint = 79C1 79B2 E1C8 20C1 890F  9994 A84E DAE8 9C80 0ACA

rpm --checksig package-1.2.3.rpmコマンドを使用して、RPMパッケージの署名を検証し、パッケージが本当にSUSE Linuxから提供されたものか、他の信頼できる機関から提供されたものか判定できます。これは、インターネットからアップデートパッケージを入手する場合には、特に推奨されます。SUSE Linuxのパブリックパッケージ用の署名キーは通常、/root/.gnupg/にあります。バージョン8.1以降、キーは、ディレクトリ/usr/lib/rpm/gnupg/も格納されており、一般ユーザがRPMパッケージの署名を検証できるようになっています。

3.3.2 パッケージの管理:インストール、アップデート、およびアンインストール

一般に、RPMアーカイブのインストールは非常に簡単です。rpm -i package.rpmを使用します。このコマンドで、パッケージをインストールできます。 ただし、依存関係が満たされており、他のパッケージとの競合がない場合に限られます。rpmでは、依存関係の要件を満たすためにインストールしなければならないパッケージがエラーメッセージで要求されます。バックグランドで、RPMデータベースは競合が起きないようにします。 ある特定のファイルは、1つのパッケージだけにしか属せません。別のオプションを選択すると、rpmにこれらのデフォルト値を無視させることができますが、この処置を行うのは専門知識のある人に限られます。それ以外の人が行うと、システムの整合性を危うくするリスクが発生し、システムアップデート機能が損なわれる可能性があります。

-Uまたは--upgrade-Fまたは--freshenの各オプションは、パッケージをアップデートするのに使用できます。 たとえば、rpm -F package.rpmです。このコマンドは、古いバージョンのファイルを削除し、新しいファイルをただちにインストールします。2つのバージョン間の違いは、-Uがシステムに存在していなかったパッケージをインストールするのに対して、-Fがインストールされていたパッケージを単にアップデートする点にあります。アップデートする際、rpmは、以下のストラテジーに基づいて設定ファイルを注意深くアップデートします。

  • 設定ファイルがシステム管理者によって変更されていない場合、rpmは新しいバージョンの適切なファイルをインストールします。システム管理者は、何も行う必要はありません。

  • アップデートの前に設定ファイルがシステム管理者によって変更されている場合、rpmは変更されたファイルに拡張子.rpmorigまたは.rpmsave (バックアップファイル)を付けて保存し、新しいパッケージからファイルをインストールします。 ただしこれは、元々インストールされていたファイルと新しいファイルのバージョンが異なる場合に限ります。異なる場合は、バックアップファイル(.rpmorigまたは.rpmsave)と新たにインストールされたファイルを比較して、新しいファイルに再度、変更を加えます。後ですべての.rpmorig.rpmsaveファイルを必ず削除して、今後のアップデートで問題が起きないようにします。

  • 設定ファイルがすでに存在しており、またnoreplaceラベルが.specファイルで指定されている場合、.rpmnewファイルが作成されます。

アップデートが終了したら、.rpmsaveファイルと.rpmnewファイルは、比較した後、将来のアップデートの妨げにならないように削除する必要があります。ファイルがRPMデータベースで認識されなかった場合、ファイルには拡張子.rpmorigが付けられます。

認識された場合には、.rpmsaveが付けられます。言い換えれば、.rpmorigは、RPM以外の形式からRPMにアップデートした結果として付けられます。.rpmsaveは、古いRPMから新しいRPMにアップデートした結果として付けられます。.rpmnewは、システム管理者が設定ファイルに変更を加えたかどうかについて、何の情報も提供しません。それらのファイルのリストは、/var/adm/rpmconfigcheckにあります。設定ファイルの中には(/etc/httpd/httpd.confなど)、操作が継続できるように上書きされないものがあります。

-Uスイッチは、単に-eオプションでアンインストールして、-iオプションでインストールする操作と同じではありません。可能なときは必ず-Uを使用します。

パッケージを削除するには、rpm -e packageを入力します。 rpmは、解決されない依存関係がない場合にのみパッケージを削除します。他のアプリケーションがTcl/Tkを必要とする限り、Tcl/Tkを削除することは理論的に不可能です。その場合でも、RPMはデータベースに援助を求めます。他の依存関係がない場合でも、また、どのような理由、特殊な環境であってもそのような削除が不可能であれば、--rebuilddbオプションを使用して RPMデータベースを再構築するのが良いでしょう。

3.3.3 RPMとパッチ

システムの運用上のセキュリティを保証するには、ときどきアップデートパッケージをシステムにインストールする必要があります。以前は、パッケージ内のバグは、パッケージ全体を交換しなければ取り除けませんでした。大きいパッケージの場合、その中の小さなファイルにバグがあると、膨大な量のデータになってしまうことがありました。しかし、 SUSE RPMを使用すると、パッケージ内にパッチをインストールできます。

最も重要な考慮事項について、pineを例として説明します。

パッチRPMはシステムに適したものか。

これを検査するには、まずインストールされたパッケージでクエリーを行います。pineでは、以下のコマンドを実行します。

rpm -q pine
pine-4.44-188

パッチRPMがこのバージョンのpineに適しているかどうかを検査します。

rpm -qp --basedon pine-4.44-224.i586.patch.rpm 
pine = 4.44-188
pine = 4.44-195
pine = 4.44-207

このパッチは、3種類のバージョンのpineに適しています。例でインストールされたバージョンもリストされています。 パッチはインストールできます。

どのファイルがパッチで置き換えられるか。

パッチの影響を受けるファイルは、パッチRPMで簡単に見つけられます。rpm-Pパラメータを使用すると、特殊なパッチ機能を選択できます。次のコマンドでファイルをリストします。

rpm -qpPl pine-4.44-224.i586.patch.rpm
/etc/pine.conf
/etc/pine.conf.fixed
/usr/bin/pine

パッチがすでにインストールされていれば、次のコマンドを使用します。

rpm -qPl pine
/etc/pine.conf
/etc/pine.conf.fixed
/usr/bin/pine
パッチRPMをどのようにシステムにインストールするか。

パッチRPMは、通常のRPMと同様に使用されます。唯一の違いは、適切なRPMがすでにインストールされていなければならない点です。

どのパッチがシステムにインストールされており、それらはどのパッケージバージョンのものか。

システムにインストールされているすべてのパッチのリストは、コマンドrpm -qPaで表示できます。(この例のように)新しいシステムに1つのパッチだけがインストールされている場合、リストは次のようになります。

rpm -qPa
pine-4.44-224

後日、オリジナルとしてインストールされていたパッケージのバージョンを知りたい場合、その情報はRPMデータベースから得られます。pineの場合、その情報は次のコマンドで表示できます。

rpm -q --basedon pine
pine = 4.44-188

RPMのパッチ機能に関する情報を含む詳細な情報は、man rpmコマンドとrpmbuildコマンドのマニュアルページで収集できます。

3.3.4 デルタRPMパッケージ

デルタRPMパッケージには、RPMパッケージの新旧バージョン間の違いが含まれています。デルタRPMパッケージを古いRPMに適用すると、まったく新しいRPMになります。デルタRPMパッケージは、インストールされたRPMとも互換性があるので、古いRPMのコピーを保管する必要はありません。デルタRPMパッケージは、パッチRPMよりもさらに小さく、パッケージをインターネット上で転送するのに便利です。欠点は、デルタRPMが組み込まれたアップデート操作の場合、そのままのRPMまたはパッチRPMに比べて、CPUサイクルの消費が目立って多くなることです。YOUセッション中にYaSTでデルタRPMパッケージを使用するには、/etc/sysconfig/onlineupdate内でYOU_USE_DELTASyesに設定します。この場合、インストールメディアを準備しておいてください。YOU_USE_DELTASが空か、filesystemに設定されている場合、YOUでは、インストールされたファイルに適用するデルタパッケージをダウンロードします。この場合、インストールメディアは必要ありませんが、ダウンロード時間は長くなる場合があります。noに設定されている場合は、YOUはパッチRPMと通常のRPMのみを使用します。

prepdeltarpmwritedeltarpm、およびapplydeltarpmバイナリは、デルタRPMスィート(deltarpmパッケージ)の一部であり、デルタRPMパッケージの作成と適用に際して役立ちます。以下のコマンドを使用して、new.delta.rpmというデルタRPMを作成します。以下のコマンドでは、old.rpmおよびnew.rpmが存在することが前提となります。

prepdeltarpm -s seq -i info old.rpm > old.cpio
prepdeltarpm -f new.rpm > new.cpio

xdelta delta -0 old.cpio new.cpio delta

writedeltarpm new.rpm delta info new.delta.rpm
rm old.cpio new.cpio delta

古いパッケージがすでにインストールされていれば、applydeltarpmを使用して、ファイルシステムから新たにRPMを構築できます。

applydeltarpm new.delta.rpm new.rpm

ファイルシステムにアクセスすることなく、古いRPMから構築するには、-rオプションを使用します。

applydeltarpm -r old.rpm new.delta.rpm new.rpm
  

技術的な詳細については、/usr/share/doc/packages/deltarpm/READMEを参照してください。

3.3.5 RPMクエリー

-qオプションを使用すると、rpmはクエリーを開始し、(-pオプションを追加することにより) RPMアーカイブを検査できるようにして、インストールされたパッケージのRPMデータベースでクエリーを行えるようにします。必要な情報の種類を指定する複数のスイッチを使用できます。表 3.6. 「最も重要なRPMクエリーのオプション」を参照してください。

表 3.6 最も重要なRPMクエリーのオプション

-i

パッケージ情報

-l

ファイルリスト

-f FILE

ファイルFILEを含むパッケージでクエリーを行います(FILEにはフルパスを指定する必要があります)。

-s

ステータス情報を含むファイルリスト(-lを暗示指定)

-d

ドキュメントファイルだけをリストします (-lを暗示指定)。

-c

設定ファイルだけをリストします(-lを暗示指定)。

--dump

詳細情報を含むファイルリスト(-l-c、または-d と共に使用します)

--provides

他のパッケージが--requiresで要求できるパッケージの機能をリストします。

--requires, -R

パッケージが要求する機能

--scripts

インストールスクリプト(preinstall、postinstall、uninstall)

たとえば、コマンドrpm -q -i wgetは、例 3.2. 「rpm -q -i wget」に示された情報を表示します。

例 3.2 rpm -q -i wget


Name        : wget                         Relocations: (not relocatable)
Version     : 1.9.1                             Vendor: SUSE LINUX AG, Nuernberg, Germany
Release     : 50                            Build Date: Sat 02 Oct 2004 03:49:13 AM CEST
Install date: Mon 11 Oct 2004 10:24:56 AM CEST      Build Host: f53.suse.de
Group       : Productivity/Networking/Web/Utilities   Source RPM: wget-1.9.1-50.src.rpm
Size        : 1637514                          License: GPL
Signature   : DSA/SHA1, Sat 02 Oct 2004 03:59:56 AM CEST, Key ID a84edae89c800aca
Packager    : http://www.suse.de/feedback
URL         : http://wget.sunsite.dk/
Summary     : A tool for mirroring FTP and HTTP servers
Description :
Wget enables you to retrieve WWW documents or FTP files from a server.
This can be done in script files or via the command line.
[...]

オプション-fが機能するのは、フルパスで完全なファイル名を指定した場合だけです。必要な数のファイル名を指定します。たとえば、次のコマンドを実行します。

rpm -q -f /bin/rpm /usr/bin/wget

出力は次のとおりです。

rpm-4.1.1-191
wget-1.9.1-50

ファイル名の一部分しかわからない場合は、例 3.3. 「パッケージを検索するスクリプト」に示すようなシェルスクリプトを使用します。実行するときに、ファイル名の一部を、パラメータとして示されるスクリプトに渡します。

例 3.3 パッケージを検索するスクリプト

#! /bin/sh
for i in $(rpm -q -a -l | grep  $1); do
    echo "\"$i\" is in package:"
    rpm -q -f $i
    echo ""
done

rpm -q --changelog rpmコマンドは、特定のパッケージに関する詳細な変更情報を日付順に表示します。この例は、rpmパッケージに関する情報を示します。

インストールされたRPMデータベースを使うと、確認検査を行うことができます。それらの検査は、-V-y、または--verifyオプションを使用して開始します。このオプションを使うと、rpmは、パッケージ内にあり、インストール以降変更されたことがあるすべてのファイルを表示します。rpmは、次の変更に関するヒントを表示するのに、8文字の記号を使用します。

表 3.7 RPM確認オプション

5

MD5チェックサム

S

ファイルサイズ

L

シンボリックリンク

T

変更時間

D

メジャーデバイス番号とマイナーデバイス番号

U

所有者

G

グループ

M

モード (許可とファイルタイプ)

設定ファイルの場合は、文字cが表示されます。/etc/wgetrc (wget)に対する変更例を以下に示します。

rpm -V wget
S.5....T c /etc/wgetrc

RPMデータベースのファイルは、/var/lib/rpmに格納されています。パーティション/usrのサイズが1 GBであれば、このデータベースは、完全なアップデート後、およそ30 MB占有します。データベースが予期していたよりもはるかに大きい場合は、オプション--rebuilddbでデータベースを再構築するようにします。再構築する前に、古いデータベースのバックアップを作成しておきます。cronスクリプトのcron.dailyは、データベースのコピー(gzip でパックされる)を毎日作成し、/var/adm/backup/rpmdbに格納します。コピーの数は、変数MAX_RPMDB_BACKUPS (デフォルト:5)によって制御されます。この変数は/etc/sysconfig/backupにあります。1つのバックアップのサイズは、1GBの/usrに対しておよそ1MBです。

3.3.6 ソースパッケージのインストールとコンパイル

SUSE Linuxのすべてのソースパッケージには、拡張子.src.rpm (ソース RPM)が付けられています。

[Tip]ティップ

ソースパッケージは、インストールメディアからハードディスクにコピーされ、YaSTを使用して展開できます。ただし、ソースパッケージは、パッケージマネージャでインストール済み([i])というマークは付きません。これは、ソースパッケージがRPMデータベースに入れられないためです。インストールされたオペレーティングシステムソフトウェアだけがRPMデータベースにリストされます。ソースパッケージをインストールする場合、ソースコードだけがシステムに追加されます。

(/etc/rpmrcなどのファイルでカスタム設定を指定していない限り)以下のディレクトリが、/usr/src/packagesの下でrpmrpmbuildから使用可能でなければなりません。

SOURCES

オリジナルのソース(.tar.gzファイルや.tar.gzファイルなど)とディストリビューション固有の調整ファイル(ほとんどの場合.difファイルや.patchファイル)用です。

SPECS

ビルド処理を制御する、メタMakefileに類似した.specファイル用です。

BUILD

すべてのソースは、このディレクトリでアンパック、パッチ、コンパイルされます。

RPMS

完成したバイナリパッケージが格納されます。

SRPMS

ソースRPMが格納されます。

YaSTでソースパッケージをインストールすると、必要なコンポーネントがすべて/usr/src/packagesにインストールされます。SOURCES内のソースおよび調整ファイルとSPECS内の関連.specファイルです。

[Warning]警告

システムコンポーネント(glibcrpmsysvinitなど)で実験してはいけません。 システムが正しく動作しなくなります。

次の例は、wget.src.rpmパッケージを使用します。YaSTでパッケージをインストールすると、以下のファイルが作成されるはずです。

/usr/src/packages/SOURCES/nops_doc.diff
/usr/src/packages/SOURCES/toplev_destdir.diff
/usr/src/packages/SOURCES/wget-1.9.1+ipvmisc.patch
/usr/src/packages/SOURCES/wget-1.9.1-brokentime.patch
/usr/src/packages/SOURCES/wget-1.9.1-passive_ftp.diff
/usr/src/packages/SOURCES/wget-LFS-20040909.tar.bz2
/usr/src/packages/SOURCES/wget-wrong_charset.patch
/usr/src/packages/SPECS/wget.spec

rpmbuild -b X /usr/src/packages/SPECS/wget.specコマンドは、コンパイルを開始します。Xは、ビルド処理のさまざまな段階に対して使用されるワイルドカードです(詳細については、--helpの出力またはRPMのドキュメントを参照してください)。以下に簡単な説明を示します。

-bp

/usr/src/packages/BUILDにソースを配置し、アンパックしてパッチを適用します。

-bc

-bpと同じですが、コンパイルを実行します。

-bi

-bpと同じですが、ビルドしたソフトウェアをインストールします。注意:パッケージがBuildRoot機能をサポートしていない場合は、設定ファイルが上書きされることがあります。

-bb

-biと同じですが、バイナリパッケージを作成します。コンパイルに成功すると、バイナリパッケージは、/usr/src/packages/RPMSに作成されるはずです。

-ba

-bbと同じですが、ソース RPMを作成します。コンパイルに成功すると、バイナリは/usr/src/packages/SRPMSに作成されるはずです。

--short-circuit

一部のステップをスキップします。

作成されたバイナリRPMは、rpm -iコマンドまたはrpm -Uコマンドでインストールできます。rpmを使用したインストールは、RPMデータベースに登場します。

3.3.7 buildによるRPMパッケージのコンパイル

多くのパッケージにつきものの不都合は、ビルド処理中に不要なファイルが稼働中のシステムに追加されてしまうことです。これを回避するには、パッケージのビルド先の定義済みの環境を作成するbuildを使用します。このchroot環境を確立するには、build スクリプトが完全なパッケージツリーと共に提供されなければなりません。パッケージツリーは、NFS経由で、またはDVDから ハードディスク上で利用できるようにすることができます。build --rpms directoryで、位置を指定します。rpmとは異なり、buildコマンド はソースディレクトリでSPECファイルを探します。(上記の例と同様に)システムで/media/dvdの下にマウントされているDVDでwgetをビルドするには、rootユーザーで以下のコマンドを使用します。

cd /usr/src/packages/SOURCES/
mv ../SPECS/wget.spec .
build --rpms /media/dvd/suse/ wget.spec

これで、最小限の環境が/var/tmp/build-rootに確立されます。パッケージは、この環境でビルドされます。処理が完了すると、ビルドされたパッケージは/var/tmp/build-root/usr/src/packages/RPMSに格納されます。

buildスクリプトでは、他のオプションも多数使用できます。たとえば、スクリプトがユーザ独自のRPMを処理するようにするには、ビルド環境の初期化を省略するか、rpmコマンドの実行を上記のビルド段階のいずれかに制限します。build --helpコマンドとman buildコマンドで、詳細な情報が得られます。

3.3.8 RPMアーカイブとRPMデータベース用のツール

Midnight Commander (mc)は、RPMアーカイブの内容を表示し、それらの一部をコピーできます。アーカイブを仮想ファイルシステムとして表し、Midnight Commanderの通常のメニューオプションを使用できます。F3HEADERを表示します。カーソルキーとEnterを使ってアーカイブ構造を表示します。F5でアーカイブコンポーネントをコピーします。

KDEは、rpmのフロントエンドとしてkpackageツールを提供します。完全装備のパッケージマネージャが、YaSTモジュールとして使用可能です2.3.1項 「ソフトウェアのインストールと削除」 (↑起動)を参照)。