第9章 コマンドラインツールを利用したソフトウエア管理

目次

9.1. zypper の使用
9.2. RPM - パッケージマネージャ

概要

本章では zypper と RPM について説明しています。これらはいずれも ソフトウエアを管理するためのコマンドラインツールです。 本章で使用する用語 (たとえば リポジトリ, 修正, 更新 など) については、 5.1項 「用語定義」 をお読みください。

9.1. zypper の使用

zypper はパッケージをインストールしたり更新したり、削除したりすること ができるほか、リポジトリの管理を行なうこともできるコマンドラインの パッケージマネージャです。 特にシェルスクリプトなどを利用して、遠隔からのソフトウエア管理処理を 行なうのに便利な機能が用意されています。

9.1.1. 一般的な使い方

zypper の一般的な書式は下記のとおりです:

zypper
[グローバルオプション] コマンド[コマンドオプション] [パラメータ] ...

角括弧で括られた部分は任意入力の部分です。 zypper を最も簡単に使用する には、 zypper に続いてコマンド名を入力することです。たとえばお使いの システムに必要な、全ての修正を適用するには下記のように入力します:

zypper patch

コマンドの前には 1 つ以上のグローバルオプションを指定することが できます。たとえば --non-interactive は、コマンドを 実行している間に何も問い合わせを表示させない、という意味になります (自動で既定の回答を行なったものと見なす):

zypper --non-interactive patch

また、特定のコマンドに固有のオプションを使用するには、コマンドの後ろ にそれらを入力します。たとえば --auto-agree-with-licenses は、ライセンス同意の確認を行なうことなく、お使いのシステムに必要な 全ての修正を適用する、という意味になります (ライセンス同意は自動的に 受け入れられたものと見なします):

zypper patch --auto-agree-with-licenses

コマンドによっては 1 つ以上のパラメータを必要とするものがあります。 たとえば install コマンドでは、インストールしたいパッケージを 1 つ 以上指定します:

zypper install mplayer

オプションによってもパラメータを必要とする場合があります。下記の コマンドは、既知の全てのパターンを表示します:

zypper search -t pattern

今までに説明した項目については、これらを全て組み合わせることができ ます。たとえば下記のコマンドでは、 factory リポジトリに限定して mplayeramarok パッケージをインストールし、その際 に冗長な出力を行なうことを意味します:

zypper -v install --from factory mplayer amarok

--from オプションはすべてのリポジトリを有効にしたまま に設定 (依存関係の解決のため) し、特定のリポジトリに対してパッケージを 要求する意味です。

zypper -v install --repo factory mplayer amarok

さらに、多くの zypper コマンドには dry-run と 呼ばれるオプションがあります。これは与えられたコマンドについて シミュレーションを行なう機能を提供します。シミュレーションである ため、実際にはシステムに対して何も変更を加えません。

zypper remove --dry-run MozillaFirefox

9.1.2. zypper を利用したソフトウエアのインストールと削除

パッケージをインストールしたり削除したりするには、下記のコマンドを 入力します:

zypper install パッケージ名
zypper remove パッケージ名

zypper では、インストールと削除のコマンドを利用して様々な方法での パッケージの指定を行なうことができます:

パッケージ名 (およびバージョン番号) を直接指定
zypper install MozillaFirefox

または

zypper install MozillaFirefox-3.5.3
リポジトリの別名とパッケージ名の指定
zypper install mozilla:MozillaFirefox

ここで、 mozilla はインストール元のリポジトリ 別名とします。

ワイルドカードを利用したパッケージ名指定

下記のコマンドは、 Moz で始まる全てのパッケージを インストールします。特にパッケージを削除する場合など、ご利用に あたってはご注意ください。

zypper install 'Moz*'
能力設定での指定

たとえば Perl のモジュールをインストールしたい場合で、モジュール の名前がわからないような場合は、能力設定での指定を行なうことも できます:

zypper install 'perl(Time::ParseDate)'
能力設定、アーキテクチャ、バージョンの組み合わせ

能力設定のほか、アーキテクチャ (i586x86_64 など) の指定を追加したり、バージョンの 指定を追加したりすることもできます。バージョンの指定は、下記の ような比較演算子をあわせて指定します: < (より小さい), <= (等しいか、より小さい), = (等しい), >= (等しいか、より大きい), > (より大きい)

zypper install 'firefox.x86_64'
zypper install 'firefox>=3.5.3'
zypper install 'firefox.x86_64>=3.5.3'
RPM ファイルパスの指定

パッケージとして、ローカルまたはリモートのパスを指定することも できます:

zypper install /tmp/install/MozillaFirefox.rpm
zypper install Firefox RPM の URL

ここで、 Firefox RPM の URL の箇所は、 たとえば http://download.opensuse.org/repositories/mozilla/SUSE_Factory/x86_64/MozillaFirefox-3.5.3-1.3.x86_64.rpm のように、実際のダウンロード URL に置き換えてください。

