この記事では、Linux システム上で RPM および YUM ツールを使用してパッケージを管理する方法を学びます。この記事で説明する内容は以下のとおりです。
- RPM および YUM を使用してパッケージをインストール、再インストール、アップグレード、および削除する方法
- RPM パッケージに関する情報 (バージョン、ステータス、依存関係、完全性、署名など) を取得する方法
- パッケージが提供するファイルを判別する方法と、特定のファイルが含まれるパッケージを見つける方法
この記事は、Linux Professional Institute Junior Level Administration (LPIC-1) 試験 101 の主題 102 の 102.5 の試験対策に役立ちます。この目標の重要度は 3 です。
この連載の記事を最大限に活用するには、Linux の基礎知識と、記事に記載されたコマンドを演習できる実際の Linux システムが必要です。プログラムのバージョンによって出力のフォーマットに違いが出てくる場合もあるため、コマンドの実行結果は必ずしもここに記載するリストや図とまったく同じであるとは限りません。特に、記載する出力のほとんどは、お使いのシステムにインストールされているパッケージによって大きく左右されます。出力がかなり違っているとしても、重要な共通点は認識できるはずです。
かつて、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 システムをインストールするときには、さまざまなパッケージをインストールするのが通常です。インストールする一連のパッケージは、システムの用途 (サーバー、デスクトップ、または開発者のワークステーションなど) に合わせてカスタマイズすることができます。そしてある時点で、機能を追加するために新しいパッケージをインストールしなければならなくなったり、既存のパッケージの更新や、不要になったパッケージの削除や、新しいパッケージがリリースされたことで廃止されたパッケージの削除が必要になったりすることがあります。以降のセクションでは、これらのタスクを行う方法を説明するとともに、特定のコマンドが含まれている可能性のあるパッケージを見つけるなどといった、タスクに関連する課題に取り組みます。
Red Hat が 1995年に導入した RPM は、現在 LSB (Linux Standard Base) でパッケージ形式として使用されているパッケージ管理システムです。rpm コマンドのオプションは、以下の用途によって 3 つのグループに分けられます。
- パッケージに対する問い合わせと検証
- パッケージのインストール、アップグレード、および削除
- その他の関数の実行
上記の 3 つのグループのうち、この記事では最初の 2 つのグループに分類されるコマンドのオプションに焦点を絞ります。その他の関数についての情報は、RPM の man ページを調べてください。
rpm は、RPM で使用する主要なコマンドのコマンド名であり、.rpm は RPM ファイルに使用する拡張子であることに注意してください。したがって一般に、「rpm ファイル」や「xxx rpm」と記述されている場合は RPM ファイルを意味し、単独で rpm と記述されている場合はコマンドを意味します。
YUM は RPM システムに自動更新機能と、依存関係の管理を含めたパッケージ管理機能を追加します。YUM はシステムにインストールされているパッケージを把握するだけでなく、Debian の APT (Advanced Packaging Tool) のようにリポジトリーと連動します。リポジトリーとはパッケージの集合のことで、通常はネットワーク接続を介してアクセスすることができます。
例えば、Lisp を習得したいというあなたに、同僚たちが gcl コマンドを使用するように提案したとします。そこであなたは、gcl --help、which 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 構成を変更する場合です。
パッケージを削除したい場合には、yum の remove オプションか、または 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 パッケージを新しいレベルにアップグレードする方法を説明します。更新操作では、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 をインストールする場合には、パッケージ・ファイルの完全な名前 (または 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 パッケージに関連付けることのできるタグのいくつかが示されています。上記を見るとわかるように、rpm と yum とでは、表示する情報とフォーマットが多少異なります。この記事では一貫して標準コマンド・オプションによって表示される基本出力に従うので、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 ページを参照してください。
パッケージに含まれているファイルや、特定のファイルがどのパッケージに属しているかを調べなければならないことはよくあります。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 では、以下のクエリーを行っています。
- システム上の全パッケージをソートしたリスト
- システム上のパッケージの合計数
- システム上の全パッケージに含まれるファイルの合計数
- RPM によってインストールされたマニュアル・ファイルの合計数
- 名前に「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 |
前に、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 パッケージには、その完全性を確実にするために 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 オプション、または yum の reinstall 関数を使用して、パッケージを強制的に再インストールすることです。リスト 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 をインストールする際にも省略することができますが、一般的に言って、それは賢明なことではありません。
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 |
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 |
前に説明したように、YUM が提供する検索機能は、パッケージの説明とパッケージ名を検索します。まだインストールしていないプログラムが含まれるパッケージを検索するには、以下の方法があります。
- プログラムが含まれている可能性のあるパッケージを推測し、パッケージをインストールせずにダウンロードだけして、ダウンロードしたパッケージに対してクエリーを実行する。
- インターネットを検索する。
- 以下に説明する command-not-found 機能を使用する。
特定の RPM をシステム・ツールで見つけられない場合に重宝するインターネット・リソースは、Rpmfind.Net サーバーです (リンクについては「参考文献」を参照)。
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] |
ディストリビューションによっては yum と rpm の他にも、リポジトリーからパッケージをインストールするためのツールや、システム全体を更新するためのツールが提供されています。これらのツールは、グラフィックまたはコマンドライン、あるいはその両方を使用します。例えば、以下のツールがあります。
- YaST (SUSE)
- up2date (Red Hat)
- Mandrake Software Management (Mandriva)
一般に、これらのツールは複数のパッケージ更新を自動または半自動で処理します。さらに、リポジトリーの内容を表示する機能や、パッケージを検索する機能を提供する場合もあります。詳細については、お使いのディストリビューションのマニュアルを調べてください。
パッケージのインストールについての説明を締めくくるには、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 グラフィカル・インターフェース
この記事では、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 では、数時間でサービス指向アーキテクチャーの実装方法を効率的に学ぶことができます。
議論するために
- ディスカッション・フォーラムに参加してください。
- My developerWorks コミュニティーに加わってください。ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者が主導するブログ、フォーラム、グループ、ウィキを調べることができます。

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