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
--force
--replacepkgs, --replacefiles, --oldpackage
を組み合わせたものと同じ。状況に関わらず強制的にインストールする。
-h, --hash
--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 ディレクトリ名
ステージ
オプション | 実行ステージ | パッケージ作成 | 備考 | |||
---|---|---|---|---|---|---|
%prep (準備) |
%build (コンパイル) |
%install (インストール) |
.rpm (バイナリ) |
.src.rpm (ソース) |
||
-a |
○ | ○ | ○ | ○ | ○ | |
-b |
○ | ○ | ○ | ○ | − | |
-s |
○ | ○ | ○ | − | ○ | |
-p |
○ | − | − | − | − | 通常、ソースを展開しこの後にパッチを適用するのに用いる。 |
-c |
○ | ○ | − | − | − | %prep (準備)と%build (コンパイル)を実行する。 |
-i |
○ | ○ | ○ | − | − | %prep, %build (準備とコンパイル)を実行した後に行う。 |
-l |
− | − | − | − | − | %files に記された各ファイルが存在することをチェックする。 |
オプション(作成)
--buildroot ディレクトリ
--clean
--nobuild
--rmsource
--rmspec
--short-circuit
-bc, bi, -tc, -ti
でのみ使用可能。
--sign
--target プラットフォーム
%_target, %_target_arch, %_target_os
を設定する。
書式3のモード
--recompile
/usr/src/redhat/SOURCES
" 以下に、specファイルが "/usr/src/redhat/SPECS
" 以下にインストールされる。
rpm -i
または rpm -U
を実行するのと似ているが、rpmbuild --recompile
の場合は、RPMデータベースがアップデートされない。そのため、その後rpm
でパッケージのアップデートやパッケージの検証を行った場合問題が生じうる。
--rebuild
--recompile
オプションを指定した時の処理の後、以下の2つの処理が行われる。
【例】ソース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
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}
元のファイルと修正後のファイルを作って、-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の設定で回避は可能)。
%_signature gpg %_gpg_path /home/user/.gnupg ←これと同一ディレクトリにいるなら無くてもよい %_gpg_name Gpg User (foo) <user@hoge.com> ←前項のGPG鍵作成時に指定した内容 %_gpgbin /usr/bin/gpg ←パスが通っていれば(=which gpg でパスが表示されれば)不要
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'
gpg -a --export GPG鍵に設定されたメールアドレス > 公開鍵ファイル名 【例】カレントディレクトリに"public.key"というファイル名で公開鍵ファイルを作成する [user@server ~]$ gpg -a --export user@hoge.com > public.key
sudo rpm --import 公開鍵ファイル名 【例】 [user@server ~]$ sudo rpm --import public.key
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]。
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
【書式】 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 ...
【書式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 ディレクトリ名
選択オプション
パッケージ名
-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
[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
(Yellowdog Updater Modifed)はrpmを使ってシステムを維持するのに利用できる対話的、自動アップデートプログラム。
【書式】 yum オプション コマンド パッケージ名
コマンド
install パッケージ名1 パッケージ名2 ...
localinstall パッケージ名1 パッケージ名2 ...
/etc/yum.conf
)中の「gpgcheck=1
」を「gpgcheck=0
」に変更すれば署名チェックは行われなくなる(参照:How to install a not signed rpm with yum? [Archive] - FedoraForum.org)。
update パッケージ名1 パッケージ名2 ...
--obsoletes
を指定すると、廃止されたカタログも対象となる。
localupdate パッケージ名1 パッケージ名2 ...
check-update
upgrade パッケージ名1 パッケージ名2 ...
update --obsoletes
と同じ。
remove パッケージ名1 パッケージ名2 ...
erase パッケージ名1 パッケージ名2 ...
remove
と同じ。
list パッケージ名...
info パッケージ名...
repolist all | enabled | disables
resolvedep パッケージ名
clean 対象
指定値 | 内容 |
---|---|
expire-cache |
|
packages |
ダウンロードしシステム内に保存されたパッケージデータを消去する。パッケージはダウンロード・インストールが完了しても自動的には削除されないことに注意。 |
headers |
依存性解決の際使われたヘッダ情報を全て消去する。 |
metadata |
リモートリポジトリで利用可能なパッケージを決定するのに用いたメタデータのキャッシュファイルを削除する。このオプションを使うと、次回yumを実行した時、全てのメタデータを強制的にダウンロードし直すことになります。 |
dbcache |
メタデータに高速でアクセスするために作られるsqliteキャッシュを消去します。このオプションを使うと、次回yumを実行した時、全てのメタデータを強制的にダウンロードしてデータベースを再構築することになります。 |
all |
yum clean packages 、yum clean packages 、yum clean packages 、yum clean packages の4つを実行するのと同じです。
|
オプション
-h, --help
-v, --verbose
--version
--enablerepo=レポジトリidまたはglob
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
-y
-x パッケージ名, --exclude=パッケージ名
exclude=パッケージ名
の書式で記述して指定することも可能。
【例】kernel関係をアップデート対象から外す yum update --exclude=kernel*
yum
の各設定は/etc/yum.conf
および/etc/yum.repos.d
以下の各ファイルに記述される。前者は全体の共通設定を、後者はリポジトリ個別の指定を記述する28。コマンドオプションの指定をこれら設定ファイルに記述することができる。
# 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=パッケージ名 除外対象パッケージの指定
以下のようなチェックサムエラーで更新できなくなった時。
# 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 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コマンドを実行すると次のようなエラーが出る場合。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
yum (local)update
やyum (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されない
レポジトリ設定に記載された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の方法は公開鍵の取り込み参照。
表題のエラーが発生。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レポジトリを追加する手順は以下の通り。
/etc/yum.repos.d
にレポジトリ情報ファイルを追加【書式】 [レポジトリ名] name = レポジトリの簡単な説明 baseurl = レポジトリのrepodataがある位置を示すURL enabled = 1→有効、0→無効 gpgcheck = 1→gpg鍵のチェックを行う、0→行わない gpgkey = gpg鍵ファイルがある位置を示すURL(http://...、file:///...など)
# rpm --import gpg鍵のパスまたはURL
RHELのRedhat Networkレポジトリに関する情報は /etc/yum/pluginconf.d/
配下にある。
ソースから独自にビルドして作ったRPMパッケージを配布するレポジトリを構築する手順を以下に示す。
# 既に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
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
【例】/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
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される。
[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 オプション ディレクトリ名
-u URL
--baseurl URL
-o ディレクトリ名
--outputdir ディレクトリ名
-x パッケージ名
--exclude パッケージ名
-i ファイル名
--pkglist ファイル名
-q
--quiet
-g グループファイル名
--groupfile グループファイル名
-q
--quiet
-v
--verbose
-c ディレクトリ名
--cachedir ディレクトリ名
--update
-C
--checkts
--split
オプションとは互いに排他。
--split
-p
--pretty
-V
--version
-h
--help
-d
--database
yumレポジトリをローカルに同期する。createrepoパッケージをインストールしておく必要あり。
reposync オプション
-h, --help
-c 設定ファイル, --config=設定ファイル
/etc/yum.conf
)。-a アーキテクチャ, --arch=アーキテクチャ
-r レポジトリID, --repoid=レポジトリID
-p ディレクトリ, --=ディレクトリ
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 ... カレントディレクトリ直下に展開されるので、既存のファイルと混在してどれが展開したファイルなのか分かりにくくなる場合が考えられる。それを防ぐにはサブディレクトリを作ってその下に展開すればよい。
man rpmbuild
)