さらに、パッケージのインストールや削除は +- の修飾子を指定することができます。 たとえば emacs をインストールして vim を削除するには、下記のように 入力します:

zypper install emacs -vim

emacs を削除し、同時に vim をインストールするには、 下記のように入力します:

zypper remove emacs +vim

なお、 - で始まるパッケージの指定が、コマンド オプションとして解釈されてしまうことを防ぐため、これらの指定は 2 つめ以降のパラメータで指定してください。それができない場合は -- を指定し、コマンドオプションの終了を宣言 してください:

zypper install -emacs +vim       # 間違い
zypper install vim -emacs        # 正しい
zypper install -- -emacs +vim    # 上記と同じ
zypper remove emacs +vim         # 上記と同じ

また、特定のパッケージを削除する際、不要となったパッケージについても合わせて 自動的に削除するには、 --clean-deps オプションを利用します:

rm package_name --clean-deps

何も指定しない場合、 zypper は選択したパッケージをインストールしたり 削除したりする際、および何らかの問題が発生した際にそれぞれ確認メッセージを 表示します。この動作を無効化するには、 --non-interactive オプションを指定します。このオプションは実際のコマンドよりも前に指定して おく必要があります ((install, remove, patch) など) 。下記のようになります:

zypper --non-interactive install パッケージ名

このオプションを使用すると、スクリプトや cron ジョブなどから zypper を 利用できるようになります。

[Warning]必要不可欠なパッケージの削除について

glibc, zypper, kernel などの必須パッケージについては、削除を 行なってはなりません。これらのパッケージはシステム自身が正常に動作する のに必要なパッケージで、これらを削除してしまうとシステムが全く動作 しなくなってしまいます。

9.1.2.1. ソースパッケージのインストール

ある特定のパッケージに対するソースパッケージをインストールするには、 下記のように入力します:

zypper source-install パッケージ名

このコマンドを実行すると、指定したパッケージを構築する際に必要となる パッケージについてもインストールを行ないます。このような動作を行ない たくない場合は、 -D スイッチを追加してください。 また、構築する際に必要なパッケージだけをインストールしたい場合は、 -d をお使いください。

zypper source-install -D パッケージ名 # ソースパッケージのみ
zypper source-install -d パッケージ名 # 構築時に必要なもののみ

もちろんこの機能は、有効に設定しているリポジトリの中にソース パッケージを提供するものがあった場合に動作します (ソース パッケージのリポジトリは既定で追加されるようになっていますが、有効に は設定されません) 。リポジトリの管理について、詳しくは 9.1.4項 「zypper を利用したリポジトリ管理」 をお読みください。

お使いのリポジトリ内で提供されている、全てのソースパッケージの一覧を 表示するには、下記のように入力します:

zypper search -t srcpackage

9.1.2.2. ユーティリティ

全てのパッケージ間の依存関係が満たされているかどうかを確認し、満たされて いない場合に修復処理を行なうには、下記のように入力します:

zypper verify

パッケージ間の依存関係は正しく解決されていなければならないほか、パッケージによっては 他のパッケージを 推奨 している場合があります。これらの推奨 パッケージは、それらが利用可能でインストールできるものであった場合にのみ インストールされます。ある特定のパッケージが推奨パッケージを指定していて、 それらのパッケージがインストールされた後で推奨パッケージが利用できるように なった場合は、下記のように入力します:

zypper install-new-recommends

このコマンドは Web カメラや無線 LAN デバイスを接続したような場合にとても 便利です。これにより、利用可能であればデバイスドライバや関連ソフトウエアが インストールされます。ドライバや関連ソフトウエアは、対応している特定の ハードウエア依存関係が満たされた場合にのみインストールできます。

9.1.3. zypper を利用したソフトウエア更新

zypper を利用したソフトウエア更新には、修正のインストール、最新バージョン のインストール、ディストリビューション全体の更新、と 3 種類の方法が あります。ディストリビューション全体の更新は、 16.1項 「システムのアップグレード」 で示されている zypper dist-upgrade コマンドで行ないます。

9.1.3.1. 修正のインストール

お使いのシステムに適用可能な全ての公式リリース修正をインストールするには、 下記のように入力します:

zypper patch

この場合、お使いのリポジトリ内にある全ての修正は適合性についてチェックが 行なわれ、必要と判断すればインストールが行なわれます。 上記のコマンドは必要なものを全てインストールする際に入力するコマンドです。

また、 zypper では 3 種類の方法で修正の存在可否を問い合わせることが できます:

zypper patch-check

必要な修正 (お使いのシステムにインストールする必要があるが、 まだインストールしていないもの) の数を表示します。

