RPMパッケージの管理(rpm、yum)

rpmコマンドはシステムにインストールされているパッケージの管理を行う。インストール、アンインストールの際、依存性のある他パッケージの状況チェックが行われる。自動アップデートを行うにはyumが便利→RHEL/CentOS 8系からはyumに相当するコマンドがdnfに変わっているが使い方は同様。

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

ダウンロードやビルドによって得られたRPMパッケージをマニュアルでインストールする方法は以下の通り。自動アップデート管理下でインストールするならyumコマンドでインストールを行う。但し、yumを用いる場合、既定の設定では署名していないパッケージのインストールはできない(設定により回避は可能)。パッケージへ署名する方法についてはパッケージへの署名参照。

【書式】
(1)パッケージのインストール
rpm -i | --install インストールオプション パッケージファイル名
パッケージファイル名にはftpやhttpのURLを指定することもできる。以下同様。
※パッケージファイル名にrpmバイナリを指定すればインストール、
 rpmソースパッケージ(SRPM)を指定すればビルドディレクトリの展開とspecファイルの作成が行われる
 →パッケージの作成(ソースパッケージより)参照。
(2)パッケージのアップグレード(なければ新規インストール)
rpm -U | --upgrade インストールオプション パッケージファイル名
(3)パッケージの更新(インストール済みパッケージのみ)
rpm -F | --freshen インストールオプション パッケージファイル名

インストールオプション

