本文へジャンプ

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。プロフィールで選択した情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

  • 閉じる [x]

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


送信されたすべての情報は安全です。

  • 閉じる [x]

Linux の 101 試験対策: RPM および YUM によるパッケージ管理

新しいソフトウェアを追加して、システムを最新の状態に維持する

Ian Shields, Senior Programmer, IBM
Ian Shields
Ian Shields は、developerWorks Linux ゾーンの様々な Linux プロジェクトに関わっています。彼はノースキャロライナ州 Research Triangle Park にある IBM のシニア・プログラマーです。1973年にオーストラリアのキャンベラでシステム・エンジニアとして IBM に入社して以来、カナダのモントリオールやノースキャロライナ州 Research Triangle Park で、コミュニケーション・システムやパーベイシブ・コンピューティングに携わってきました。彼はいくつかの特許を保持しています。Australian National University にて純粋数学および哲学で学位を取得し、また North Carolina State University にてコンピューター・サイエンスで修士号と博士号を取得しています。Ian について詳しく知るには、My developerWorks で彼のプロフィールを見てください。

概要: Linux® システムでパッケージをインストール、アップグレード、および管理する方法を学んでください。この記事で焦点とするパッケージ管理ツールは、Red Hat によって開発された RPM (Red Hat Package Manager) と、最初は Duke 大学物理学部で Red Hat Linux システムを管理するために開発された YUM (Yellowdog Updater Modified) です。この記事の内容は、Linux のシステム管理者として認定するための LPI 101 試験に備えるためにも、新しいソフトウェアを追加してシステムを最新の状態に維持する最善の方法を知る上でも役立ちます。[注意深い読者からのご指摘を基に原文の誤植などに関する修正を加えました。詳細は原文記事の末尾にある「Comments」を参照してください (編集者より)。]

このシリーズの他の記事を見る

日付:  2012年 4月 19日 (公開: 2010年 5月 11日)
レベル: 中級 この記事の原文:  英語 PDF:  A4 and Letter (574 KB | 27 ページ)Adobe® Reader® が必要
アクティビティー: 24151 ビュー
お気軽にご意見・ご感想をお寄せください: 


この連載について

この連載は Linux システム管理タスクの学習に役立つだけでなく、LPIC-1 (Linux Professional Institute Certification レベル 1) 試験 に備えるための教材にもなります。

連載の各記事についての説明とリンクについては、developerWorks の LPIC-1 ロードマップを参照してください。現在進行中のこのロードマップは、LPIC-1 試験の最新の目標 (2009年 4月) を反映しています。完成した記事はその都度ロードマップに追加されていきますが、当面は developerWorks の LPI 認定試験対策チュートリアルで同様の教材の以前のバージョンを調べてください。これらのバージョンは、2009年 4月より前の LPIC-1 目標に対応しています。

概要

この記事では、Linux システム上で RPM および YUM ツールを使用してパッケージを管理する方法を学びます。この記事で説明する内容は以下のとおりです。

  • RPM および YUM を使用してパッケージをインストール、再インストール、アップグレード、および削除する方法
  • RPM パッケージに関する情報 (バージョン、ステータス、依存関係、完全性、署名など) を取得する方法
  • パッケージが提供するファイルを判別する方法と、特定のファイルが含まれるパッケージを見つける方法

この記事は、Linux Professional Institute Junior Level Administration (LPIC-1) 試験 101 の主題 102 の 102.5 の試験対策に役立ちます。この目標の重要度は 3 です。

前提条件

この連載の記事を最大限に活用するには、Linux の基礎知識と、記事に記載されたコマンドを演習できる実際の Linux システムが必要です。プログラムのバージョンによって出力のフォーマットに違いが出てくる場合もあるため、コマンドの実行結果は必ずしもここに記載するリストや図とまったく同じであるとは限りません。特に、記載する出力のほとんどは、お使いのシステムにインストールされているパッケージによって大きく左右されます。出力がかなり違っているとしても、重要な共通点は認識できるはずです。


パッケージの管理について

Ian とつながるには

Ian は developerWorks で人気の高いお馴染みの著者の 1 人です。Ian が書いたすべての developerWorks 記事を閲覧してみてください。また、My developerWorks では、Ian のプロフィールを調べることや、彼やその他の著者、そして他の読者とつながることができます。

かつて、Linux プログラムの多くはソース・コードとして配布されていました。このソース・コードを、ユーザーが必要な man ページ、構成ファイルなどと併せてビルドして 1 つのプログラム、あるいは一連のプログラムに組み込むという仕組みでしたが、最近では、ほとんどの Linux ディストリビューターが事前にビルドされたプログラムを使用しています。これらのプログラムのセットが、パッケージと呼ばれるものです。パッケージは、該当するディストリビューションにすぐにインストールできる状態で配送されます。この記事では、パッケージのインストール、更新、削除を支援するパッケージ管理ツールについて説明します。この記事で焦点とするのは、RPM (Red Hat Package Manager) および YUM (Yellowdog Updater Modified) です。RPM は Red Hat によって開発されたパッケージ管理ツールで、YUM は当初、Duke 大学物理学部で Red Hat Linux システムを管理するために開発されました。この連載の別の記事「Linux の 101 試験対策: Debian によるパッケージ管理」では、Debian システムで使用するパッケージ管理ツールについて説明しています。

ユーザーの目から見ると、基本的なパッケージ管理機能は一連のコマンドで提供されています。Linux の使い易さを向上させようとする Linux 開発者たちの努力の末、基本ツールは他のツールによって補完されるようになりました。その一例は GUI ツールです。GUI ツールによって、基本ツールの複雑さはある程度、エンド・ユーザーから隠されます。この記事と Debian のパッケージ管理について説明している記事では基本ツールを焦点としていますが、基本ツール以外のツールについても、皆さんが詳しく調べられるように取り上げています。

RPM、YUM、および APT (Debian システム用) には多くの共通点があります。具体的に言うと、この 3 つではすべて、パッケージのインストールと削除を行うことが可能で、インストールされているパッケージに関する情報はデータベースに保持されます。さらに、いずれも基本的なコマンドライン機能を備えていると同時に、ツールを追加することによって、よりユーザー・フレンドリーなインターフェースを提供することができます。また、インターネットからパッケージを取得できるという共通点もあります。

Linux システムをインストールするときには、さまざまなパッケージをインストールするのが通常です。インストールする一連のパッケージは、システムの用途 (サーバー、デスクトップ、または開発者のワークステーションなど) に合わせてカスタマイズすることができます。そしてある時点で、機能を追加するために新しいパッケージをインストールしなければならなくなったり、既存のパッケージの更新や、不要になったパッケージの削除や、新しいパッケージがリリースされたことで廃止されたパッケージの削除が必要になったりすることがあります。以降のセクションでは、これらのタスクを行う方法を説明するとともに、特定のコマンドが含まれている可能性のあるパッケージを見つけるなどといった、タスクに関連する課題に取り組みます。

RPM

Red Hat が 1995年に導入した RPM は、現在 LSB (Linux Standard Base) でパッケージ形式として使用されているパッケージ管理システムです。rpm コマンドのオプションは、以下の用途によって 3 つのグループに分けられます。

  • パッケージに対する問い合わせと検証
  • パッケージのインストール、アップグレード、および削除
  • その他の関数の実行

上記の 3 つのグループのうち、この記事では最初の 2 つのグループに分類されるコマンドのオプションに焦点を絞ります。その他の関数についての情報は、RPM の man ページを調べてください。

rpm は、RPM で使用する主要なコマンドのコマンド名であり、.rpm は RPM ファイルに使用する拡張子であることに注意してください。したがって一般に、「rpm ファイル」や「xxx rpm」と記述されている場合は RPM ファイルを意味し、単独で rpm と記述されている場合はコマンドを意味します。

YUM