~ # zypper patch-check
リポジトリのデータを読み込んでいます...
インストール済みのパッケージを読み込んでいます...
5 個の修正が必要です (1 個のセキュリティ修正)
zypper list-patches

必要な修正 (お使いのシステムにインストールする必要があるが、 まだインストールしていないもの) について一覧を表示します。

~ # zypper list-patches
リポジトリのデータを読み込んでいます...
インストール済みのパッケージを読み込んでいます...

リポジトリ                         | 名前                           | バージョン | カテゴリ    | 状態
-----------------------------------+--------------------------------+------------+-------------+-----
openSUSE 11.3 11.3-1.82 向けの更新 | lxsession                      | 2776       | security    | 必要
zypper patches

openSUSE 向けに公開されている全ての修正を一覧表示します。 ただし既にインストールされているものや、インストールする必要のない ものについても表示します。

特定の発信番号に関連する修正を一覧表示したりインストールしたりすることが できます。特定の修正を一覧表示するには、 zypper list-patches コマンドを利用して下記のようなオプションを指定します:

--bugzilla[=番号]

Bugzilla による発信情報に対する修正を一覧表示します。任意でバグ番号を 指定し、特定のバグに対する修正一覧を表示することもできます。

--cve[=番号]

CVE (脆弱性情報データベース) による発信情報に対する修正を一覧表示 します。任意で CVE 番号を指定し、特定の番号に対する修正一覧を表示する こともできます。

特定の Bugzilla または CVE 発信情報に対する修正をインストールするには、 下記のように入力します:

zypper patch --bugzilla=番号

or

zypper patch --cve=番号

たとえば CVE 番号 CVE-2010-2713 に対するセキュリティ 修正をインストールするには、下記のように入力します:

zypper patch --cve=CVE-2010-2713

9.1.3.2. 更新のインストール

リポジトリには新しいパッケージが存在していてもそれらが修正の機能を 提供しない場合は、 zypper patch コマンドを 実行しても更新を行ないません。 全てのインストール済みパッケージについて、利用可能な最新バージョン に更新するには、下記のように入力します:

zypper update

個別のパッケージについて更新を行なうには、 update または install の角コマンドに続けてパッケージ名を指定してください:

zypper update パッケージ名
zypper install パッケージ名

また、インストール可能なすべての更新パッケージ一覧は、下記のコマンドで 表示することができます:

zypper list-updates

なお、このコマンドでは下記の条件に該当するパッケージのみが一覧表示されます:

  • 既にインストール済みのパッケージと製造元が同じもの

  • 既にインストール済みのパッケージと同じ優先度か、もしくはそれにより高い 優先度が設定されているリポジトリからのもの

  • インストール可能なもの (すべての依存関係が満たせるもの)

すべてのパッケージを (インストール可能かどうかは考慮せず) 一覧表示するには、 下記のように入力します:

zypper list-updates --all

新しいパッケージがなぜインストールできないのかを知るには、単純に zypper install または zypper update を利用してパッケージ名を指定してください。

9.1.3.3. 新しい製品バージョンへのアップグレード

お使いの環境を新しい製品バージョンに簡単にアップグレードする (たとえば openSUSE 11.4 から openSUSE 12.1 など) ためには、まずお使いのリポジトリを新しい openSUSE リポジトリに設定 する必要があります。詳しくは 9.1.4項 「zypper を利用したリポジトリ管理」 を お読みください。その後、必要なリポジトリに対して zypper dist-upgrade コマンドを利用してください。このコマンドにより、 現在有効化されているすべてのリポジトリからインストール済みのパッケージを 更新します。詳しい手順については 16.1.4項 「zypper を利用したディストリビューションアップグレード」 をお読みください。

ディストリビューションのアップグレードを、その他のリポジトリに対する依存関係が 満たされる限り、特定のリポジトリに限って実施したい場合は、 --from オプションを指定して別名または番号、もしくは URI でリポジトリを指定してください。

[Note]zypper updatezypper dist-upgrade の違い

zypper update は、お使いのシステムの一貫性を 保ちながら、新しいバージョンのパッケージをインストールしたい場合に 使用します。 zypper update では下記のルールを 厳守します:

製造元を変更しません
アーキテクチャの変更を行ないません
ダウングレードを行ないません
インストール済みのパッケージを保持し、インストールしたままにします

zypper dist-upgrade を実行した場合、その時点で有効に 設定されている全リポジトリからのパッケージがインストールされます。 このルールは強制的なもので、パッケージの製造元やアーキテクチャが変更される 場合があるほか、場合によってはダウングレードが行なわれる場合があります。 また、依存関係が満たされていないすべてのパッケージは、アップグレード後も インストールされないままになります。

9.1.4. zypper を利用したリポジトリ管理

zypper でのインストールコマンドや修正コマンドは、それを実行する時点で 設定されているリポジトリから行ないます。システムに設定済みのリポジトリ について、一覧を表示するには下記のように入力します:

zypper repos

実行すると、下記のように出力されます:

例9.1 zypper—既知のリポジトリの一覧表示

# | 別名                      | 名前                  | 有効       | 更新
--+---------------------------+-----------------------+------------+-----------
1 | Updates                   | Updates               | はい (Y)   | はい (Y)
2 | openSUSE 11.2-0           | openSUSE 11.2-0       | いいえ (N) | いいえ (N)
3 | openSUSE-11.2-Debug       | openSUSE-11.2-Debug   | いいえ (N) | はい (Y)
4 | openSUSE-11.2-Non-Oss     | openSUSE-11.2-Non-Oss | はい (Y)   | はい (Y)
5 | openSUSE-11.2-Oss         | openSUSE-11.2-Oss     | はい (Y)   | はい (Y)
6 | openSUSE-11.2-Source      | openSUSE-11.2-Source  | いいえ (N) | はい (Y)

様々なコマンドでリポジトリを指定する際は、上記の別名や URI のほか、 zypper repos の出力結果であるリポジトリ番号 (一番左の項目) でも指定することができます。また、リポジトリの別名とは リポジトリ名を使いやすく短縮したものです。なお、リポジトリ番号は リポジトリの修正を行なうと番号が変わる場合がありますのでご注意 ください。別名については、あえて変更しない限り変わることは ありません。

既定では URI やリポジトリの優先度など、詳細については表示されません。 全ての詳細を表示するには、下記のコマンドを入力します:

zypper repos -d

9.1.4.1. リポジトリの追加

リポジトリを追加するには、下記のように入力します:

zypper addrepo URI 別名