--aid
指定されたパッケージが必要であればインストール処理に加える。
--allfiles
パッケージ内のmissingokファイルが存在するかどうかに関わらずインストールやアップグレードを行う。
--badreloc
--relocateと一緒に使うと、パッケージの再配置のヒントの中に古いパスが含まれていなくても、全てのファイルパスの再配置を許可する。
--excludepath 古いパス
パス名が古いパスで始まるファイルをインストールしない。
--excludedocs
manページ、tenxinfo文書を含めた文書であるとマークされたファイルはインストールしない。
--force
--replacepkgs, --replacefiles, --oldpackageを組み合わせたものと同じ。状況に関わらず強制的にインストールする。
-h, --hash
パッケージのインストール進行状況をハッシュマーク(#)で示す。各パッケージとも全体量を50個の#で示す(1個2%)。
--ignoresize
--ignorearch
--ignoreos
--includedocs
--justdb
--nodeps
--nodigest
--nosignature
--nosuggest
--noorder
--noscripts
--nopre
--nopost
--nopreun
--nopostun
それぞれ同名のスクリプトを実行しない。 --nopre --nopost --nopreun --nopostunを指定すると、それぞれ%pre,%post,%preun,%postunに記述されたスクリプト群を実行しない。--noscriptsを指定するのは上記4オプション全てを指定したのと同じ。これら全てのスクリプト群を実行しない。
--notriggers
--oldpackage
--percent
--prefix 新規パス
--relocate 古いパス=新規パス
--repackage
--replacefiles
--replacepkgs
--test

パッケージの削除

インストールと同様。

【書式】
rpm -e | --erase --allmatches --nodeps --noscripts --notriggers --repackage --test パッケージファイル名

削除オプション

--allmatches
パッケージ名に一致する全バージョンのパッケージを削除する。
--nodeps
パッケージを削除する前に依存性のチェックを行わない。

パッケージの作成(ソースコードより)

ソースコードからRPMバイナリパッケージ(インストールに必要なソフトウェアをひとまとめにしたもの)を作る(ビルドする)にはrpmbuildコマンドを用いる。パッケージはファイルを圧縮してひとまとめにしたもの(アーカイブ)と、インストール・アンインストールに必要な情報を含むメタデータ(補助スクリプト、ファイル属性情報、パッケージに関する説明など)とで構成される。メタデータファイルであるspecファイルがソースバイナリに含まれていなければ自身で記述する必要あり(含まれていても環境に合うよう調整が必要な場合もある)。

【書式1】specファイルからパッケージを作成する
rpmbuild -bステージ オプション specファイル名 ...
【書式2】ソースコードのtarballファイルからspecファイルを探してパッケージを作成する
rpmbuild -tステージ オプション tarファイル名 ...
【書式3】パッケージの再コンパイル
rpmbuild --rebuild | recompile ソースパッケージファイル名 ...
【書式4】パッケージの設定表示
rpmbuild --showrc

オプション(全般)

-?, --help
ヘルプ表示。
--version
バージョン表示。
-v
情報を多く表示(進捗状況など)
-vv
情報を更に多く表示(デバッグ情報など)
--rcfile ファイルリスト
コロンで区切って名前を指定したファイル群から設定情報を読み込む。読み込む順序は指定順。既定値は/usr/lib/rpm/rpmrc:/usr/lib/rpm/red-hat/rpmrc:~/.rpmrc
--pipe コマンド名
rpmコマンドの出力結果をコマンド名で指定したコマンドに渡す。
--dbpath ディレクトリ名
データベースへのパスとして既定の/var/lib/rpmではなく、ディレクトリ名で指定したディレクトリを使う。
--root ディレクトリ名
全ての処理を、ディレクトリ名で指定したディレクトリをルートとして行う。ディレクトリ名内にあるデータベースが依存性のチェックに用いられ、ディレクトリ名にchrootを行った後で全てのスクリプトが実行される。

ステージ

オプション 実行ステージ パッケージ作成 備考
%prep
(準備)
%build
(コンパイル)
%install
(インストール)
.rpm
(バイナリ)
.src.rpm
(ソース)
-a
-b
-s
-p 通常、ソースを展開しこの後にパッチを適用するのに用いる。
-c %prep(準備)と%build(コンパイル)を実行する。
-i %prep, %build(準備とコンパイル)を実行した後に行う。
-l %filesに記された各ファイルが存在することをチェックする。

オプション(作成)

--buildroot ディレクトリ
パッケージ作成時、BuildRootタグをディレクトリに書き換える。
--clean
パッケージ作成後、ビルドツリー(パッケージ作成作業ディレクトリ)を削除する。
--nobuild
パッケージ作成は行わない。specファイルの検査に用いる。
--rmsource
ソースを削除する。パッケージ作成時に指定することも、単独で使用することもできる。
--rmspec
specファイルを削除する。パッケージ作成時に指定することも、単独で使用することもできる。
--short-circuit
ステージ指定した段階へ直接進む。-bc, bi, -tc, -tiでのみ使用可能。
--sign
パッケージにGPG署名を埋め込む。パッケージの出所と完全性の検証に利用できる。
--target プラットフォーム
パッケージ作成時、プラットフォームを arch-vendor-os (アーキテクチャ-ベンダー-OS)と解釈し、それに応じて %_target, %_target_arch, %_target_osを設定する。

書式3のモード

--recompile
以下の処理が実行される。
  1. 指定されたソースパッケージのインストール
    ソースファイルをまとめたtarballが "/usr/src/redhat/SOURCES" 以下に、specファイルが "/usr/src/redhat/SPECS" 以下にインストールされる。
  2. ソースの解凍
  3. ソフトウェアのビルド
  4. ソフトウェアのインストール
  5. テストの実行
rpm -i または rpm -U を実行するのと似ているが、rpmbuild --recompileの場合は、RPMデータベースがアップデートされない。そのため、その後rpmでパッケージのアップデートやパッケージの検証を行った場合問題が生じうる。
--rebuild
--recompileオプションを指定した時の処理の後、以下の2つの処理が行われる。
  1. バイナリパッケージの作成
  2. ビルドディレクトリの削除とcleanスクリプトの実行
これは以下のような場合に用いられる。
  • ビルド環境(コンパイラ、ライブラリなど)が変わった時
  • 異なるアーキテクチャ用のバイナリパッケージを作成(ビルド)する時
【例】ソースtarballからのビルド
cd /usr/src/redhat/SOURCES/ ←ソース置き場へ移動
wget http://prdownloads.sourceforge.net/gauche/Gauche-0.9.tgz ←ソース
rpmbuild -tb Gauche-0.9.tgz →オプションを"-ta"とするとrpmソースパッケージ(.src.rpm)も作成される
→/usr/src/redhat/RPMS/以下のアーキテクチャに応じたサブディレクトリ配下にrpmパッケージが作成される。

【例】ソースパッケージからのビルド
cd /usr/src/redhat/SRPMS/ ←ソースパッケージ置き場へ移動
wget wget http://dag.wieers.com/rpm/packages/perl-ExtUtils-AutoInstall/perl-ExtUtils-AutoInstall-0.63-1.test.src.rpm
rpm -ivh perl-ExtUtils-AutoInstall-0.63-1.test.src.rpm
cd ../SPECS
rpmbuild -bb perl-ExtUtils-AutoInstall.spec
→/usr/src/redhat/RPMS/以下のアーキテクチャに応じたサブディレクトリ配下にrpmパッケージが作成される。

ユーザホームディレクトリの.rpmmacrosに、RPMビルド関係のルートディレクトリ(既定値は/usr/src/redhat)を変更する指定などを行うことができる[38]

例:ルートを/tmp/redhatに設定する
%_topdir  /tmp/redhat

/usr/src/redhat は通常所有者がrootになっていてrootでないとPermission deniedエラーが出てしまうが、rootでrpmbuildを行う場合、誤ってシステムにファイルを書き込んでシステムを破壊する危険がある。一般ユーザのホームディレクトリ配下などで実施しても良いが、ここがNFSマウントされた領域である場合rpmbuild処理が遅くなるので、ローカルディスク領域で一般ユーザでも書き込める/tmp配下をルートに指定する場合を想定したのが上記事例。

デフォルトでは作成されるdebuginfoパッケージを作成しないようにするには19

%debug_package %{nil}

作成されるRPMパッケージのファイル名はrpm --showrcコマンドで確認できる。

$ rpm --showrc | grep _build_name_fmt
-14: _build_name_fmt	%%{ARCH}/%%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm
-14: _rpmfilename	%{_build_name_fmt}

これを変更するにはspecファイルの冒頭部分で _rpmfilename 変数の値を書き換えればよいとのこと[42]

【例】
%define _rpmfilename %%{NAME}.%%{OS}.%%{ARCH}.rpm

パッケージの作成関係のトラブルシューティング

libtoolを使うところで、インストールパスが本番のパスになる

libgd のRPMビルドを行う際、installステップで make install を実行する段階において、libtoolが用いられているが、この時インストール先として実際のインストール先ディレクトリ(/usr/lib など)にインストールしようという動きをする。一般ユーザでビルドする際、Permission deniedで書き込めず、ビルドに失敗する。

make installの際、DESTDIRの指定を追加するとうまくいった[41]

[user@server ~]$ cd /home/user/rpmbuild/SPECS
[user@server SPECS]$ rpmbuild -bi libgd.spec
...
test -z "/usr/lib64" || /bin/mkdir -p "/usr/lib64"
  /bin/sh ../libtool   --mode=install /usr/bin/install -c   libgd.la '/usr/lib64'
  libtool: install: /usr/bin/install -c .libs/libgd.so.3.0.0 /usr/lib64/libgd.so.3.0.0
  /usr/bin/install: cannot create regular file `/usr/lib64/libgd.so.3.0.0': Permission denied
  make[2]: *** [install-libLTLIBRARIES] Error 1
...
[user@server ~]$ cat libgd.spec
...
make install
↓以下の通りインストール先を指定
make install DESTDIR=${RPM_BUILD_ROOT}

RPMソース修正スクリプト(patch)の書き方

元のファイルと修正後のファイルを作って、-ruオプション(-r: サブディレクトリも検索、-u: unified形式で出力)を付けてdiffコマンドを使えばRPMソース修正スクリプト(patch)を作ることができる[39][40]

# rpmビルドルートは ~/rpmbuild
[user@server ~]$ cd rpmbuild/SOURCES
# ソースのtarball解凍・展開
[user@server SOURCES]$ tar -zxvf hoge-1.2.3.tar.gz
# 元データのバックアップを作る
[user@server SOURCES]$ cp -rp hoge-1.2.3 hoge-1.2.3-orig
# 編集する
[user@server SOURCES]$ vim hoge-1.2.3/somefile
# unified形式で差分情報を取る
[user@server SOURCES]$ diff -ru hoge-1.2.3-orig hoge-1.2.3 >hoge-1.2.3.patch
[user@server SOURCES]$ cat hoge-1.2.3.patch
diff -ru hoge-1.2.3-orig/somefile hoge-1.2.3/somefile
--- hoge-1.2.3-orig/somefile	2016-11-18 16:44:50.254897831 +0900
+++ hoge-1.2.3/somefile	2016-11-21 15:50:53.106467448 +0900
@@ -696,9 +696,6 @@
     MP_TRACE_e(MP_FUNC, "env_unload - ptr: %x obj: %x flags: %x",
                mg->mg_ptr, mg->mg_obj, mg->mg_flags);
 
-    /* ここを削除 */
-    echo "これはうそだよ〜ん。";
-
+    /* こっちが本当 */
+    echo "こっちが本物だよ〜ん。";
+
     /* Restore perl's original version */
     sv_magicext((SV*)ENVHV, (SV*)NULL, PERL_MAGIC_env, &PL_vtbl_env, (char*)NULL, 0);
 }
[user@server SOURCES]$ cat ../SPECS/hoge.spec
...
Patch: %{name}-%{version}.patch
Patch1: %{name}-%{version}-1.patch

...
%prep
%setup -q -n %{name}-%{version}
%patch -p1
%patch1 -p1 
#上記事例の場合上位1階層を除去するのでp1

パッケージの作成(ソースパッケージより)

RPMパッケージには、バイナリパッケージ作成に必要な指示書とソースコードで構成されるソースパッケージ(SRPM)という形式も存在する。このパッケージに対してインストール指示を出すと、環境に応じた指示書(specファイル)とソースバイナリのtarball、そして場合によってはパッチファイルも生成される。

【例】
[root@server ~]# cd /usr/src/redhat/SRPMS
[root@server SRPMS]# wget ftp://ftp.riken.jp/Linux/fedora/development/source/SRPMS/libedit-3.0-2.20090923cvs.fc14.src.rpm
libedit-3.0-2.20090923cvs.fc14.src.rpm
[root@server SRPMS]# rpm -ivh libedit-3.0-2.20090923cvs.fc14.src.rpm
   1:libedit                警告: ユーザ mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザ mockbuild は存在しません - root を使用します###  ( 97%)
警告: グループ mockbuild は存在しません - root を使用します
警告: ユーザ mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
########################################### [100%]
警告: ユーザ mockbuild は存在しません - root を使用します
警告: グループ mockbuild は存在しません - root を使用します
[root@server SRPMS]# ls ../SOURCES/
libedit-20090923-3.0.tar.gz
libedit-3.0-sigwinch.patch
libedit-3.0-warnings.patch
[root@server SRPMS]# ls ../SPECS/
libedit.spec

パッケージへの署名

rpmパッケージへの署名は必須ではないが、署名しておけば改竄が行われていない本物であることを証明できる。なお、yum は既定の設定では署名のないパッケージのインストールは拒否されてしまうようである(yumの設定で回避は可能)。

  1. GPG鍵の作成→詳細は署名の確認や管理参照。
  2. RPMへ署名(1)「~/.rpmmacros」ファイルの作成
    %_signature   gpg
    %_gpg_path    /home/user/.gnupg ←これと同一ディレクトリにいるなら無くてもよい
    %_gpg_name    Gpg User (foo) <user@hoge.com> ←前項のGPG鍵作成時に指定した内容
    %_gpgbin      /usr/bin/gpg ←パスが通っていれば(=which gpg でパスが表示されれば)不要
    
  3. RPMへ署名(2) 署名の実行
    sudo rpm --resign /usr/src/redhat/RPMS/アーキテクチャ/rpmパッケージファイル名
    アーキテクチャにはi386などのアーキテクチャを示す名前が入る
    rpmパッケージファイル名にはワイルドカード使用可能
    ※"--resign"オプションは、"--addsign"でも同じ
    【例】
    [user@server ~]$ sudo rpm --resign /usr/src/redhat/RPMS/x86_64/Gauche-utf8-0.9-1.x86_64.rpm
    パスワード: ←sudo実行のため、ユーザのログインパスワードを入力(表示されない)
    パスフレーズの入力: ←GPG鍵作成時に設定したパスワードを入力(表示されない)
    パスフレーズは正常です。
      /usr/src/redhat/RPMS/x86_64/Gauche-utf8-0.9-1.x86_64.rpm:
      gpg: WARNING: standard input reopened
      gpg: WARNING: unsafe ownership on configuration file `/home/user/.gnupg/gpg.conf'
      gpg: WARNING: standard input reopened
      gpg: WARNING: unsafe ownership on configuration file `/home/user/.gnupg/gpg.conf'
    
  4. 公開鍵の作成
    gpg -a --export GPG鍵に設定されたメールアドレス > 公開鍵ファイル名
    【例】カレントディレクトリに"public.key"というファイル名で公開鍵ファイルを作成する
    [user@server ~]$ gpg -a --export user@hoge.com > public.key
    
  5. 公開鍵のインポート
    sudo rpm --import 公開鍵ファイル名
    【例】
    [user@server ~]$ sudo rpm --import public.key
    
  6. rpmファイルの検証
    rpm -K rpmパッケージファイル名
    【例】
    [user@server ~]$ rpm -K /usr/src/redhat/RPMS/x86_64/Gauche-utf8-0.9-1.x86_64.rpm
    /usr/src/redhat/RPMS/x86_64/Gauche-utf8-0.9-1.x86_64.rpm: (sha1) dsa sha1 md5 gpg OK
    

パッケージからのファイル取り出し

RPMパッケージをインストールすることなくファイルを取り出すには、(1)rpm2cpioコマンドでcpio形式に変換、(2)cpioコマンドで解凍展開。rpm2cpioは実際にはperlスクリプト[23]。cpio はRHEL5の場合、入っているみたい。

【書式】rpm2cpioの処理結果をcpioにパイプ、
./rpm2cpio RPMファイル名 | cpio -idmv
# cpio のオプションについて
-i: コピーインモードで実行(--extract)
-d: 必要に応じてディレクトリ作成(--make-directories)
-m: 元のファイル更新時刻を保持(--preserver-modification-time)
-v: 処理されたファイル名を表示(--verbose)

ソースRPMがあれば展開してみなくてもspecファイルだけを取り出すこともできる[44]

RPMパッケージに含まれるファイルの問い合わせ(repoquery)

yum-utils というパッケージで提供される repoquery というコマンドを使ってRPMパッケージに含まれるファイル一覧が得られる46

【書式】
$ repoquery -l パッケージ名

【例】
$ repoquery -l oniguruma
[pdbj@filesv SPECS]$ repoquery -l oniguruma
/usr/lib/libonig.so.2
/usr/lib/libonig.so.2.0.0
/usr/share/doc/oniguruma-5.9.1
/usr/share/doc/oniguruma-5.9.1/AUTHORS
/usr/share/doc/oniguruma-5.9.1/COPYING
/usr/share/doc/oniguruma-5.9.1/HISTORY
/usr/share/doc/oniguruma-5.9.1/README
/usr/share/doc/oniguruma-5.9.1/README.ja
/usr/share/doc/oniguruma-5.9.1/index.html
/usr/share/doc/oniguruma-5.9.1/index_ja.html
/usr/lib64/libonig.so.2
/usr/lib64/libonig.so.2.0.0
/usr/share/doc/oniguruma-5.9.1
/usr/share/doc/oniguruma-5.9.1/AUTHORS
/usr/share/doc/oniguruma-5.9.1/COPYING
/usr/share/doc/oniguruma-5.9.1/HISTORY
/usr/share/doc/oniguruma-5.9.1/README
/usr/share/doc/oniguruma-5.9.1/README.ja
/usr/share/doc/oniguruma-5.9.1/index.html

import済み公開鍵の表示

【書式】
rpm -qi gpg-pubkey-鍵ID

【例】
# rpm -qi gpg-pubkey-874ac728
Name        : gpg-pubkey                   Relocations: (not relocatable)
Version     : 874ac728                          Vendor: (none)
Release     : 580d92da                      Build Date: 2016年10月24日 14時22分45秒
Install Date: 2016年10月24日 14時22分45秒      Build Host: localhost
Group       : Public Keys                   Source RPM: (none)
Size        : 0                                License: pubkey
Signature   : (none)
Summary     : gpg(Kanrisya Desu (admin) <admin@hoge.org>)
Description :
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: rpm-4.8.0 (NSS-3)

mQENBFgNktoBCADh72CEPg1Lz+G8wN5T+t9BI3oWB2Wmdcis3zUBLnHubnf2xrj3
...
-----END PGP PUBLIC KEY BLOCK-----

rpmパッケージがこの公開鍵に対応する秘密鍵で署名されている場合、(1)これをテキストに出力しておき、(2)rpmレポジトリ情報に記載しておけば、公開鍵が未importであった場合、importが行われる。

【例】rpmレポジトリサーバのWeb DocumentRootが /var/www/html、鍵IDが874ac728
[root@server ~]# rpm -qi gpg-pubkey-874ac728 > /var/www/html/rpmrepo/RPM-GPG-KEY.txt

[root@client ~]# cat /etc/yum.repos.d/hoge.repo
[hoge-base]
name=Hoge Original repository for $basearch
baseurl=http://server/rpmrepo/RPMS/$basearch/
gpgcheck=1
enabled=1
gpgkey=http://server/rpmrepo/RPM-GPG-KEY.txt

[hoge-noarch]
name=Hoge Original repository for noarch
baseurl=http://server/rpmrepo/RPMS/noarch/
gpgcheck=1
enabled=1
gpgkey=http://server/rpmrepo/RPM-GPG-KEY.txt
[root@client ~]# yum install hoge
...
warning: rpmts_HdrFromFdno: Header V4 RSA/SHA1 Signature, key ID 874ac728: NOKEY
Retrieving key from http://server/rpmrepo/RPM-GPG-KEY.txt
Importing GPG key 0x874AC728:
 Userid: "Kanrisya Desu (admin) <admin@hoge.org>"
 From  : http://server/rpmrepo/RPM-GPG-KEY.txt
Is this ok [y/N]: y
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
...

その他rpmコマンドについて

【書式1】パッケージの検索と検査
rpm -q | --query 選択オプション 検索オプション
rpm -V | --verify 選択オプション 検索オプション
rpm --import 公開鍵
rpm -K | --checksig --nogpg --nopgp --nomd5 パッケージファイル名 ...
【書式2】その他
rpm --initdb | --rebuilddb
rpm --addsign | --resign パッケージファイル名 ...
rpm --querytags | --showrc
rpm --setperms | --setugids パッケージファイル名 ...

共通オプション

-?, --help
ヘルプ表示。
--version
バージョン表示。
-v
情報を多く表示(進捗状況など)
-vv
情報を更に多く表示(デバッグ情報など)
--rcfile ファイルリスト
コロンで区切って名前を指定したファイル群から設定情報を読み込む。読み込む順序は指定順。既定値は/usr/lib/rpm/rpmrc:/usr/lib/rpm/red-hat/rpmrc:~/.rpmrc
--pipe コマンド名
rpmコマンドの出力結果をコマンド名で指定したコマンドに渡す。
--dbpath ディレクトリ名
データベースへのパスとして既定の/var/lib/rpmではなく、ディレクトリ名で指定したディレクトリを使う。
--root ディレクトリ名
全ての処理を、ディレクトリ名で指定したディレクトリをルートとして行う。ディレクトリ名内にあるデータベースが依存性のチェックに用いられ、ディレクトリ名にchrootを行った後で全てのスクリプトが実行される。

選択オプション

パッケージ名
-a, --all
インストールされているすべてのパッケージを検索する。
-g, --group グループ名
-p, --package パッケージファイル名
--fileid MD5ハッシュ値
--hdrid SHA1ハッシュ値
--pkgid MD5ハッシュ値
--tid TID値
--querybynumber HDR番号
--triggerdby パッケージ名
--whatprovies capability
--whatrequires capability

検索オプション

--changelog
-c, --configfiles
-d, --docfiles
--dump
--filesbypkg
-i, --info
--last
パッケージをインストール時刻順に、最新のパッケージが先頭になるような順で並べる。
-l, --list
--provides
--qf, --queryformat 条件形式
--scripts
-s, --state
--triggers, --triggerscripts
【例1】名前にhttpdを含むパッケージの一覧を出力
shell> rpm -qa | grep httpd
httpd-manual-2.2.3-11.el5_2.centos.4
system-config-httpd-1.3.3.3-1.el5
httpd-devel-2.2.3-22.el5.centos.2
httpd-manual-2.2.3-22.el5.centos.2
httpd-devel-2.2.3-11.el5_2.centos.4
httpd-2.2.3-11.el5_2.centos.4
httpd-2.2.3-22.el5.centos.2

検査オプション

--nomd5
md5チェックサムを検査しない。以下のようなエラーが出る場合、それを無視してインストールしたい場合に使える[21]
[root@server SRPMS]# rpm -ivh libedit-3.0-2.20090923cvs.fc14.src.rpm 
   1:libedit                警告: ユーザ mockbuild は存在しません - root を使用します
  警告: グループ mockbuild は存在しません - root を使用します
  ########################################### [100%]
  エラー: アーカイブの伸長に失敗: ファイル /usr/src/redhat/SOURCES/
  libedit-20090923-3.0.tar.gz;4bf9fa6b: cpio: MD5 チェックサムが適合しません。
[root@server SRPMS]# rpm -ivh --nomd5 libedit-3.0-2.20090923cvs.fc14.src.rpm 
   1:libedit                警告: ユーザ mockbuild は存在しません - root を使用します
  警告: グループ mockbuild は存在しません - root を使用します
  警告: ユーザ mockbuild は存在しません - root を使用します###  ( 97%)
  警告: グループ mockbuild は存在しません - root を使用します
  警告: ユーザ mockbuild は存在しません - root を使用します
  警告: グループ mockbuild は存在しません - root を使用します
  ########################################### [100%]
  警告: ユーザ mockbuild は存在しません - root を使用します
  警告: グループ mockbuild は存在しません - root を使用します
オプション 内容
-i パッケージファイルをインストールする
-U パッケージをアップグレードする
-q パッケージに関する情報を表示する
-e パッケージ削除
-h インストールの進行状況を「#」で表示
-v 詳細情報表示
-vv 更に詳細情報表示
-a 全てのインストール済みパッケージの問い合わせ
--test 実際にインストールは行わず、検査のみ行う
--version バージョン表示。

パッケージ類のアップデート管理(yum)

yum(Yellowdog Updater Modifed)はrpmを使ってシステムを維持するのに利用できる対話的、自動アップデートプログラム。

【書式】
yum オプション コマンド パッケージ名

コマンド

install パッケージ名1 パッケージ名2 ...
全ての依存性を保ちつつ最新のパッケージ(群)をインストールする。指定されたパッケージ名に一致するパッケージが見つからなかった場合、それはシェル群であると仮定し、いずれかに一致するものがインストールされる。
localinstall パッケージ名1 パッケージ名2 ...
ローカルのrpmファイルを利用してインストールする。パッケージ名はワイルドカード使用可能。なお、自身でビルドしたrpmパッケージの場合、署名がないことが多いが、署名がないと既定の設定ではインストールできない。yumの設定ファイル(/etc/yum.conf)中の「gpgcheck=1」を「gpgcheck=0」に変更すれば署名チェックは行われなくなる(参照:How to install a not signed rpm with yum? [Archive] - FedoraForum.org)。
update パッケージ名1 パッケージ名2 ...
何もパッケージ名を指定しなかった場合、現在インストールされている全てのパッケージを更新する。1つ以上のパッケージ名を指定した場合、指定したパッケージだけが更新される。更新の際、全ての依存性は保持される。--obsoletesを指定すると、廃止されたカタログも対象となる。
localupdate パッケージ名1 パッケージ名2 ...
ローカルのrpmファイルを利用してアップデートする。
check-update
アップデートされたパッケージがないかをチェックする。あれば100と、アップデートされたパッケージの一覧が返される。なければ0が返される。
upgrade パッケージ名1 パッケージ名2 ...
update --obsoletesと同じ。
remove パッケージ名1 パッケージ名2 ...
指定したパッケージを削除する。
erase パッケージ名1 パッケージ名2 ...
removeと同じ。
list パッケージ名...
利用可能なパッケージに関する様々な情報一覧を得る。パッケージ名を指定しなければ全て表示。
info パッケージ名...
利用可能なパッケージに関する要約情報一覧を得る。パッケージ名を指定しなければ全て表示。
repolist all | enabled | disables
resolvedep パッケージ名
clean 対象
yumキャッシュを消去する。対象として指定できる値は下記いずれか一つ。内容と合わせて以下に記す。
指定値 内容
expire-cache
packages ダウンロードしシステム内に保存されたパッケージデータを消去する。パッケージはダウンロード・インストールが完了しても自動的には削除されないことに注意。
headers 依存性解決の際使われたヘッダ情報を全て消去する。
metadata リモートリポジトリで利用可能なパッケージを決定するのに用いたメタデータのキャッシュファイルを削除する。このオプションを使うと、次回yumを実行した時、全てのメタデータを強制的にダウンロードし直すことになります。
dbcache メタデータに高速でアクセスするために作られるsqliteキャッシュを消去します。このオプションを使うと、次回yumを実行した時、全てのメタデータを強制的にダウンロードしてデータベースを再構築することになります。
all yum clean packagesyum clean packagesyum clean packagesyum clean packagesの4つを実行するのと同じです。

オプション

-h, --help
ヘルプメッセージを表示して終了。
-v, --verbose
デバッグ出力しながら処理が実行されます。
--version
バージョン情報を表示して終了。
--enablerepo=レポジトリidまたはglob
設定ファイル(configuration file)中でenabled=0オプションを使って無効化された、レポジトリidまたはglobで指定したレポジトリを有効にします。
	# cat /etc/yum.repos.d/myrepo.repo
	[myrepo-x86-64]
	  name=My Personal repository for x86_64
	  baseurl=http://localhost/rpmrepo/myrepo/x86_64/
	  gpgcheck=1
	  enabled=0 ←このレポジトリの参照は設定で無効化されている
	  gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-myrepo
	# yum list httpd
	Loaded plugins: fastestmirror
	  Loading mirror speeds from cached hostfile
	  * base: ftp.iij.ad.jp
	  * extras: ftp.iij.ad.jp
	  * updates: ftp.nara.wide.ad.jp
	  Excluding Packages in global exclude list
	  Finished
	  Installed Packages
	  httpd.x86_64                             2.2.3-65.el5.centos.3                             installed
	# yum list  --enablerepo=myrepo
	Loaded plugins: fastestmirror
	  Loading mirror speeds from cached hostfile
	  * base: ftp.iij.ad.jp
	  * extras: ftp.iij.ad.jp
	  * updates: ftp.nara.wide.ad.jp
	  myrepo                                                                       |  951 B     00:00     
	    myrepo/primary                                                               | 9.3 kB     00:00     
	    myrepo                                                                                        28/28
	  Excluding Packages in global exclude list
	  Finished
	  Installed Packages
	  httpd.x86_64                             2.2.3-65.el5.centos.3                             installed
      
--disablerepo=レポジトリidまたはglob
レポジトリidまたはglobで指定したレポジトリを無効化します。
-y
全ての質問に「はい」で答えて処理を行う。
-x パッケージ名, --exclude=パッケージ名
指定したパッケージをアップデート対象から外す。ワイルドカード(* → 0文字以上に任意の文字列、? → 任意の1文字)。設定ファイルに exclude=パッケージ名 の書式で記述して指定することも可能。
【例】kernel関係をアップデート対象から外す
	yum update --exclude=kernel*
      

yumの各設定は/etc/yum.confおよび/etc/yum.repos.d以下の各ファイルに記述される。前者は全体の共通設定を、後者はリポジトリ個別の指定を記述する28。コマンドオプションの指定をこれら設定ファイルに記述することができる。

yumの設定(yum.conf)

# cat /etc/yum.conf

[main]
cachedir=/var/cache/yum キャッシュデータの場所
keepcache=0 0:キャッシュは保持しない 1:キャッシュは保持
debuglevel=2
logfile=/var/log/yum.log
distroverpkg=redhat-release
tolerant=1
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
exclude=パッケージ名 除外対象パッケージの指定

yumコマンドに関するトラブルシューティング

チェックサムエラーでupdateできなくなった

以下のようなチェックサムエラーで更新できなくなった時。

# sudo yum check-update
Loaded plugins: rhnplugin, security
rhel-x86_64-server-5/primary                             | 2.9 MB     00:13     
rhel-x86_64-server-5/primary                             | 2.9 MB     00:08     
Error: failed to retrieve repodata/primary.xml.gz from rhel-x86_64-server-5
error was [Errno -1] Metadata file does not match checksum

yum clean allを実行して、yumキャッシュをクリアするといい。

ファイルやディレクトリの所有権が変わる

yum update時、ファイルの所有権が変わってしまうことが原因で、サービスに影響することがある[29]。対策として、yum update に 加え、所有者変更(chown)の手続きも加えたシェルスクリプトを作成し、それをcronで実行するようにしたらうまくいった。

例:mod_nss (apacheのモジュール)が yum で update され、/etc/httpd/alias/*.db の所有者が root:apache に変更された。apache の設定(/etc/httpd/conf/httpd.conf)で、apache実行ユーザを apache 以外に設定しているとWebサイトへアクセスしても応答が返らなかったりした。以下のようなスクリプトをcronで実行するようにして対処。

【スクリプト例】
#!/bin/sh
#==== 変数定義
#-- 所有者チェック対象ファイル名
NAME="/etc/httpd/alias/cert8.db"
#-- 所有者:所有グループ
OWNER_CURRENT=`ls -l $NAME_CERT8DB | gawk '{printf "%s:",$3}{printf "%s",$4}'`
#-- 所有者:所有グループ
OWNER_ORIG="root:hoge"
#-- yumのログファイル名
YUMLOG="/var/log/yum.log"
#==== yum update
yum -y update >> $YUMLOG 2>&1
#==== 所有者チェック
#-- update後の所有者
echo "The owner of "$NAME" = "$OWNER_CURRENT >> $YUMLOG 2>&1
#-- 変更されていたら
if [ "$OWNER_CURRENT" != "$OWNER_ORIG" ]
then
  #-- 元に戻す
  chown $OWNER_ORIG /etc/httpd/alias/*.db >> $YUMLOG 2>&1
  #-- 戻したことをログに出力
  echo "...Modified! revert to original value for each *.db file ("$OWNER_ORIG")." >> $YUMLOG 2>&1
#-- 変更されていなかったら
else
  #-- 変更されていなかったことをログに出力
  echo "...Original Owner is keeped." >> $YUMLOG 2>&1
fi

古いCentOSのyum updateを行う

CentOS 4で、yum updateを行おうとしても、rpmレポジトリがもはや無効であるといったメッセージがでてしまう。レポジトリ設定/etc/yum.repos.d/CentOS-Base.rpeoの内容を修正すればOKとのこと[30]。なお、レポジトリサイトにはレポジトリ設定ファイルがあった。/etc/yum.repos.d/CentOS-Base.repoをバックアップして、http://vault.centos.org/4.9/CentOS-Base.repoで上書き。

yumコマンドが実行できない(GLib-CRITICAL)

yumコマンドを実行すると次のようなエラーが出る場合。rpmレポジトリからパッケージをダウンロードしてきて、rpmコマンドでインストールしたら解消[31]

# yum list httpd
(前略)
(process:8013): GLib-CRITICAL **: file gtimer.c: line 106 (g_timer_stop): assertion `timer != NULL' failed

(process:8013): GLib-CRITICAL **: file gtimer.c: line 88 (g_timer_destroy): assertion `timer != NULL' failed
Traceback (most recent call last):
  File "/usr/bin/yum", line 29, in ?
    yummain.main(sys.argv[1:])
  File "/usr/share/yum-cli/yummain.py", line 97, in main
    result, resultmsgs = do()
  File "/usr/share/yum-cli/cli.py", line 470, in doCommands
    return self.installPkgs()
  File "/usr/share/yum-cli/cli.py", line 836, in installPkgs
    self.doRepoSetup()
  File "/usr/share/yum-cli/cli.py", line 75, in doRepoSetup
    self.doSackSetup(thisrepo=thisrepo)
  File "__init__.py", line 260, in doSackSetup
  File "repos.py", line 277, in populateSack
  File "/usr/lib/python2.3/site-packages/sqlitecachec.py", line 40, in getPrimary
    self.repoid))
TypeError: Can not create index on requires table: near "NOT": syntax error
# wget -P /usr/src/redhat/RPMS/noarch http://vault.centos.org/4.9/os/i386/CentOS/RPMS/yum-2.4.3-4.el4.centos.noarch.rpm
# wget -P /usr/src/redhat/RPMS/i386 http://vault.centos.org/4.9/os/i386/CentOS/RPMS/sqlite-3.3.6-2.i386.rpm
# wget -P /usr/src/redhat/RPMS/i386 http://vault.centos.org/4.9/os/i386/CentOS/RPMS/python-sqlite-1.1.7-1.2.1.i386.rpm
# wget -P /usr/src/redhat/RPMS/i386 http://vault.centos.org/4.9/os/i386/CentOS/RPMS/python-elementtree-1.2.6-5.el4.centos.i386.rpm
# wget -P /usr/src/redhat/RPMS/noarch http://vault.centos.org/4.9/os/i386/CentOS/RPMS/python-urlgrabber-2.9.8-2.noarch.rpm
# rpm -Uvh /usr/src/redhat/RPMS/noarch/*rpm /usr/src/redhat/RPMS/i386/python-*.rpm /usr/src/redhat/RPMS/i386/sqlite-*.rpm

update/installしようとしてもNothing to doと出て実行されない

yum (local)updateyum (local)installを実行しても、実行対象があるはずなのに「Nothing to do」と出て実行されない場合、yum設定ファイル(/etc/yum.conf)でupdate対象から除外するパッケージリストに記載がないか確認する。

【例】httpd
# yum list httpd
Loaded plugins: rhnplugin, security
Excluding Packages in global exclude list
Finished
Installed Packages
httpd.x86_64                                   2.2.22-1                                    installed
# installはされている
# yum localupdate httpd-2.2.23-1.x86_64.rpm
Loaded plugins: rhnplugin, security
Setting up Local Package Process
Examining httpd-2.2.22-1.x86_64.rpm: httpd-2.2.22-1.x86_64
Nothing to do
# 上位versionにupgradeしようとしているのにupgradeされない
# cat /etc/yum.conf
...
exclude=httpd ... # 除外対象パッケージとして記載されているとupdate/installされない

「警告: rpmts_HdrFromFdno: ヘッダ V3 DSA signature: NOKEY」と表示されinstallができない

レポジトリ設定に記載されたGPGキーファイルが見つからないのが原因。gpgkeyの指定値に誤りがないか確認し、正しいURLまたはパスに修正するか、あるいは指定場所にファイルを配置する。

【例】
# grep ^gpgkey /etc/yum.repos.d/myrepo.repo
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-myrepo
# ls /etc/pki/rpm-gpg/RPM-GPG-KEY-myrepo
ls: /etc/pki/rpm-gpg/RPM-GPG-KEY-myrepo: そのようなファイルやディレクトリはありません
↓指定通りの場所にファイルを配置
/etc/pki/rpm-gpg/RPM-GPG-KEY-myrepo

あるいは事前にGPG鍵をimportしておく。importの方法は公開鍵の取り込み参照。

yumコマンド実行時、UnicodeDecodeErrorが出る

表題のエラーが発生。LANG=Cを実行してやると解消[43]

# yum check-update
Loaded plugins: product-id, rhnplugin, security, subscription-manager
(中略)
Traceback (most recent call last):
  File "/usr/bin/yum", line 29, in ?
    yummain.user_main(sys.argv[1:], exit_code=True)
  File "/usr/share/yum-cli/yummain.py", line 309, in user_main
    errcode = main(args)
  File "/usr/share/yum-cli/yummain.py", line 157, in main
    base.getOptionsConfig(args)
  File "/usr/share/yum-cli/cli.py", line 201, in getOptionsConfig
    (opts, self.cmds) = self.optparser.setupYumConfig(args=args)
  File "/usr/share/yum-cli/cli.py", line 1159, in setupYumConfig
    (opts, cmds) = self.parse_args()
  File "/usr/lib64/python2.4/optparse.py", line 1277, in parse_args
    self.error(err.msg)
  File "/usr/share/yum-cli/cli.py", line 1128, in error
    self.print_usage()
  File "/usr/lib64/python2.4/optparse.py", line 1478, in print_usage
    print >>file, self.get_usage()
  File "/usr/lib64/python2.4/optparse.py", line 1463, in get_usage
    return self.formatter.format_usage(
  File "/usr/lib64/python2.4/optparse.py", line 329, in format_usage
    return _("usage: %s\n") % usage
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
# LANG=C yum check-update

参照先rpmレポジトリの編集

参照先となるRPMレポジトリを追加する手順は以下の通り。

/etc/yum.repos.dにレポジトリ情報ファイルを追加
【書式】
[レポジトリ名]
name = レポジトリの簡単な説明
baseurl = レポジトリのrepodataがある位置を示すURL
enabled = 1→有効、0→無効
gpgcheck = 1→gpg鍵のチェックを行う、0→行わない
gpgkey = gpg鍵ファイルがある位置を示すURL(http://...、file:///...など)
レポジトリのgpg鍵を取り込む
# rpm --import gpg鍵のパスまたはURL

RHELのRedhat Networkレポジトリに関する情報は /etc/yum/pluginconf.d/ 配下にある。

ローカルに独自レポジトリを構築する

ソースから独自にビルドして作ったRPMパッケージを配布するレポジトリを構築する手順を以下に示す。

1. [レポジトリサーバ]createrepoパッケージをinstall
# 既にinstallされているかどうかチェック
# yum list createrepo
Loaded plugins: rhnplugin, security
Excluding Packages in global exclude list
Finished
Installed Packages
createrepo.noarch                               0.4.11-3.el5                               installed
# 上例のようにinstallされていれば次へ、installがまだならinstallする
# yum install createrepo

CentOS 8ではcreaterepo_cというパッケージ名になっている。CentOS 8はyumに相当するコマンドはdnfに変わっている。

# dnf install createrepo_c
2. [レポジトリサーバ]createrepoコマンドでレポジトリデータをつくる

createrepoコマンドでレポジトリメタデータを生成する。

【例】
レポジトリルート:
/var/www/html/myrepo
この配下にアーキテクチャ別サブディレクトリ
/var/www/html/myrepo/i386
/var/www/html/myrepo/x86_64
/var/www/html/myrepo/noarch
がある

[root@reposv ~]# cd /var/www/html/myrepo/x86_64
[root@reposv x86_64]# ls
httpd-2.2.23-1.x86_64.rpm
[root@reposv x86_64]# createrepo .
1/1 - httpd-2.2.23-1.x86_64.rpm
Saving Primary metadata
Saving file lists metadata
Saving other metadata
[root@reposv x86_64]# ls
httpd-2.2.23-1.x86_64.rpm    repodata
[root@reposv x86_64]# ls repodata
filelists.xml.gz  other.xml.gz  primary.xml.gz  repomd.xml

createrepoコマンドの書式については次節参照。

createrepoコマンドを実行すると以下のファイル群がレポジトリディレクトリ配下に生成される(または更新される)。

  • repodata/filelists.xml.gz
  • repodata/other.xml.gz
  • repodata/primary.xml.gz
  • repodata/repomd.xml
3. [レポジトリサーバ]GPG公開鍵をファイルにexport
GPG鍵ペアが未作成の場合はあらかじめ作成しておく→署名の作成
【例】/var/www/html/myrepo/RPM-GPG-KEY-myrepo にexport
[root@reposv ~]# gpg --export -a "Ultra Taro <taro@ultraman.com>" >/var/www/html/myrepo/RPM-GPG-KEY-myrepo
4. [クライアント]参照先レポジトリの設定を追加する

RPMレポジトリの参照先情報(RHEL5、CentOS5の場合、通常/etc/yum.repos.d配下)に、適当な名前でレポジトリ情報ファイルを作成する。

[root@client ~]# cd /etc/yum.repos.d
[root@client yum.repos.d]# ls
CentOS-Base.repo  CentOS-Debuginfo.repo  CentOS-Media.repo  CentOS-Vault.repo
[root@client yum.repos.d]# cat - my.repo
[MyRepository] # レポジトリ名、名前は任意だが空白を含んではいけない
name=My Original Repository # レポジトリの説明。こちらは空白を含んでもよい
gpgcheck=1 # RPMパッケージinstallの際gpg署名チェックを行うかどうか。0ならチェックしない、1ならする
enabled=1 # 設定を有効化するかどうか。0なら無効、1なら有効
gpgkey=http://repo.mydomain.com/myrepo/RPM-GPG-KEY-myrepo # GPG公開鍵がimportされていなかった場合に利用する公開鍵のURLを指定
# file:///home/user/RPM-GPG-KEY-myrepo のようにローカルファイルを指定することもできる

レポジトリサーバのGPG公開鍵をimportしていない場合、gpgkeyを記載しておくとrpmパッケージの署名検証が必要な時、自動的にimportされる。

5. [クライアント]参照先レポジトリの設定を追加する
初回はGPG公開鍵をインポートしていいか確認を求められる。
[root@client ~]# yum update httpd
(中略)
Dependencies Resolved

====================================================================================================
 Package                 Arch           Version                   Repository                   Size
====================================================================================================
Updating:
 http                 x86_64         2.2.23-1                   MyRepository         359 k

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

Total download size: 1.2 M
Is this ok [y/N]: y
Downloading Packages:
(1/1): http-2.2.23-1.x86_64.rpm                                    |  1.2 MB     00:00     
----------------------------------------------------------------------------------------------------
Total                                                                14 MB/s | 1.2 MB     00:00     
警告: rpmts_HdrFromFdno: ヘッダ V3 DSA signature: NOKEY, key ID a1e58e23
MyRepository/gpgkey                                                   | 1.7 kB     00:00     
Importing GPG key 0xA1E58E23 "Ultra Taro <taro@ultraman.com>" from http://repo.mydomain.com/myrepo/RPM-GPG-KEY-myrepo
Is this ok [y/N]: y
Running rpm_check_debug...(後略)

レポジトリ情報生成コマンド(createrepo)

【書式】
createrepo オプション ディレクトリ名
-u URL
--baseurl URL
全ファイルに対するURLの共通前半部分を定義する。
-o ディレクトリ名
--outputdir ディレクトリ名
出力先ディレクトリを定義する(読み取り専用メディアの場合に有用)。
-x パッケージ名
--exclude パッケージ名
除外対象ファイルを指定する。何回でも指定できる。
-i ファイル名
--pkglist ファイル名
レポジトリディレクトリに含めるファイル完全なリストを記したテキストファイルを指定する。 1行に1ファイルを記述する。ワイルドカードは使えない。
-q
--quiet
出力を抑制して実行する。
-g グループファイル名
--groupfile グループファイル名
グループ情報を示すためあらかじめ作成されたxmlファイルの場所を指定する。
-q
--quiet
出力を抑制して実行する。
-v
--verbose
実行する際、より多くの情報を出力する。
-c ディレクトリ名
--cachedir ディレクトリ名
キャッシュを置く場所として使うディレクトリを指定する。このオプションを指定するとレポジトリ内の各パッケージに対するチェックサムのキャッシュが生成される。同一のレポジトリ内のファイルに対して繰り返しcreaterepoを実行する時で、全パッケージが完全に変更された場合でなければ大幅に処理時間を削減できます。
--update
もしレポジトリに関するメタデータが出力先ディレクトリ内に存在し、しかもメタデータが作成された時からrpmファイルが変更されいなかった場合(ファイルサイズと最終修正時刻で判断)、再計算せず既存のメタデータを再利用する。サイズの大きいレポジトリで、rpmの変更が少しであった場合、I/Oや処理時間を大幅に減らすことができる。
-C
--checkts
タイムスタンプが対応するrpmファイルのものより新しかった場合レポジトリに関するメタデータを生成しない。このオプションは修正が加えられていないレポジトリに対してレポジトリ作成指示を実行してしまった時大幅に所要時間を減らしてくれる。但し、現在のところ--splitオプションとは互いに排他。
--split
分割メディアモードで実行する。単一のディレクトリを渡すのではなく、一群のメディアの中にある異なるボリュームに対応したディレクトリ群に渡す。
-p
--pretty
xmlファイルをきれいな書式で出力する。
-V
--version
バージョン情報を表示して終了する。
-h
--help
ヘルプを表示して終了する。
-d
--database
yumコマンドで使用するsqliteデータベースを生成する。

yumレポジトリの同期(reposync)

yumレポジトリをローカルに同期する。createrepoパッケージをインストールしておく必要あり。

reposync オプション
-h, --help
ヘルプを出力して終了する。
-c 設定ファイル, --config=設定ファイル
使用する設定ファイルを指定する(既定値は /etc/yum.conf)。
-a アーキテクチャ, --arch=アーキテクチャ
指定されたアーキテクチャで動作しているものとして処理する(既定値は現在のアーキテクチャ。$releasver の値は上書きしません。)
-r レポジトリID, --repoid=レポジトリID
クエリを実行する対象とするレポジトリのIDを指定する。複数個指定可能。既定値は全てのレポジトリを有効とする。
-p ディレクトリ, --=ディレクトリ
クエリを実行する対象とするレポジトリのIDを指定する。複数個指定可能。既定値は全てのレポジトリを有効とする。

rpmレポジトリの紹介

epel
EPEL/ja - FedoraProject…Fedora プロジェクトで有志によって作成されたRedHat Enterprise Linux(RHEL)向けアドオンパッケージ(Extention Package for Enterprise Linux)。

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

rpm2cpioコマンドでrpmパッケージをcpio形式に変換すれば、cpioコマンドで内包するファイルを取り出すことができる45

【ファイル一覧取得】
$ rpm2cpio php-7.1.7-1.x86_64.rpm | cpio --list
./etc/httpd/conf.d/php.conf
./etc/php.ini
./usr/bin/pear
./usr/bin/pecl
./usr/bin/phar
./usr/bin/phar.phar
./usr/bin/php
./usr/bin/php-cgi
./usr/bin/php-config
./usr/bin/phpdbg
./usr/bin/phpize
./usr/etc/pear.conf
./usr/include/php
...
【ファイル取り出し】
$ rpm2cpio php-7.1.7-1.x86_64.rpm | cpio -id
xxxxx blocks
$ ls -R
CODING_STANDARDS
CONTRIBUTING.md
CREDITS
EXTENSIONS
INSTALL
LICENSE
Makefile.frag
Makefile.gcov
Makefile.global
NEWS
...
カレントディレクトリ直下に展開されるので、既存のファイルと混在してどれが展開したファイルなのか分かりにくくなる場合が考えられる。それを防ぐにはサブディレクトリを作ってその下に展開すればよい。