YUM は RPM システムに自動更新機能と、依存関係の管理を含めたパッケージ管理機能を追加します。YUM はシステムにインストールされているパッケージを把握するだけでなく、Debian の APT (Advanced Packaging Tool) のようにリポジトリーと連動します。リポジトリーとはパッケージの集合のことで、通常はネットワーク接続を介してアクセスすることができます。


RPM パッケージのインストール

例えば、Lisp を習得したいというあなたに、同僚たちが gcl コマンドを使用するように提案したとします。そこであなたは、gcl --helpwhich gcl、あるいは type gcl を使ってみることにしました。けれどもシステムが gcl を見つけられないとすると、リスト 1 のような出力が表示されます。


リスト 1. 見つからない gcl コマンド
[ian@echidna ~]$ gcl --help
bash: gcl: command not found

[ian@echidna ~]$ which gcl
/usr/bin/which: no gcl in (/usr/lib64/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerber
os/bin:/usr/lib64/ccache:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/
sbin:/home/ian/bin)

[ian@echidna ~]$ type gcl
bash: type: gcl: not found

この場合、同僚のところに戻って、どのパッケージをインストールしたらよいかを尋ねるか、あるいは単純に、gcl コマンドは gcl パッケージの中にあるだろうと見当をつけることでしょう。大抵、この見当は外れませんが、いつも当たるとは限りません。正しいパッケージを見つける方法については後で説明しますが、この例で必要なのは、gcl パッケージです。gcl パッケージをすでにダウンロードしているか、そうでなければそのコピーを入手済みだとすると、パッケージをインストールするには -i (install の略) オプションを指定して rpm コマンドを実行します (リスト 2 を参照)。


リスト 2. rpm コマンドを使用した gcl のインストール (テイク 1)
[root@echidna ~]# rpm -i gcl-2.6.8-0.6.20090701cvs.fc12.x86_64.rpm
error: Failed dependencies:
gcl-selinux is needed by gcl-2.6.8-0.6.20090701cvs.fc12.x86_64

rpm コマンドは、このパッケージに依存関係があることを把握しますが、残念ながら依存関係を解決することまではしません。そのため、依存パッケージを取得してからもう一度インストールし、他にもまだ依存関係があるかどうかを確認するという作業を、すべての依存関係が満たされるまで繰り返す必要があります。1 つの利点は、rpm コマンドで、インストールするパッケージのリストを指定すると、すべての依存関係が満たされている場合には、すべてのパッケージが正しい順序でインストールされることです。したがって、少なくとも手動でパッケージを 1 つひとつ正しい順序でインストールする必要はありません。

Debian の APT を使ったことがあれば、RPM にも apt-get コマンドのような機能があればいいのにと思っていることでしょう。apt-get コマンドは、依存関係を含め、必要なパッケージを探してインストールしてくれます。RPM ベースのシステムの場合、このような機能を提供するのは YUM (Yellowdog Updater Modified) です。リスト 3 に、install オプションを指定して yum コマンドを使って、gcl とこのパッケージに必要な gcl-selinux パッケージをインストールする方法を示します。


リスト 3. yum コマンドを使用した gcl のインストール
[root@echidna ~]# yum install gcl
Loaded plugins: presto, refresh-packagekit
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package gcl.x86_64 0:2.6.8-0.7.20100201cvs.fc12 set to be updated
--> Processing Dependency: gcl-selinux for package: gcl-2.6.8-0.7.20100201cvs.fc12.x86_64
--> Running transaction check
---> Package gcl-selinux.x86_64 0:2.6.8-0.7.20100201cvs.fc12 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

=====================================================================================
 Package           Arch         Version                          Repository     Size
=====================================================================================
Installing:
 gcl               x86_64       2.6.8-0.7.20100201cvs.fc12       updates       6.3 M
Installing for dependencies:
 gcl-selinux       x86_64       2.6.8-0.7.20100201cvs.fc12       updates        17 k

Transaction Summary
=====================================================================================
Install       2 Package(s)
Upgrade       0 Package(s)

Total download size: 6.4 M
Installed size: 40 M
Is this ok [y/N]: y
Downloading Packages:
Setting up and reading Presto delta metadata
updates/prestodelta                                           | 964 kB     00:01     
Processing delta metadata
Package(s) data still to download: 6.4 M
(1/2): gcl-2.6.8-0.7.20100201cvs.fc12.x86_64.rpm              | 6.3 MB     00:12     
(2/2): gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64.rpm      |  17 kB     00:00     
-------------------------------------------------------------------------------------
Total                                                398 kB/s | 6.4 MB     00:16     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64                 1/2 
  Installing     : gcl-2.6.8-0.7.20100201cvs.fc12.x86_64                         2/2 

Installed:
  gcl.x86_64 0:2.6.8-0.7.20100201cvs.fc12                                            

Dependency Installed:
  gcl-selinux.x86_64 0:2.6.8-0.7.20100201cvs.fc12                                    

Complete!

リスト 3 の出力に示されているように、YUM は「updates」という名前のリポジトリー (後で説明します) で gcl.x86_64 0:2.6.8-0.7.20100201cvs.fc12 と gcl-selinux.x86_64 0:2.6.8-0.7.20100201cvs.fc12 を検出し、ダウンロードの合計サイズを決定しています。「y」で応答してトランザクションに同意すると、YUM はこの 2 つのパッケージをダウンロードした後、依存関係をインストールし、それから gcl をインストールします。依存関係については、後で詳しく説明します。

注: リスト 3 では、YUM はリスト 2 でインストールを試みた gcl パッケージのバージョンよりも新しいバージョンを検出しています。通常はパッケージの最新バージョンが必要になるはずですが、以前のバージョンが必要な場合には追加情報として以前のバージョンを指定することもできます。詳しくは yum コマンドの man ページで、パッケージ名の指定に関するセクションを参照してください。


パッケージの保管場所

前のセクションで RPM パッケージをインストールする方法を学びましたが、パッケージはどこにあるのでしょうか。yum はどうやってパッケージをダウンロードしてくる場所を知るのでしょうか。その場所を知るための出発点は /etc/yum.repos.d/ ディレクトリーです。ここには通常、複数の repo ファイルが格納されています。repo のデフォルト保管場所はこのディレクトリーですが、YUM 構成ファイル (通常は /etc/yum.conf) に他の場所を指定することもできます。リスト 4 に、前の手順で Fedora 12 システムにインストールした gcl の保管場所に対応する fedora-updates.repo を記載します。

典型的な repo ファイルは、標準パッケージ用、デバッグ・パッケージ用、そしてソース・パッケージ用の 3 つのセクションに分かれています。一般にディストリビューションのパッケージは、異なる保管場所 (ミラー) からそれぞれにコピーを入手することができます。そのため repo ファイルは yum に対し、セクションごとのミラーの最新リストを検索する場所を伝えるというわけです。ディストリビューションのリリース・レベルとマシンのアーキテクチャーはパラメーター化されていることに注意してください。したがってこの例の場合、yum は x86_64 Fedora 12 システム用のリストを https://mirrors.fedoraproject.org/metalink?repo=updates-released-f12&arch=x86_64 からダウンロードします。

repo ファイルにはリポジトリーの場所の他、特定のリポジトリーが有効化されているかどうか、そしてダウンロードしたパッケージをチェックするために GPG 署名を使用する必要があるかどうかも指定されます。