ここで、 URI はインターネット上のリポジトリを 指す場所でもかまいませんし、ネットワークやディレクトリ、 CD や DVD など でもかまいません (詳しくは http://ja.opensuse.org/Libzypp/URI をお読みください) 。また、 別名 はリポジトリに 対するユニークな短縮名を指定します。別名は他の別名と重複しない限り、どの ような名前でもかまいません。他の別名と重複する場合は、 zypper が警告 メッセージを表示します。

9.1.4.2. リポジトリの削除

一覧からリポジトリを削除したい場合は zypper removerepo コマンドを使用します。このコマンドの後に続けて削除したいリポジトリの別名や リポジトリ番号を指定します。たとえば 例9.1「zypper—既知のリポジトリの一覧表示」 の 例で 3 番目のリポジトリを削除するには、下記のコマンドを入力します:

zypper removerepo 3

9.1.4.3. リポジトリの編集

リポジトリの有効/無効を切り替えるには、 zypper modifyrepo コマンドを使用します。これ以外にも、リポジトリの設定 (更新可否, 名前, 優先度) についても修正することができます。たとえば下記の例では、 updates という名前のリポジトリについて、有効に設定して自動更新を行なうようにし、 かつ優先度を 20 にします:

zypper modifyrepo -er -p 20 'updates'

リポジトリの修正は 1 つのリポジトリに対して行なうこともできますが、 一括で指定することもできます:

-a: 全てのリポジトリ
-l: ローカルリポジトリ
-t: リモートリポジトリ
-m 種類: 特定の種類の リポジトリ (種類 には下記のような条件を 指定します: http, https, ftp, cd, dvd, dir, file, cifs, smb, nfs, hd, iso)

リポジトリの別名を変更するには、 renamerepo コマンドを 使用します。下記の例では、 Mozilla Firefox という別名を、 単に firefox という別名に変更します:

zypper renamerepo 'Mozilla Firefox' firefox

9.1.5. zypper を利用したリポジトリとパッケージの問い合わせ

zypper ではリポジトリやパッケージに対して様々な問い合わせを行なうことが できます。製品、パターン、パッケージ、修正について、利用可能な全てのものを 表示するには、下記のように入力します:

zypper products
zypper patterns
zypper packages
zypper patches

全てのリポジトリに対して特定のパッケージを問い合わせるには、 search コマンドを使用します。通常はパッケージ名を対象に して検索を行ないますが、オプション指定で概要と説明を対象に 含めることもできます。また、 *? のワイルドカードを使用することもできます。検索は通常、大文字と小文字を 区別せずに行ないます。

zypper search firefox       # 単純に "firefox" を検索
zypper search "*fire*"      # ワイルドカードを使用
zypper search -d fire       # パッケージの説明と概要を検索対象に含む
zypper search -u firefox    # 未インストールのパッケージだけを表示

ある特定の機能を提供するパッケージを検索するには、 what-provides コマンドを利用します。たとえば Perl のモジュール SVN::Core を提供するパッケージを検索したい場合は、下記のように入力します:

zypper what-provides 'perl(SVN::Core)'

単一のパッケージを問い合わせるには、パラメータに正確なパッケージ名を指定して info コマンドを実行します。これにより、そのパッケージ の詳細情報が表示されます。また、このパッケージが何を必要としているのか、 もしくは何を推奨しているのかについて表示するには、 --requires--recommends のオプションをそれぞれ指定します:

zypper info --requires MozillaFirefox

what-provides パッケージ名 コマンドは、 rpm -q --whatprovides パッケージ名 に似ていますが、 rpm は RPM データベース (全てのインストール済みパッケージ に関する情報を保持しているデータベース) に対して問い合わせるだけである のに対して、 zypper はインストールされていないものに対しても問い合わせる ことができます。

9.1.6. zypper の設定

zypper には設定ファイルが存在していて、 zypper の動作を恒久的に変更すること ができるようになっています (システム全体で設定できるほか、ユーザ単位でも設定 できます) 。システム全体での設定については /etc/zypp/zypper.conf ファイルを編集してください。また、ユーザ独自の変更を行ないたい場合は、 ~/.zypper.conf ファイルを編集してください。なお、 ~/.zypper.conf ファイルが存在しない場合は、 /etc/zypp/zypper.conf ファイルをテンプレートとして お使いください。左記のファイルを ~/.zypper.conf にコピーし、必要に応じて修正を行なってください。詳しい設定内容や利用可能な オプションについては、ファイル内のコメント文をお読みください。

9.1.7. トラブルシューティング

設定済みのリポジトリからのパッケージにアクセスする際、何らかの問題が発生した 場合 (たとえば確かにリポジトリ内に存在するパッケージであるにも関わらず、 zypper がそれを発見できない場合など) は、下記のコマンドでリポジトリの更新を 行なうことができます:

zypper refresh

これでもうまく動作しない場合は、下記をお試しください:

zypper refresh -fdb

これにより生のメタデータを強制的にダウンロードし、データベースの再構築を 行なって完全な更新を行ないます。

9.1.8. btrfs ファイルシステムにおける zypper のロールバック機能

ルートパーティションに対して btrfs ファイルシステムを使用しているシステム の場合、 snapper コマンドをインストールしていれば、 zypper はファイルシステムに対して変更を加える際、自動的に (snapper でインストールされるスクリプトを経由して) snapper を呼び出し、ファイルシステムのスナップショットを 採取します。これらのスナップショットは zypper で行なわれた変更を元に戻す際に 使用できるものです。 snapper について、詳しくは man snapper で表示されるマニュアルページをお読みください。

zypper (および YaST) は、現時点ではルートファイルシステムのスナップ ショットのみを採取します。それ以外のサブボリュームについては設定することが できません。また、この機能は既定のファイルシステムではサポートされていません。

9.1.9. さらなる情報

コマンドラインからのソフトウエア管理について、さらに詳しい情報は zypper help または zypper help  コマンド と入力することで表示される ヘルプをお読みいただくか、もしくは zypper(8) のマニュアルページをお読みください。 コマンドについて 完全かつ詳細なリファレンスのほか、 チートシート と 呼ばれる最も重要なコマンドについての情報、および zypper をスクリプトや アプリケーションから使用する方法については、 http://ja.opensuse.org/SDB:Zypper_usage をお読みください。 また、 openSUSE の最新バージョンについて変更点の一覧を読むには、 http://ja.opensuse.org/openSUSE:Zypper versions をご覧ください。

9.2. RPM - パッケージマネージャ

RPM (RPM パッケージマネージャ) はソフトウエアパッケージの管理ツールです。 主なコマンドは rpmrpmbuild の 2 つがあります。パワフルな RPM データベースの仕組みが存在するため、ユーザ からでもシステム管理者からでも、さらにいえばパッケージ構築者からでも、 インストール済みのソフトウエアについて詳細な情報を問い合わせることが できます。

rpm コマンドは基本的に 5 つのモードから構成されています: ソフトウエアのインストール, ソフトウエアのアンインストール (または更新), RPM データベースの再構築, RPM データベースや RPM パッケージへの問い合わせ, パッケージの一貫性確認と署名確認 の 5 つです。また、 rpmbuild コマンドは、ソースコードからインストール可能な パッケージを構築するために使用します。

インストール可能な RPM アーカイブは、特別なバイナリフォーマットの形式になって います。これらのアーカイブにはインストール対象のプログラムのほか、 インストール時に rpm コマンドがソフトウエアパッケージを 設定する際に使用するデータや、ドキュメンテーション化を目的とした RPM データベース のメタデータなどが含まれています。 RPM アーカイブは、通常 .rpm の拡張子を持っています。

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

ソフトウエア開発を行なう際に必要なパッケージ (ライブラリ、ヘッダファイル など) については、本体とは別途のパッケージで提供されています。これらの パッケージは、ソフトウエアのコンパイルをご自身で行ないたい場合にのみ必要 となります (たとえば最新の GNOME パッケージなど) 。これらは本体の パッケージ名の後ろに -devel という拡張子が追加されます。 たとえば alsa-devel, gimp-devel, libkde4-devel のようになります。

9.2.1. パッケージの署名検証

RPM パッケージには GPG による署名が付与されています。 RPM パッケージの 署名を検証するには、 rpm --checksig package-1.2.3.rpm のように入力し、 Novell/SUSE やその他の信頼のおける発信元から提供された ものであるかどうか確認してください。 これは特にインターネット経由でパッケージの更新を行なう場合にお勧めです。

9.2.2. パッケージの管理: インストール、更新、アンインストール

通常の場合、 RPM アーカイブのインストールは非常に簡単です: rpm -i パッケージ.rpm と 入力するだけです。このコマンドでインストールを行なうことができるのは、 このパッケージに対する依存関係が満たされ、他のパッケージとの矛盾が発生 しない場合のみです。依存関係で満たされない点があり、追加でインストール しておくべきソフトウエアが存在している場合、 rpm はエラーメッセージを表示してインストールを中止します。また同時に RPM データベースでは、矛盾が発生しないかどうかを確認します。この矛盾確認 では、ある特定のファイルが複数のパッケージに属すことにならないかどうか を確認します。なお、オプションを指定することで rpm コマンドに対してこれらの振る舞いを行なわないようにさせることも できますが、これは熟練者のみが使用すべきオプションです。知識や経験の ある方でなければ、システムの一貫性についてリスクを追うことに なりますし、システムの更新ができなくなってしまう場合もあります。

オプション設定 -U または --upgrade と、 -F または --freshen は、いずれも パッケージの更新を行なうためのコマンドです (たとえば rpm -F パッケージ名.rpm のように実行 します) 。このコマンドは古いバージョンのファイルを削除し、その後すぐに 新しいファイルをインストールする動作をします。また、これら 2 種類の コマンドの違いは、 -U がお使いのシステムに存在 していなかったパッケージについてはインストールを行ないますが、 -F ではそのようなパッケージはインストールせず、更新を 行なうだけになります。また更新の際、 rpm コマンドは 下記の方針で注意を払いながら、設定ファイルの更新を行ないます:

  • 設定ファイルを管理者が変更していない場合、 rpm は 設定ファイルの最新版をそのままインストールします。システム管理者側で 行なうべき作業はありません。

  • 更新を行なう前にシステム管理者が設定ファイルを書き換えていた場合、 rpm はその変更されたファイルを .rpmorig または .rpmsave (バックアップファイル) の拡張子を付けて保存し、新しいほうのパッケージ から新しい設定ファイルをインストールします (ただし元々インストール されていた設定ファイル (システム管理者が書き換える前のもの) と、 新たにインストールしようとしている設定ファイルが異なる場合のみ) 。 この場合は、バックアップファイル (.rpmorig または .rpmsave) と新たにインストールされたファイルを 比較し、新しいファイルに対して書き換えていた部分を反映してください。 その後、今後の更新で問題が発生しないようにするため、それぞれ .rpmorig.rpmsave の ファイルを削除してください。

  • なお、 .rpmnew ファイルが作成される場合も あります。これは設定ファイルが既に存在していて、 かつ そのファイルが .spec ファイル内で noreplace (置き換えを行なわない) ラベルが 設定されている場合に作成されます。

更新作業ののち、設定ファイルの比較と修正が終わったら、 .rpmsave.rpmnew ファイルは 削除しておいてください。これらのファイルは今後の更新を阻害する可能性が あるためです。また、 .rpmorig ファイルは、 RPM データベースで認識されていなかったファイルの場合に付与されます。

それ以外の場合には .rpmsave の拡張子が使用されます。 言い換えれば、 .rpmorig は RPM の管理対象外のファイル であった場合にのみ生成されます。また .rpmsave は 古いバージョンの RPM から新しいバージョンのものに更新した場合に、 .rpmnew はシステム管理者が設定ファイルに変更を行なった かどうかが不明である場合に生成されます。これらのファイルの一覧は、 /var/adm/rpmconfigcheck から取得できます。設定ファイル によっては (たとえば /etc/httpd/httpd.conf) 、 動作を継続させるために上書きを行なわない場合もあります。

なお、 -U スイッチでの処理は、 -e で いったんアンインストールしてから -i でインストールする のとは 処理が異なります 。可能な限り -U をお使いください。

パッケージを削除するには、 rpm -e パッケージ名 と入力します。 rpm は未解決の依存関係がなければ、 そのままパッケージだけを削除します。たとえば Tcl/Tk の削除のように、他の アプリケーションがそれを必要としている場合は、削除は不可能です。この 場合でも、 RPM はデータベースの助けを借りて処理を行ないます。もしも 何らかの理由で、依存関係の問題が 無い にも関わらず 削除ができない場合は、 RPM データベースを --rebuilddb で構築し直すことで解決するかもしれません。

9.2.3. 差分 RPM パッケージ

差分 RPM パッケージ (deltarpm) には、古いバージョンの RPM パッケージと 新しいバージョンの RPM パッケージの差分が含まれています。古いほうの RPM に対して差分 RPM を適用すると、新しいバージョンの RPM を作成すること ができるという仕組みです。また差分 RPM は、インストール済みの古いパッケージ からでも作成できる機能を備えています。そのため、古いほうの RPM について RPM ファイルそのもののコピーを保管しておく必要がありません。また、差分 RPM パッケージは修正 RPM よりもさらに小さいサイズになっているため、 インターネットを介して転送するのに都合の良いものになっています。逆に 差分 RPM での更新処理は、通常の RPM や修正 RPM よりも CPU 処理を多く 要してしまうという欠点があります。

それぞれ makedeltarpm, applydelta バイナリは、差分 RPM を扱うためのソフトウエア 一式 (deltarpm パッケージ) で、差分 RPM を作成したり 適用したりすることができます。たとえば下記のコマンドでは、 new.delta.rpm という名前の差分 RPM を生成します。 それぞれ old.rpmnew.rpm が 存在していることを前提にしています:

makedeltarpm old.rpm new.rpm new.delta.rpm

上記のようにファイルを作成したら、古いパッケージがインストールされている環境 で 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 をお読みください。

9.2.4. RPM への問い合わせ

rpm コマンドで -q を使用すると、 RPM アーカイブ内 (-p オプションで指定します) や RPM データベース 内を対象にして問い合わせを行なったり、調査を行なったりすることができます。 スイッチによっては情報の種類を指定する必要がある場合もあります。詳しくは 表9.1「最も重要な RPM 問い合わせオプション」 をお読みください。

表9.1 最も重要な RPM 問い合わせオプション

-i

パッケージ情報。

-l

ファイル一覧。

-f FILE

指定したファイルを含むパッケージ名。 ここで、 FILE はフルパス (ルートディレクトリ からの絶対パス) を指定します。

-s

状態情報付きのファイル一覧 (-l オプションの機能 を含みます) 。

-d

ドキュメンテーションファイルのみの一覧表示 (-l オプションの機能を含みます) 。

-c

設定ファイルのみの一覧表示 (-lオプションの機能を 含みます) 。

--dump

完全な詳細情報を含んだファイル一覧 (-l, -c, -d などと合わせて指定します)

--provides

他のパッケージから --requires で要求できるもので、 パッケージが提供する機能の一覧。

--requires, -R

パッケージが必要とする機能の一覧。

--scripts

インストール時のスクリプト (preinstall (インストール前), postinstall (インストール後), uninstall (アンインストール時))


たとえば rpm -q -i wget というコマンドを入力すると、 例9.2「rpm -q -i wget」 のように出力が行なわれます。

例9.2 rpm -q -i wget

Name        : wget                         Relocations: (not relocatable)
Version     : 1.11.4                            Vendor: openSUSE
Release     : 1.70                          Build Date: Sat 01 Aug 2009 09:49:48 CEST
Install Date: Thu 06 Aug 2009 14:53:24 CEST      Build Host: build18
Group       : Productivity/Networking/Web/Utilities   Source RPM: wget-1.11.4-1.70.src.rpm
Size        : 1525431                          License: GPL v3 or later
Signature   : RSA/8, Sat 01 Aug 2009 09:50:04 CEST, Key ID b88b2fd43dbdc284
Packager    : http://bugs.opensuse.org
URL         : http://www.gnu.org/software/wget/
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.8.0-4.3.x86_64
wget-1.11.4-11.18.x86_64

ファイル名の一部だけがわかっているような場合は、下記 (例9.3「パッケージの検索スクリプト」) に示すようなシェルスクリプトをご利用 ください。スクリプトのパラメータとしてファイル名の一部を与えると動作します。

例9.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 または --verify を指定してください。これらのオプションを 指定すると、 rpm は各パッケージに含まれるファイルについて、 インストール後に変更されたものを一覧表示します。なお、何が変更されたのかに ついては、 8 文字のシンボルで表示します。それぞれ下記のような意味になって います:

表9.2 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 内に保存するようになっています。コピーを保持しておく数については、 /etc/sysconfig/backup の設定ファイル内の MAX_RPMDB_BACKUPS 変数で設定することができます (既定値: 5) 。バックアップ 1 つごとに /usr ディレクトリ 1 GB (ギガバイト) あたり 1 MB (メガバイト) 程度が 必要です。

9.2.5. ソースパッケージからのコンパイルとインストール

全てのソースパッケージには、 .src.rpm という拡張子 (ソース RPM という意味) が付けられています。

[Note]ソースパッケージのインストール状態について

ソースパッケージは、 YaST を利用してインストールメディアからお使いの ハードディスクにコピーし、展開することができます。ただし、パッケージ マネージャ側ではインストール済み ([i]) としてマーク されることはありません。これはRPM データベースは インストール済み のオペレーティングシステムの ソフトウエアだけを登録すべき場所であるため、ソースパッケージについては RPM データベース内に登録されないためです。 です。従って、ソースパッケージ を インストール しても、ソースコードがシステム内に追加 されるだけの処理しか行ないません。

rpm コマンドや rpmbuild コマンドでは、 /usr/src/packages ディレクトリ以下の下記のサブ ディレクトリを使用します (/etc/rpmrc ファイルのような 形で別途設定した場合を除きます):

SOURCES

オリジナルのソースファイル (.tar.bz2.tar.gz などのファイル) およびディストリビューション 固有の調整 (多くは .diff.patch のファイル) が配置されます。

SPECS

.spec ファイルが配置されます。これはメタ Makefile とも 言うべきもので、 構築 処理をコントロールするための ファイルです。

BUILD

全てのソースコードを展開し、修正し、コンパイルするためのディレクトリです。

RPMS

構築済みのバイナリパッケージを保管するディレクトリです。

SRPMS

ソース RPM を保管するディレクトリです。

YaST を利用してソースパッケージをインストールすると、全ての必要な コンポーネントが /usr/src/packages 以下にインストール されます: ソースコードと細かい調整などが SOURCES サブディレクトリに、関連する .spec ファイルが SPECS サブディレクトリにインストールされます。

[Warning]

システムコンポーネント (glibc, rpm, sysvinit など) については、 構築を行なわないことをお勧めします。これらを書き換えてしまうと、システム 全体の安定性が損なわれる可能性があるためです。

下記の例は、 wget.src.rpm パッケージを利用した場合の 例です。ソースパッケージをインストールすると、下記のようなファイルが それぞれ存在しているはずです:

/usr/src/packages/SOURCES/wget-1.11.4.tar.bz2
/usr/src/packages/SOURCES/wgetrc.patch
/usr/src/packages/SPECS/wget.spec

ここから rpmbuild -bX /usr/src/packages/SPECS/wget.spec と実行すると、コンパイル作業を 行なうことができます。 X には、構築処理の様々な 段階を指定します。それぞれ下記のように指定します:

-bp

ソースコードを /usr/src/packages/BUILD ディレクトリ 以下に展開し、修正を適用します。

-bc

-bp に加え、コンパイル作業までを行ないます。

-bi

-bp に加え、構築済みのソフトウエアのインストールを行ない ます。 注意: パッケージが BuildRoot 機能に対応していない場合は、 既存の設定ファイルを上書きしてしまう可能性があります。

-bb

-bi に加え、バイナリパッケージの作成作業を行ないます。 コンパイルが成功すると、バイナリは /usr/src/packages/RPMS ディレクトリ内に作成されます。

-ba

-bb に加え、ソース RPM の作成作業を行ないます。 コンパイルが成功すると、ソース RPM は /usr/src/packages/SRPMS ディレクトリ内に作成されます。

--short-circuit

いくつかの手順を飛ばします。

バイナリ RPM を作成すると、 rpm -irpm -U コマンドを利用してインストール することができるようになります。インストール後は、 RPM データベース内に 登録されるようになります。

9.2.6. build を利用した RPM パッケージのコンパイル

多くのパッケージをコンパイルするにあたって危険となるのは、構築処理の 最中に実行中のシステムに対し、予期しないファイルが追加されてしまう ことです。これを防ぐため、パッケージを構築するための設定済み環境を 構築するための build をお使いください。 この chroot 環境を確立するため、 build スクリプトを 完全なパッケージツリーを指定して実行してください。このツリーはハード ディスクや NFS, DVD から利用することができます。 build --rpms ディレクトリ のようにして実行して ください。なお 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 コマンドを実行して表示するか、 build のマニュアルページ をお読みください。

9.2.7. RPM アーカイブと RPM データベース向けのツール

Midnight Commander (mc) では、 RPM アーカイブの内容を 表示したり、それらの一部をコピーしたりすることができます。このソフトウエア ではアーカイブを仮想的なファイルシステムとしてアクセスすることができるため、 Midnight Commander で実行できる全てのメニューを RPM アーカイブの内容に対して 実行することができます。 F3HEADER ファイルの表示を行なうことができるほか、カーソルキーと Enter キーでアーカイブ構造を閲覧したりすることができます。 また、 F5 でアーカイブの内容をコピーすることもできます。

また、完全機能のパッケージマネージャを必要とする場合は、 YaST モジュール (第5章 ソフトウエアのインストールと削除 をお読みください) をお使いください。


openSUSE スタートアップ 13.1