リスト 4. /etc/yum.repos.d/*.repo
[ian@echidna ~]$ cat /etc/yum.repos.d/fedora-updates.repo
[updates]
name=Fedora $releasever - $basearch - Updates
failovermethod=priority
#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever
/$basearch/
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-f$r
eleasever&arch=$basearch
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch

[updates-debuginfo]
name=Fedora $releasever - $basearch - Updates - Debug
failovermethod=priority
#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever
/$basearch/debug/
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-deb
ug-f$releasever&arch=$basearch
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch

[updates-source]
name=Fedora $releasever - Updates Source
failovermethod=priority
#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever
/SRPMS/
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-sou
rce-f$releasever&arch=$basearch
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch

YUM と RPM は、ローカル・データベースを使用してインストール済みのパッケージを判断します。ローカル・データベースに保管されたパッケージに関するメタデータは、有効化されたリポジトリーから取得されます。ローカル・データベースについて考慮しなければならないことはめったにありませんが、ローカル側に保管された情報を部分的に消去するには yum clean コマンドを、有効にされた repo の情報をローカル・データベースに作成するには yum makecache を使用します。これらのコマンドを使用する可能性があるのは、例えば repo 構成を変更する場合です。


RPM パッケージの削除

パッケージを削除したい場合には、yumremove オプションか、または rpm-e オプションを使用することができます。リスト 5 は、rpm -e を使用した gcl の削除操作のテストです。パッケージを削除できる場合には、出力が表示されません。


リスト 5. gcl の削除テスト
[root@echidna ~]# rpm -e --test gcl

apt-get を使った Debian パッケージの削除をシミュレーションする場合とは異なり、RPM システムは自動的に追加されたパッケージに関する情報を維持しないため、パッケージと一緒に削除される依存関係を容易に調べる方法はありません。けれども、1 つのコマンドに複数のパッケージを削除対象として指定すると、依存関係を持たないパッケージが削除されてから、依存関係を持つパッケージが削除されます。

rpm を使用してパッケージを削除すると、パッケージをインストールする場合とは異なり、削除の確認を求めるプロンプトが出されることなく、パッケージが削除されます。ただし、他のパッケージに必要なパッケージを削除しようとすると、削除操作は実行されません。代わりに、リスト 6 に示すエラー・メッセージが表示されます。


リスト 6. rpmで依存パッケージを削除する場合
[root@echidna ~]# rpm -e gcl-selinux
error: Failed dependencies:
	gcl-selinux is needed by (installed) gcl-2.6.8-0.7.20100201cvs.fc12.x86_64

一方、yum remove を使う場合には、トランザクション・テストが行われた後にプロンプトが出されます。インストールされている他のパッケージが、削除しようとしているパッケージに依存している場合、YUM は、削除対象のパッケージと共に、そのパッケージに依存するパッケージも削除するかどうかを尋ねるプロンプトを出します (リスト 7 を参照)。


リスト 7. yum で依存パッケージを削除する場合
[root@echidna ~]# yum remove gcl-selinux
Loaded plugins: presto, refresh-packagekit
Setting up Remove Process
Resolving Dependencies
--> Running transaction check
---> Package gcl-selinux.x86_64 0:2.6.8-0.7.20100201cvs.fc12 set to be erased
--> Processing Dependency: gcl-selinux for package: gcl-2.6.8-0.7.20100201cvs.fc12.x86_64
--> Running transaction check
---> Package gcl.x86_64 0:2.6.8-0.7.20100201cvs.fc12 set to be erased
--> Finished Dependency Resolution

Dependencies Resolved

=====================================================================================
 Package          Arch        Version                            Repository     Size
=====================================================================================
Removing:
 gcl-selinux      x86_64      2.6.8-0.7.20100201cvs.fc12         @updates       90 k
Removing for dependencies:
 gcl              x86_64      2.6.8-0.7.20100201cvs.fc12         @updates       40 M

Transaction Summary
=====================================================================================
Remove        2 Package(s)
Reinstall     0 Package(s)
Downgrade     0 Package(s)

Is this ok [y/N]: n
Exiting on user Command
Complete!


RPM パッケージのアップグレード

RPM をインストールする方法と削除する方法がわかったところで、今度は RPM パッケージを新しいレベルにアップグレードする方法を説明します。更新操作では、yum update を使用してシステム全体を更新することも、単一のパッケージ、またはワイルドカードを指定して更新することもできます。リスト 8 は、名前が「gr」で始まるすべてのパッケージを更新する方法です。アポストロフィーを使用して、シェルが「*」を展開しないようにしている点に注意してください。


リスト 8. yum update による更新
[root@echidna ~]# yum update 'gr*'
Loaded plugins: presto, refresh-packagekit
Setting up Update Process
Resolving Dependencies
--> Running transaction check
---> Package grep.x86_64 0:2.6.3-1.fc12 set to be updated
---> Package groff.x86_64 0:1.18.1.4-20.fc12 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

=====================================================================================
 Package         Arch             Version                    Repository         Size
=====================================================================================
Updating:
 grep            x86_64           2.6.3-1.fc12               updates           228 k
 groff           x86_64           1.18.1.4-20.fc12           updates           1.5 M

Transaction Summary
=====================================================================================
Install       0 Package(s)
Upgrade       2 Package(s)

Total download size: 1.7 M
Is this ok [y/N]: y
Downloading Packages:
Setting up and reading Presto delta metadata
Processing delta metadata
Download delta size: 854 k
http://fedora.fastsoft.net/pub/linux/fedora/linux/updates/12/x86_64/drpms/grep-2.5.3-
6.fc12_2.6.3-1.fc12.x86_64.drpm: [Errno 14] HTTP Error 404 : http://fedora.fastsoft.n
et/pub/linux/fedora/linux/updates/12/x86_64/drpms/grep-2.5.3-6.fc12_2.6.3-1.fc12.x86_
64.drpm 
Trying other mirror.
(1/2): grep-2.5.3-6.fc12_2.6.3-1.fc12.x86_64.drpm             | 214 kB     00:00     
(2/2): groff-1.18.1.4-18.fc12_1.18.1.4-20.fc12.x86_64.drpm    | 640 kB     00:00     
Finishing rebuild of rpms, from deltarpms
<delta rebuild>                                               | 1.7 MB     00:02     
Presto reduced the update size by 52% (from 1.7 M to 854 k).
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Updating       : grep-2.6.3-1.fc12.x86_64                                      1/4 
  Updating       : groff-1.18.1.4-20.fc12.x86_64                                 2/4 
  Cleanup        : grep-2.5.3-6.fc12.x86_64                                      3/4 
  Cleanup        : groff-1.18.1.4-18.fc12.x86_64                                 4/4 

Updated:
  grep.x86_64 0:2.6.3-1.fc12             groff.x86_64 0:1.18.1.4-20.fc12            

Complete!

RPM ファイルの保管場所を知っている場合、または RPM ファイルをダウンロード済みの場合には、rpm コマンドを使って更新することもできます。このコマンドでの更新操作はインストールする場合と同様ですが、-i オプションの代わりに、-U または -F オプションを使用します。この 2 つのオプションの違いは、-U オプションはパッケージが存在する場合はパッケージをアップグレードし、インストールされていない場合はパッケージをインストールする一方、-F オプションはインストール済みのパッケージのみをアップグレードつまり最新のものにするという点です。このことから、特にコマンドラインに RPM のリストが入力されている場合をはじめとして、-U オプションがよく使われています。このオプションを使用すれば、アンインストールされたパッケージはインストールされ、インストール済みのパッケージはアップグレードされます。その他のオプションには、進捗状態を表示するために度々使用される、-v (verbose の略) と -h (hash mark の略) の 2 つがあります。リスト 9 は、rpm コマンドを使って、vim-common、vim-enhanced、および vim-minimal パッケージを更新する例です。vim-common と vim-enhanced の 2 つは root のホーム・ディレクトリーにダウンロード済みですが、vim-minimal パッケージについては更新ミラーのうちの 1 つから取得しています。


リスト 9. rpm によるパッケージの更新
[root@echidna ~]# ls *.rpm
vim-common-7.2.411-1.fc12.x86_64.rpm  vim-enhanced-7.2.411-1.fc12.x86_64.rpm
[root@echidna ~]# rpm -Uvh *.rpm http://mirrors.usc.edu/pub/linux/distributions\
> /fedora/linux/updates/12/x86_64/vim-minimal-7.2.411-1.fc12.x86_64.rpm
Retrieving http://mirrors.usc.edu/pub/linux/distributions/fedora/linux/updates/12/x86
_64/vim-minimal-7.2.411-1.fc12.x86_64.rpm
Preparing...                ########################################### [100%]
   1:vim-common             ########################################### [ 33%]
   2:vim-enhanced           ########################################### [ 67%]
   3:vim-minimal            ########################################### [100%]


RPM パッケージに対する問い合わせ

これまでのサンプル・コードに記載されていたように、rpm コマンドを使って rpm をインストールする場合には、パッケージ・ファイルの完全な名前 (または URL) を使用しなければなりません (gcl-2.6.8-0.6.20090701cvs.fc12.x86_64.rpm など)。その一方、yum を使用する場合には、rpm をインストールするにも、削除するにも、必要なのはパッケージ名 (例えば、gcl) だけです。APT の場合と同じく、RPM はインストール済みパッケージの内部データベースを維持するため、パッケージ名を使用してインストール済みパッケージを操作することができます。このセクションでは、rpm コマンドの -q (query の略) オプション、または関連する yum クエリーを使って、このデータベースから取得できる情報を調べます。

基本的なクエリーは、パッケージがインストールされているかどうかを尋ねて、インストールされている場合にはパッケージのバージョンを尋ねるというだけの単純なものです。そこに -i オプションを追加すると、パッケージに関する情報が表示されます。パッケージをインストール、アップグレード、または削除するには root 権限が必要ですが、rpm データベースに対するクエリーは、root 以外のユーザーでも実行できることに注意してください。


リスト 10. gcl に関する情報の表示

[ian@echidna ~]$ yum list gcl
Loaded plugins: presto, refresh-packagekit
Installed Packages
gcl.x86_64                  2.6.8-0.7.20100201cvs.fc12                  @updates
[ian@echidna ~]$ rpm -q gcl
gcl-2.6.8-0.7.20100201cvs.fc12.x86_64

[ian@echidna ~]$ yum info gcl
Loaded plugins: presto, refresh-packagekit
Installed Packages
Name       : gcl
Arch       : x86_64
Version    : 2.6.8
Release    : 0.7.20100201cvs.fc12
Size       : 40 M
Repo       : installed
From repo  : updates
Summary    : GNU Common Lisp
URL        : http://www.gnu.org/software/gcl/
License    : GPL+ and LGPLv2+
Description: GCL is a Common Lisp currently compliant with the ANSI standard.
           : Lisp compilation produces native code through the intermediary of
           : the system's C compiler, from which GCL derives efficient
           : performance and facile portability. Currently uses TCL/Tk as GUI.

[ian@echidna ~]$ rpm -qi gcl
Name        : gcl                          Relocations: (not relocatable)
Version     : 2.6.8                             Vendor: Fedora Project
Release     : 0.7.20100201cvs.fc12          Build Date: Tue 23 Mar 2010 03:20:36 PM EDT
Install Date: Wed 05 May 2010 01:01:34 PM EDT      Build Host: x86-02.phx2.fedoraproject.
org
Group       : Development/Languages         Source RPM: gcl-2.6.8-0.7.20100201cvs.fc12.sr
c.rpm
Size        : 41667750                         License: GPL+ and LGPLv2+
Signature   : RSA/8, Tue 23 Mar 2010 04:14:06 PM EDT, Key ID 9d1cc34857bbccba
Packager    : Fedora Project
URL         : http://www.gnu.org/software/gcl/
Summary     : GNU Common Lisp
Description :
GCL is a Common Lisp currently compliant with the ANSI standard.  Lisp
compilation produces native code through the intermediary of the
system's C compiler, from which GCL derives efficient performance and
facile portability. Currently uses TCL/Tk as GUI.

詳細な情報が示されているリストのほうには、RPM パッケージに関連付けることのできるタグのいくつかが示されています。上記を見るとわかるように、rpmyum とでは、表示する情報とフォーマットが多少異なります。この記事では一貫して標準コマンド・オプションによって表示される基本出力に従うので、rpm --queryformat オプションを使用してカスタム・クエリー出力を作成したい場合には man ページを参照してください。また、お使いの rpm バージョンでサポートされているすべてのタグを調べるには、rpm --queryformat を実行してみてください。

リスト 10 に示されているように、yum を使用することで、インストール済みのパッケージをリストアップすることができます。また、更新を入手可能なパッケージ、インストール可能なパッケージ、そしてサポートが中止されたパッケージや最近リポジトリーに追加されたパッケージなど、他の特徴を持つパッケージをリストアップすることもできます。さらに、パッケージを検索するのにも yum を使用することができます。リスト 11 を見ると、texmacs パッケージはインストールされていないこと、ただし fedora リポジトリーから入手できることが示されています。「texmacs」を検索すると、一致結果として 4 つのパッケージが表示されます。TeXmacs* パッケージが検出された理由はすぐにわかるはずです。pydot パッケージも同じく一致結果として表示されている理由を調べるには、「yum info pydot」と入力してください。


リスト 11. gcl に関する情報の表示

[ian@echidna ~]$ yum list texmacs
Loaded plugins: presto, refresh-packagekit
Available Packages
TeXmacs.x86_64                         1.0.7.2-2.fc12                          fedora
[ian@echidna ~]$ yum search texmacs
Loaded plugins: presto, refresh-packagekit
================================= Matched: texmacs ==================================
TeXmacs-devel.i686 : Development files for TeXmacs
TeXmacs-devel.x86_64 : Development files for TeXmacs
TeXmacs.x86_64 : Structured wysiwyg scientific text editor
pydot.noarch : Python interface to Graphviz's Dot language

以降に記載するクエリーの例では、広範なオプションがある rpm を主に使用します。記載する例の多くでは yum を使うこともできます。yum には、基本的な rpm オプションにはない機能があります。詳細については、man ページを参照してください。

RPM パッケージとその中に含まれているファイルの表示

パッケージに含まれているファイルや、特定のファイルがどのパッケージに属しているかを調べなければならないことはよくあります。gcl パッケージに含まれるファイルを表示するには、-ql オプションを使用します (リスト 12 を参照)。このパッケージには多数のファイルが含まれているので、以下に記載する出力にはその一部だけを示します。


リスト 12. gcl パッケージに含まれるファイルの表示
[ian@echidna ~]$ rpm -ql gcl
/usr/bin/gcl
/usr/lib/gcl-2.6.8
/usr/lib/gcl-2.6.8/clcs
/usr/lib/gcl-2.6.8/clcs/sys-proclaim.lisp
/usr/lib/gcl-2.6.8/cmpnew
/usr/lib/gcl-2.6.8/cmpnew/gcl_cmpmain.lsp
/usr/lib/gcl-2.6.8/cmpnew/gcl_cmpopt.lsp
/usr/lib/gcl-2.6.8/cmpnew/gcl_collectfn.lsp
.
.
.
/usr/share/info/gcl-tk.info.gz
/usr/share/info/gcl.info-1.gz
/usr/share/info/gcl.info-2.gz
/usr/share/info/gcl.info-3.gz
/usr/share/info/gcl.info-4.gz
/usr/share/info/gcl.info-5.gz
/usr/share/info/gcl.info-6.gz
/usr/share/info/gcl.info-7.gz
/usr/share/info/gcl.info-8.gz
/usr/share/info/gcl.info-9.gz
/usr/share/info/gcl.info.gz
/usr/share/man/man1/gcl.1.gz

クエリーに -c オプションを追加すると、表示されるファイルを構成ファイルだけに制限することができます。同様に、-d オプションを追加すると、マニュアルのファイルだけが表示されます。

パッケージ・ファイルの問い合わせ

上記のパッケージ・クエリー・コマンドは、RPM データベースに対してインストール済みパッケージを問い合わせています。その一方、ダウンロードしただけのパッケージに関して同じような情報が必要な場合には、クエリーで (パッケージ・ファイルに対して) -p オプションと (パッケージをインストールする場合と同じく) パッケージ・ファイルの名前を指定します。リスト 13 では、前にダウンロードした 2 つの vim パッケージに関する情報を求めて、クエリーを実行しています。このクエリーを root として実行した理由は、ファイルが root のホーム・ディレクトリーにあったからにすぎません。他に追加できるクエリー・オプションには、ファイルを一覧表示する -l や、情報を表示する -i などがあります。


リスト 13. 2 つの vim パッケージに関するパッケージ・ファイル情報の表示
[root@echidna ~]# rpm -qp *.rpm
vim-common-7.2.411-1.fc12.x86_64
vim-enhanced-7.2.411-1.fc12.x86_64

インストールされているすべてのパッケージの問い合わせ

-a オプションは、インストールされているすべてのパッケージにクエリーを適用します。このオプションを指定すると大量の出力が生成される可能性があるため、大抵は 1 つ以上のフィルターと一緒に使用します。例えば、リストをソートする sort、ページを移動する more または less、パッケージまたはファイルのカウントを取得する wc、名前に確信が持てないパッケージを検索する grep などのフィルターです。リスト 14 では、以下のクエリーを行っています。

  1. システム上の全パッケージをソートしたリスト
  2. システム上のパッケージの合計数
  3. システム上の全パッケージに含まれるファイルの合計数
  4. RPM によってインストールされたマニュアル・ファイルの合計数
  5. 名前に「gcl」(大/小文字の区別なし) が含まれる全パッケージの検索

リスト 14. すべてのパッケージに対するクエリー

[ian@echidna ~]$ rpm -qa | sort | more
aalib-libs-1.4.0-0.18.rc5.fc12.x86_64
abrt-1.0.8-2.fc12.x86_64
abrt-addon-ccpp-1.0.8-2.fc12.x86_64
abrt-addon-kerneloops-1.0.8-2.fc12.x86_64
abrt-addon-python-1.0.8-2.fc12.x86_64
abrt-desktop-1.0.8-2.fc12.x86_64
abrt-gui-1.0.8-2.fc12.x86_64
abrt-libs-1.0.8-2.fc12.x86_64
abrt-plugin-bugzilla-1.0.8-2.fc12.x86_64
abrt-plugin-logger-1.0.8-2.fc12.x86_64
abrt-plugin-runapp-1.0.8-2.fc12.x86_64
abyssinica-fonts-1.0-5.fc12.noarch
acl-2.2.49-2.fc12.x86_64
...
[ian@echidna ~]$ rpm -qa | wc -l
1792
[ian@echidna ~]$ rpm -qal | wc -l
281052
[ian@echidna ~]$ rpm -qad | wc -l
45686
[ian@echidna ~]$ rpm -qa | grep -i gcl
gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64
gcl-2.6.8-0.7.20100201cvs.fc12.x86_64

rpm -qa を使用することで、複数のシステムを容易に管理できるようになります。ソートされた出力をあるマシン上のファイルにリダイレクトし、同じ操作を別のマシンでも行えば、diff プログラムを使って差分を検出することができます。

特定のファイルが含まれるパッケージを検索する

すべてのパッケージと、パッケージに含まれるすべてのファイルを一覧表示することができるとすれば、ある特定のファイルを所有するパッケージを検索するために必要な情報はすべて揃っていることになります。その一方、rpm コマンドにはファイルを所有するパッケージを見つけるために指定できる -f (または --file) オプションがあります。例えば前に記載した 2 つの vim パッケージのうち、どちらのパッケージに vim コマンドがあるのかを知りたいとします。その場合には、ファイルのフル・パスを指定する必要があります。リスト 15 を見ると、which コマンドを使用して vim コマンドへのフル・パスを取得する方法、そしてこの出力を rpm -qf コマンドの入力として使うための秘訣がわかります。`which vim` は、バックティック記号で括られていることに注意してください。Bash シェルでは、バックティック記号の代わりに $(which vim) を使用することができます。


リスト 15. vim 実行可能ファイルを提供するパッケージの検索

[ian@echidna ~]$ which vim
/usr/bin/vim
[ian@echidna ~]$ rpm -qf `which vim`
vim-enhanced-7.2.411-1.fc12.x86_64
[ian@echidna ~]$ rpm -qf $(which vim)
vim-enhanced-7.2.411-1.fc12.x86_64

RPM の依存関係

前に、gcl-selinux パッケージを消去しようとしても、依存関係が原因で消去できない例を記載しました。RPM パッケージにはファイルだけでなく、他のパッケージが依存する可能性のある任意の機能が含まれていることがあります。

前述の例でもそうだったように、大抵、依存関係の問題は何とか解決します。複数のパッケージを一度にまとめてインストールしなければならない場合、そのうちのいくつかが他のパッケージに依存している可能性があるとしたら、単純に yum を使用するか、あるいは別の方法として、rpm -Uvh コマンドに全パッケージのリストを渡すと、このコマンドが依存関係を分析して正しい順序でインストールしてくれます。

パッケージをインストールまたは消去しようとしてエラー・メッセージを受け取る他にも、パッケージに必要な、またはパッケージが依存するファイルや機能を見つける方法はいくつかあります。

rpm コマンドには、インストールされているパッケージやパッケージに含まれるファイルを問い合わせ、依存する機能や必要な機能を見つけるためのオプションがあります。それが、--requires オプションです。このオプションは、-R に省略することもできます。リスト 16 に、gcl が必要とする機能が示されています。RPM データベースではなく、パッケージ・ファイルに対してクエリーを実行する場合には、-p オプションを追加して完全な RPM ファイル名を指定してください。


リスト 16. gcl に必要な機能の検索
[ian@echidna ~]$ rpm -qR gcl
/bin/sh  
/bin/sh  
/bin/sh  
/sbin/install-info  
/sbin/install-info  
gcl-selinux  
libX11.so.6()(64bit)  
libc.so.6()(64bit)  
libc.so.6(GLIBC_2.11)(64bit)  
libc.so.6(GLIBC_2.2.5)(64bit)  
libc.so.6(GLIBC_2.3)(64bit)  
libc.so.6(GLIBC_2.3.4)(64bit)  
libc.so.6(GLIBC_2.4)(64bit)  
libc.so.6(GLIBC_2.7)(64bit)  
libc.so.6(GLIBC_2.8)(64bit)  
libdl.so.2()(64bit)  
libgmp.so.3()(64bit)  
libm.so.6()(64bit)  
libm.so.6(GLIBC_2.2.5)(64bit)  
libreadline.so.6()(64bit)  
libtcl8.5.so()(64bit)  
libtk8.5.so()(64bit)  
libz.so.1()(64bit)  
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)  
rpmlib(PayloadIsXz) <= 5.2-1

機能と、その機能を提供するパッケージとを突き合わせるとなると、多少手が込んできます。そこで役立つのが、deplist オプションを指定した yum コマンドです。このコマンドに、バージョン番号を含まないパッケージ名を渡すだけで、既知のバージョンのリストが表示されます。リスト 17 に、インストールされている gcl のバージョンだけの依存関係リストを取得する方法を示します。


リスト 17. yum deplist を使用した gcl の依存関係の検索
[ian@echidna ~]$ yum deplist $(rpm -q gcl)
Loaded plugins: presto, refresh-packagekit
Finding dependencies: 
package: gcl.x86_64 2.6.8-0.7.20100201cvs.fc12
  dependency: libc.so.6(GLIBC_2.3.4)(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
  dependency: gcl-selinux
   provider: gcl-selinux.x86_64 2.6.8-0.6.20090701cvs.fc12
   provider: gcl-selinux.x86_64 2.6.8-0.7.20100201cvs.fc12
  dependency: libgmp.so.3()(64bit)
   provider: gmp.x86_64 4.3.1-5.fc12
  dependency: libc.so.6(GLIBC_2.8)(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
  dependency: libc.so.6(GLIBC_2.4)(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
  dependency: libc.so.6()(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
  dependency: /sbin/install-info
   provider: info.x86_64 4.13a-7.fc12
   provider: info.x86_64 4.13a-9.fc12
  dependency: libX11.so.6()(64bit)
   provider: libX11.x86_64 1.3-1.fc12
  dependency: libc.so.6(GLIBC_2.7)(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
  dependency: libtcl8.5.so()(64bit)
   provider: tcl.x86_64 1:8.5.7-4.fc12
   provider: tcl.x86_64 1:8.5.7-5.fc12
  dependency: libc.so.6(GLIBC_2.11)(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
  dependency: libtk8.5.so()(64bit)
   provider: tk.x86_64 1:8.5.7-2.fc12
   provider: tk.x86_64 1:8.5.7-3.fc12
  dependency: libc.so.6(GLIBC_2.3)(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
  dependency: libm.so.6()(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
  dependency: libz.so.1()(64bit)
   provider: zlib.x86_64 1.2.3-23.fc12
  dependency: rtld(GNU_HASH)
   provider: glibc.i686 2.11-2
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
   provider: glibc.i686 2.11.1-6
  dependency: libdl.so.2()(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
  dependency: libreadline.so.6()(64bit)
   provider: readline.x86_64 6.0-3.fc12
  dependency: /bin/sh
   provider: bash.x86_64 4.0.33-1.fc12
   provider: bash.x86_64 4.0.35-3.fc12
  dependency: libc.so.6(GLIBC_2.2.5)(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
  dependency: libm.so.6(GLIBC_2.2.5)(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6

上記のリストには、機能ごとに、その機能を提供可能なパッケージも示されています。ご覧のように、ほとんどの依存関係の場合、それを提供するパッケージのレベルは 1 つだけではありません。例えば /bin/sh は、2 つのレベルのうち、いずれかのレベルの bash から提供することができます。この出力は、少し独創力を効かせたフィルタリングによってパッケージ名だけのリストに縮小することができます (リスト 18 を参照)。


リスト 18. パッケージ名のみをリストするように縮小された yum deplist の出力
[ian@echidna ~]$ yum deplist $(rpm -q gcl) | grep "provider:" | \
> awk '{ print $2 }'|sort|uniq
bash.x86_64
gcl-selinux.x86_64
glibc.i686
glibc.x86_64
gmp.x86_64
info.x86_64
libX11.x86_64
readline.x86_64
tcl.x86_64
tk.x86_64
zlib.x86_64

どのパッケージをインストールする必要があるのかだけを知りたい場合は、yum install を実行すれば、インストールの推奨案を受け入れるかどうかを尋ねるプロンプトが出される前に、パッケージのリストを確認することができます。

パッケージに必要な機能を調べる場合とは別に、特定の機能を提供するパッケージを見つけなければならない場合もあります。特定のファイルを所有するパッケージを検索する方法は前に説明しましたが、今度はリスト 19 に、rpm または yum を使用して、gcl-selinux(x86-64) 機能を提供するパッケージを検索する方法を示します。この機能を提供するインストール済みパッケージに関する情報の他に、YUM はリポジトリー内にあるパッケージまたはバージョンも示します。具体的には、fedora リポジトリーには元の 2.6.8-0.6 バージョンがある一方、更新された 2.6.8-0.7 バージョンは updates リポジトリーから入手することができます。


リスト 19. gcl-selinux(x86-64) 機能を提供するパッケージの検索
[ian@echidna ~]$ rpm -q --whatprovides 'gcl-selinux(x86-64)'
gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64
[ian@echidna ~]$ yum whatprovides 'gcl-selinux(x86-64)'
Loaded plugins: presto, refresh-packagekit
gcl-selinux-2.6.8-0.6.20090701cvs.fc12.x86_64 : SELinux policy for GCL images
Repo        : fedora
Matched from:
Other       : gcl-selinux(x86-64)



gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64 : SELinux policy for GCL images
Repo        : updates
Matched from:
Other       : gcl-selinux(x86-64)



gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64 : SELinux policy for GCL images
Repo        : installed
Matched from:
Other       : Provides-match: gcl-selinux(x86-64)


RPM パッケージ・ファイルの完全性

RPM パッケージには、その完全性を確実にするために MD5 や SHA1 などのダイジェストが組み込まれています。通常、これらのダイジェストにはデジタル署名が付与されています。デジタル署名付きのパッケージを検証するには、公開鍵が必要です。RPM パッケージ・ファイルの完全性を確認するには、rpm--checksig (省略形は -K) オプションを使用します。さらに -v オプションを追加すると、詳細な出力が表示されるので参考になります。リスト 20 に、vim-enhanced RPM の完全性を検証する例を記載します。


リスト 20. vim-enhanced パッケージ・ファイルの完全性の確認

[root@echidna ~]# rpm -vK vim-enhanced-7.2.411-1.fc12.x86_64.rpm
vim-enhanced-7.2.411-1.fc12.x86_64.rpm:
    Header V3 RSA/SHA256 signature: OK, key ID 57bbccba
    Header SHA1 digest: OK (f9a199545a515f7ff0716729768b41eb68fe29a8)
    V3 RSA/SHA256 signature: OK, key ID 57bbccba
    MD5 digest: OK (d4045f1f72d48073e3f401ee9d1f71cf)

以下のような出力が表示されることがあります。

V3 DSA signature: NOKEY, key ID 16a61572

これは、署名付きパッケージがある一方、必要な公開鍵が RPM データベース内にないことを意味します。RPM の以前のバージョンでは、この検証を異なる形で表示する場合があることに注意してください。

署名付きのパッケージを署名に照らし合わせて検証したい場合には、該当する署名ファイルを見つけて、そのファイルを RPM データベースにインポートする必要があります。その場合、最初に鍵をダウンロードして、そのフィンガープリントをチェックしてから、rpm --import コマンドを使ってインポートしてください。詳細は RPM の man ページに記載されています。また、RPM ホーム・ページには署名付きバイナリーに関する詳細も記載されています (リンクについては「参考文献」を参照)。


インストール済みパッケージの検証

rpm の完全性の確認と同じく、rpm -V を使用することで、インストール済みファイルの完全性を確認することも可能です。このコマンドにより、ファイルが rpm からインストールされた時点から変更されていないことを確認することができます。リスト 21 に示すように、パッケージに完全性の問題がなければ、このコマンドからの出力はありませんが、-v オプションを追加した場合にはもっと詳細な出力が表示されます。


リスト 21. インストール済み vim-common パッケージの検証

[ian@echidna ~]$ rpm -V vim-common

ここで、root ユーザーになって、vim-common パッケージの内容を変更するために /usr/bin/xxd を削除し、/usr/share/vim/vim72/syntax/bindzone.vim を /bin/bash で置き換えてください。この変更を加えた後にもう一度パッケージを検証すると、リスト 22 の結果となります。


リスト 22. vim-common パッケージの変更

[root@echidna ~]# rpm -qf /usr/bin/xxd /usr/share/vim/vim72/syntax/bindzone.vim
vim-common-7.2.411-1.fc12.x86_64
vim-common-7.2.411-1.fc12.x86_64
[root@echidna ~]# rm /usr/bin/xxd
rm: remove regular file `/usr/bin/xxd'? y
[root@echidna ~]# cp /bin/bash /usr/share/vim/vim72/syntax/bindzone.vim
cp: overwrite `/usr/share/vim/vim72/syntax/bindzone.vim'? y
[root@echidna ~]# rpm -V vim-common
missing     /usr/bin/xxd
S.5....T.    /usr/share/vim/vim72/syntax/bindzone.vim

上記の出力から、/usr/share/vim/vim72/syntax/bindzone.vim ファイルが MD5 チェックサム、ファイル・サイズ、そして mtime テストに失敗したことがわかります。この問題を解決する 1 つの方法は、パッケージを削除してからインストールし直すことですが、vim-common パッケージに依存しているパッケージや、インストールされていて問題のないままのパッケージが他にもあります。これを解決する方法は、rpm--force オプション、または yumreinstall 関数を使用して、パッケージを強制的に再インストールすることです。リスト 23 では、yum を使って再インストールした後、パッケージに問題がなくなり、削除されたファイルが回復されたことを検証しています。


リスト 23. vim-common パッケージの再インストール

[root@echidna ~]# yum reinstall vim-common
Loaded plugins: presto, refresh-packagekit
Setting up Reinstall Process
Resolving Dependencies
--> Running transaction check
---> Package vim-common.x86_64 2:7.2.411-1.fc12 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

=====================================================================================
 Package            Arch           Version                     Repository       Size
=====================================================================================
Reinstalling:
 vim-common         x86_64         2:7.2.411-1.fc12            updates         6.0 M

Transaction Summary
=====================================================================================
Remove        0 Package(s)
Reinstall     1 Package(s)
Downgrade     0 Package(s)

Total download size: 6.0 M
Installed size: 17 M
Is this ok [y/N]: y
Downloading Packages:
Setting up and reading Presto delta metadata
updates/prestodelta                                           | 969 kB     00:00     
Processing delta metadata
Package(s) data still to download: 6.0 M
vim-common-7.2.411-1.fc12.x86_64.rpm                          | 6.0 MB     00:01     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Warning: RPMDB altered outside of yum.
  Installing     : 2:vim-common-7.2.411-1.fc12.x86_64                            1/1 

Installed:
  vim-common.x86_64 2:7.2.411-1.fc12                                                 

Complete!
[root@echidna ~]# rpm -V vim-common
[root@echidna ~]# ls /usr/bin/xxd
/usr/bin/xxd

さらに強制的に行う必要がある場合

通常、パッケージ管理システムはパッケージを順序正しく維持します。けれども、パッケージの重要な部分である何らかのファイルを思いがけずに削除してしまった場合には (パッケージを削除しないで再インストールしても、この問題は修正されません)、パッケージを削除してから再インストールしなければなりません。そのような場合、既存のコピーを削除して再インストールする際に、そのコピーに依存するすべてのパッケージをアンインストールしてから再インストールするという作業は行いたくないはずです。そこで利用できるのが、rpm コマンドの --nodeps オプションです。このオプションを指定すると、パッケージを削除する際に依存関係のチェックは省略されます。リスト 24 に一例として、vim-common パッケージに含まれる /usr/bin/xxd ファイルを誤って削除してしまった場合にパッケージを更新する方法を示します。


リスト 24. rpm によるパッケージの更新
[root@echidna ~]# rm /usr/bin/xxd
rm: remove regular file `/usr/bin/xxd'? y
[root@echidna ~]# # Oops! we needed that file
[root@echidna ~]# rpm -Fvh vim-common-7.2.411-1.fc12.x86_64.rpm 
[root@echidna ~]# ls /usr/bin/xxd
ls: cannot access /usr/bin/xxd: No such file or directory
[root@echidna ~]# # Oh! Freshening the package didn't replace the missing file
[root@echidna ~]# rpm -e vim-common
error: Failed dependencies:
	vim-common = 2:7.2.411-1.fc12 is needed by (installed) vim-enhanced-2:7.2.411-1.f
c12.x86_64
[root@echidna ~]# # Can't remove vim-common because vim-enhanced needs it
[root@echidna ~]# rpm -e --nodeps vim-common
[root@echidna ~]# # Bypassing the dependency check allowed removal
[root@echidna ~]# rpm -Uvh vim-common-7.2.411-1.fc12.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:vim-common             ########################################### [100%]
[root@echidna ~]# # Update (or install) vim-common again
[root@echidna ~]# ls /usr/bin/xxd
/usr/bin/xxd
[root@echidna ~]# # And /usr/bin/xxd is back

これで、問題が発生して通常の更新プロセスが失敗した場合に、パッケージを更新または修正する方法がわかったはずです。注意する点として、依存関係のチェックは RPM をインストールする際にも省略することができますが、一般的に言って、それは賢明なことではありません。


リポジトリーからの RPM のダウンロード

yum は自動的にリポジトリーからパッケージを取得するものの、例えば RPM をネットワークに接続されていないシステムにインストールする場合や、RPM の内容を検討したいなどの理由から、自分で RPM をダウンロードして保存しなければならないこともあります。そのような場合に使用するのが、yumdownloader コマンドです (リスト 25 を参照)。以下の例では、該当するパッケージはすでにインストールされているため、追加でダウンロードされるパッケージはありません。ダウンロートしなければならないパッケージがある場合には、--resolve オプションを指定すると、パッケージのダウンロードも行われます。


リスト 25. gcl パッケージのダウンロード
[ian@echidna ~]$ yumdownloader --resolve gcl
Loaded plugins: presto, refresh-packagekit
adobe-linux-i386                                                               17/17
--> Running transaction check
---> Package gcl.x86_64 0:2.6.8-0.7.20100201cvs.fc12 set to be updated
--> Finished Dependency Resolution
gcl-2.6.8-0.7.20100201cvs.fc12.x86_64.rpm                     | 6.3 MB     00:01     


rpm2cpio の使用

RPM をインストールするのではなく、ダウンロードしてパッケージの内容を調べる必要がある場合には、rpm2cpio コマンドを使用してパッケージの内容を cpio アーカイブに変換すれば、その後に cpio コマンドを使って個々のファイル、またはパッケージに含まれるすべてのファイルを解凍することができます。リスト 26 では、この変換操作を gcl-selinux パッケージに対して行った後、パッケージから解凍されたファイル (およびディレクトリー) の内容を表示しています。rpm2cpio および cpio コマンドについての詳細は、それぞれの man ページを参照してください。


リスト 26. rpm2cpio による gcl-selinux パッケージの解凍
[ian@echidna ~]$ yumdownloader gcl-selinux
Loaded plugins: presto, refresh-packagekit
gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64.rpm        |  17 kB     00:00     
[ian@echidna ~]$ mkdir gcl-selinux
[ian@echidna ~]$ cd gcl-selinux
[ian@echidna gcl-selinux]$ rpm2cpio ../gcl-selinux*.rpm | cpio -idv
./usr/share/selinux/packages/gcl
./usr/share/selinux/packages/gcl/gcl.pp
182 blocks
[ian@echidna gcl-selinux]$ find .
.
./usr
./usr/share
./usr/share/selinux
./usr/share/selinux/packages
./usr/share/selinux/packages/gcl
./usr/share/selinux/packages/gcl/gcl.pp


RPM の検索

前に説明したように、YUM が提供する検索機能は、パッケージの説明とパッケージ名を検索します。まだインストールしていないプログラムが含まれるパッケージを検索するには、以下の方法があります。

  • プログラムが含まれている可能性のあるパッケージを推測し、パッケージをインストールせずにダウンロードだけして、ダウンロードしたパッケージに対してクエリーを実行する。
  • インターネットを検索する。
  • 以下に説明する command-not-found 機能を使用する。

特定の RPM をシステム・ツールで見つけられない場合に重宝するインターネット・リソースは、Rpmfind.Net サーバーです (リンクについては「参考文献」を参照)。

command-not-found 機能

Bash シェルでコマンドを検索すると、コマンドが見つからない場合には、このシェルが command_not_found_handle というシェル関数を検索します。command_not_found_handle 関数が存在する場合には、元のコマンドと元の引数を引数として使ってこの関数が呼び出され、関数の終了ステータスがシェルの終了ステータスになります。この関数が定義されていなければ、Bash シェルはエラー・メッセージを出力し、終了ステータス 127 を返します。通常、この関数が設定されるのはシステムの /etc/bash.bashrc ファイルです。リスト 27 では、command-not-found 機能を検索した後、この機能をインストールしています。


リスト 27. command-not-found 機能の検索およびインストール
[root@echidna ~]# yum search command-not-found
Loaded plugins: presto, refresh-packagekit
========================== Matched: command-not-found ==========================
PackageKit-command-not-found.x86_64 : Ask the user to install command line
                                    : programs automatically
You have new mail in /var/spool/mail/root
[root@echidna ~]# yum install PackageKit-command-not-found.x86_64
Loaded plugins: presto, refresh-packagekit
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package PackageKit-command-not-found.x86_64 0:0.5.7-2.fc12 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package                          Arch       Version          Repository   Size
================================================================================
Installing:
 PackageKit-command-not-found     x86_64     0.5.7-2.fc12     updates     102 k

Transaction Summary
================================================================================
Install       1 Package(s)
Upgrade       0 Package(s)

Total download size: 102 k
Installed size: 262 k
Is this ok [y/N]: y
Downloading Packages:
Setting up and reading Presto delta metadata
Processing delta metadata
Package(s) data still to download: 102 k
PackageKit-command-not-found-0.5.7-2.fc12.x86_64.rpm     | 102 kB     00:00     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : PackageKit-command-not-found-0.5.7-2.fc12.x86_64         1/1 

Installed:
  PackageKit-command-not-found.x86_64 0:0.5.7-2.fc12                            

Complete!

リスト 28 に、PackageKit-command-not-found がインストールされた後、この関数のハンドルがどのように定義されるかを示します。関数が検索を実行できない場合には、標準のシステムの振る舞いを模倣して終了ステータス 127 を返します。


リスト 28. command_not_found_handle
[ian@echidna ~]$ type command_not_found_handle
command_not_found_handle is a function
command_not_found_handle () 
{ 
    runcnf=1;
    retval=127;
    [ ! -S /var/run/dbus/system_bus_socket ] && runcnf=0;
    [ ! -x /usr/sbin/packagekitd ] && runcnf=0;
    if [ $runcnf -eq 1 ]; then
        /usr/libexec/pk-command-not-found $1;
        retval=$?;
    else
        echo "bash: $1: command not found";
    fi;
    return $retval
}

この機能がインストールされた状態でリスト 1 の gcl を実行すると、リスト 29 のような出力が表示されることになります。


リスト 29. command_not_found_handle がインストールされた状態で gcl を試行した場合
[ian@echidna ~]$ gcl
Command not found. Install package 'gcl' to provide command 'gcl'? [N/y] 


その他のツール

ディストリビューションによっては yumrpm の他にも、リポジトリーからパッケージをインストールするためのツールや、システム全体を更新するためのツールが提供されています。これらのツールは、グラフィックまたはコマンドライン、あるいはその両方を使用します。例えば、以下のツールがあります。

  • YaST (SUSE)
  • up2date (Red Hat)
  • Mandrake Software Management (Mandriva)

一般に、これらのツールは複数のパッケージ更新を自動または半自動で処理します。さらに、リポジトリーの内容を表示する機能や、パッケージを検索する機能を提供する場合もあります。詳細については、お使いのディストリビューションのマニュアルを調べてください。


PackageKit

パッケージのインストールについての説明を締めくくるには、PackageKit を話題にしないわけにはいきません。PackageKit はソフトウェアを簡単にインストール、更新できるようにするために設計されたシステムで、さまざまなディストリビューションで使用されているソフトウェア・グラフィカル・ツールをまとめて 1 つに統合することを目的としています。PackageKit は、システムが起動したデーモンを使用します。つまり、デーモンは必要なときにだけ起動されるということです。PackageKit には Gnome 対応のバージョン (gnome-packagekit) と KDE 対応のバージョン (KPackageKit) があります。PackageKit には、上記で説明した command-not-found ハンドルの他、コンソールからパッケージ管理関数を実行する pkcon コマンド、パッケージ・キットのアクティビティーをモニターする pkmon コマンドがあります。また、ソフトウェア・パッケージの追加やシステムの更新に使えるグラフィカル・ツールも組み込まれています。図 1 は、Software Update グラフィカル・インターフェースの一例です。


図 1. Fedora 12 (Gnome) での Software Update グラフィカル・インターフェース
Fedora 12 (Gnome) での Software Update グラフィカル・インターフェースのスクリーン・ショット

この記事では、RPM および YUM パッケージ管理システムのほんの一部を説明しただけにすぎません。詳細な情報へのリンクについては、「参考文献」を参照してください。


参考文献

学ぶために

  • 2009年4月時点での目標に基づく LPIC-1 認定に備えるために必要な developerWorks の記事を見つけるには、developerWorks の LPIC-1 ロードマップを利用してください。

  • LPIC Program サイトで、Linux Professional Institute の 3 つの Linux システム管理資格認定レベルについて、詳しい目標、タスクのリスト、そして出題例を調べてください。特に、2009年4月時点での LPI 101 試験および LPI 102 試験の目標は要チェックです。最新の目標については、必ず LPIC Program サイトを参照してください。

  • developerWorks の連載「LPI exam prep」をすべて読んで、Linux の基礎を学び、2009年4月以前の LPI 試験の目標に基づくシステム管理者認定試験に備えてください。

  • RPM ソフトウェア・パッケージング・ツールに関する最新情報、そして RPM の詳細を調べられるリンクについては、RPM ホーム・ページにアクセスしてください。

  • Maximum RPM』では、RPM が持つすべての側面を包括的かつ体系的に説明しています。この本は、印刷版およびオンライン版で用意されています。

  • LSB (Linux Standard Base) のホームで LSB について学んでください。LSB は、標準バイナリー・オペレーティング環境の開発を目的とする FSG (Free Standards Group) プロジェクトです。

  • PackageKit について詳しく学ぶには、PackageKit ホーム・ページにアクセスしてください。

  • The Linux Documentation Project には、HOWTO 文書をはじめ、各種の有益な文書が豊富に揃っています。

  • developerWorks Linux ゾーンで、Linux 開発者および管理者向けのハウツー記事とチュートリアル、そしてダウンロード、ディスカッション、フォーラムなど、豊富に揃った資料を探してください。

  • さまざまな IBM 製品および IT 業界についての話題に絞った developerWorks の Technical events and webcasts で時代の流れをキャッチしてください。

  • 無料の developerWorks Live! briefing に参加して、IBM 製品およびツール、そして IT 業界の傾向を素早く学んでください。

  • developerWorks の on-demand demos で、初心者向けの製品のインストールおよびセットアップから熟練開発者向けの高度な機能に至るまで、さまざまに揃ったデモを見てください。

  • Twitter で developerWorks をフォローするか、developerWorks で Linux に関するツイートのフィードに登録してください。

製品や技術を入手するために

  • お使いのディストリビューションのミラー (Fedora/12 Public Active Mirrors など) のいずれかでパッケージを見つけてください。

  • Rpmfind.Net および RPM 検索機能で RPM を検索してください。

  • ご自分に最適な方法で IBM 製品を評価してください。評価の方法としては、製品の試用版をダウンロードすることも、オンラインで製品を試してみることも、クラウド環境で製品を使用することもできます。また、SOA Sandbox では、数時間でサービス指向アーキテクチャーの実装方法を効率的に学ぶことができます。

議論するために

著者について

Ian Shields

Ian Shields は、developerWorks Linux ゾーンの様々な Linux プロジェクトに関わっています。彼はノースキャロライナ州 Research Triangle Park にある IBM のシニア・プログラマーです。1973年にオーストラリアのキャンベラでシステム・エンジニアとして IBM に入社して以来、カナダのモントリオールやノースキャロライナ州 Research Triangle Park で、コミュニケーション・システムやパーベイシブ・コンピューティングに携わってきました。彼はいくつかの特許を保持しています。Australian National University にて純粋数学および哲学で学位を取得し、また North Carolina State University にてコンピューター・サイエンスで修士号と博士号を取得しています。Ian について詳しく知るには、My developerWorks で彼のプロフィールを見てください。

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


developerWorks: サイン・イン


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。 プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。 お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

表示名をお選びください

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

(半角英数字で3文字以上31文字以下にする必要があります)


「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


この記事を評価する

コメント

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=502261
ArticleTitle=Linux の 101 試験対策: RPM および YUM によるパッケージ管理
publish-date=04192012