参考メモ/CentOS7でよく使うrpm, yumコマンドメモ

CentOS7でよく使いそうなrpmやyumコマンドのメモです。

対象環境 :

```
$ cat /etc/centos-release
CentOS Linux release 7.2.1511 (Core)

rpmdevtools-8.3-5.el7.noarch
redhat-rpm-config-9.1.0-68.el7.centos.noarch
rpm-python-4.11.3-17.el7.x86_64
rpm-sign-4.11.3-17.el7.x86_64
rpm-build-libs-4.11.3-17.el7.x86_64
rpm-4.11.3-17.el7.x86_64
perl-srpm-macros-1-8.el7.noarch
rpm-libs-4.11.3-17.el7.x86_64
rpm-build-4.11.3-17.el7.x86_64

yum-metadata-parser-1.1.4-10.el7.x86_64
yum-utils-1.1.31-34.el7.noarch
yum-3.4.3-132.el7.centos.0.1.noarch
yum-cron-3.4.3-132.el7.centos.0.1.noarch
yum-plugin-fastestmirror-1.1.31-34.el7.noarch
yum-plugin-priorities-1.1.31-34.el7.noarch
```

# Red Hat Enterprise Linux 7 からのドキュメント

* RPM
  * https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/ch-RPM.html
* yum
  * https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/ch-yum.html

# RPMパッケージの情報取得系(rpm -q)

よく使うの：

* `-a` : インストール済みパッケージ名とバージョンの一覧表示
* `-f` : ファイル名を指定して、そのファイルをインストールしたパッケージ名を表示
* `-i` : 名前やバージョンなど基本情報
* `-l` : ファイル一覧
* `-R` : 依存パッケージの一覧
* `--scripts` : インストール・アンインストール・アップデート時に実行されるスクリプトを表示
* `--changelog` : パッケージのchangelogを表示
* `-p` (他と組み合わせて) : インストールされたパッケージ名ではなく、RPMファイル名を指定して情報を取得できる。

全部 : `man 8 rpm` の "query options" を参照。

場面別よく使う組み合わせ：

* 「(パッケージ名)はインストールしてたっけ？」
  * `rpm -qa | grep -i (パッケージ名)`
* 「(パッケージ名)の基本情報・ファイル一覧・インストール/アンインストール時のスクリプトを調べたい。」
  * `rpm -qilR --scripts (パッケージ名)`
* 「このファイルはどのパッケージがインストールしたものか？」
  * `rpm -qf /xxx/yyy/zzz` (ファイル一覧ではなくインストール/アンインストールスクリプトで自動生成してる場合はこれでは引っかからない)
* 「このRPMファイルをインストールすると何が起こる？」
  * `rpm -qpilR --scripts (RPMファイル名)`
* 「セキュリティパッチでアップデートがかかったが、何が変更されたのか？」
  * `rpm -q --changelog` (パッケージ名)`
* 「セキュリティパッチでアップデートされたRPMファイルをDLしたが、何が変更されたのか？」
  * `rpm -qp --changelog (RPMファイル名)`

# yumの使い方全般

* `man 8 yum`
* Red Hat Enterprise Linux の Yum コマンドのチートシート - Red Hat Customer Portal
  * https://access.redhat.com/ja/articles/1354533
* ＠IT：yumコマンドでよく利用するコマンド
  * http://www.atmarkit.co.jp/flinux/rensai/linuxtips/611usefllyum.html

Qiitaより:

* yumまとめ - Qiita
  * http://qiita.com/tenbrother/items/96422c7604ecfe990533
* yumコマンド - Qiita
  * http://qiita.com/junsuke/items/e592afe850257cf3f4be

個人的によく使ったり使いそうなコマンド：

* `yum clean all` : キャッシュなどすべて一旦全クリアしたい時に。
* `yum grouplist hidden` : 環境の条件などにより、非表示になるグループもすべて表示する。
  * http://www.atmarkit.co.jp/flinux/rensai/linuxtips/975grouplisthidden.html
* `yum check-update` : アップデート可能なパッケージを表示
* `yum provides (ファイル名)` : まだインストールしてないパッケージについても検索できるので便利。
  * 例えばこれからインストールしたいパッケージの使い方を解説してる記事をみて、「ここで編集してるファイル名、本当にこのパッケージで提供してるファイルかな？」というのを確認するときに使う。
  * あるいは、Tipsレベルで調べ物してる時に、「いきなりこんなファイル名がでてきたけど、これどのパッケージが提供してるんだろう？」というのを確認するときに使う。
  * アスタリスクでのglobマッチも使えるため、コマンド名だけから、どのパッケージで提供しているのか調べられる : `yum provides */dig` など。
* `--enablerepo` / `--disablerepo` : リポジトリをいろいろ追加しすぎた場合に、パッケージ名の衝突を避けたりでこのオプションを使う。

## 古いカーネルを削除

```
$ sudo yum install yum-utils
$ sudo package-cleanup --oldkernels
(確認あり)
```

参考：

* 古いカーネルを削除するには － ＠IT
  * http://www.atmarkit.co.jp/flinux/rensai/linuxtips/801deloldkernel.html
* CentOS/RHELで古いカーネルを削除して/bootを整理する方法 - Qiita
  * http://qiita.com/testnin2/items/2946cc6bc54b0de96221

## 定期的に自動でパッケージ更新したい

```
$ sudo yum install yum-cron
```

※CentOS6 <> 7 とで大幅に設定ファイルの内容が変わったりしてるので、必ず自分が使う環境での設定ファイルの説明を参照すること。

## EPELリポジトリを追加したい

* 公式 : EPEL/ja - FedoraProject
  * https://fedoraproject.org/wiki/EPEL/ja
  * アップデートによりバージョンが変わった時も、ここからたどり直せば大丈夫と思われます。
  * 基本的にはここから、使うCentOSのバージョンとアーキテクチャに対応したRPMファイルをダウンロードして、rpmコマンドでインストールすればEPLリポジトリを追加できます。
* CentOS7だと
  * minimalインストールの状態から、 `yum install epel-release` でインストールできます。(CentOS7のExtraパッケージに存在)

## EPELリポジトリなどをデフォルトで無効化したり、優先度を調整したい

* デフォルトで無効化
  * `/etc/yum.repos.d/epel.repo`, `epel-testing.repo` の、各 `[(セクション名)]` の `enabled=` を `enabled=0` にする。
  * 明示的にEPELを参照したいときは、yumコマンド実行時に `--enablerepo=epel` を指定する。

* 優先度を調整したい
  * `yum install yum-plugin-priorities`
  * `/etc/yum.repos.d/*.repo` の各 `[(セクション名)]` で、優先度調整が必要なセクションについて `priority=整数値` を追加。
  * 数字が小さいほうが優先度が高くなります。

## コマンドラインからリポジトリのenable/disableを設定したい

```
$ sudo yum install yum-utils

例：/etc/yum.repos.d/epel.repo の [epel]セクションを有効化
$ sudo yum-config-manager --enable epel

例：/etc/yum.repos.d/epel.repo の [epel]セクションを無効化
$ sudo yum-config-manager --disable epel
```

## 有効な/無効なリポジトリの一覧を確認したい

```
$ sudo yum repolist enabled
$ sudo yum repolist disabled
```

## RPMのダウンロードだけしたい

```
$ sudo yum install yum-utils

例 : kernelパッケージのRPMをカレントディレクトリにDL
$ yumdownloader kernel
```

詳しくは `man 1 yumdownloader` 参照。

* `--destdir` : ダウンロード先ディレクトリを指定できる。省略時のデフォルトはカレントディレクトリ
* `--resolve` : 依存関係で必要なパッケージについてもDL
* `--archlist=ARCH1[,ARCH2...]` : アーキテクチャを指定可能
* CentOS5/6では、`yum-downloadonly` というパッケージをインストールすることで、「インストールせずにダウンロードだけ」できた。
  * CentOS5/6 のyum-utilsのyumdownloaderは「インストール済みパッケージをダウンロード」用だったらしい。
  * 参考 : https://access.redhat.com/ja/node/395763
* CentOS7では、インストールした/していない に関わらず、yum-utilsのyumdownloaderだけでダウンロードが可能になってる。
  * 逆に `yum-downloadonly` パッケージが無くなったっぽい。

※パッケージのダウンロードであれば `yum install --downloadonly --downloaddir=xxxx (パッケージ名)` でもできるが、yum操作のトランザクションに影響を与えます。そのため、より副作用が少なく直感的に扱える、yum-utilsのyumdownloaderの方を紹介してます。

## SRPMをダウンロードして中身を確認したい

```
$ sudo yum install yum-utils

例 : kernelパッケージのSRPMをカレントディレクトリにDL
$ yumdownloader kernel --source
```

* 昔のスタイル : SRPMをインストールする前に、初回だけ以下の設定作業が必要です。これをしておかないと、SRPMがどこにインストールされたのか、ソースはどこか、どこでビルドされたのか、というのが追いづらくなり、最悪、システムに破壊的な影響を与えてしまい、泣きます。
  1. `$ sudo yum install rpm-build`
  1. 作業ディレクトリの作成: `$ mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}` (好きなところでOK)
  1. `$ echo "%_topdir $HOME/rpmbuild" > ~/.rpmmacros`
  1. `$ rpmbuild --showrc | grep topdir` で設定が有効なの確認
  1. `$ rpm -i xxxx.src.rpm`
  1. (もしかしたら cpio コマンドで展開すれば↓のrpmdev-extractと同じだったかも・・・)
* モダンスタイル : `rpmdevtools` が提供している `rpmdev-extract` で展開すればOKです。SRPMのインストールが無くて純粋に展開してるだけなので、副作用が無くて安心です。
  1. `$ sudo yum install rpm-build`
  1. `$ sudo yum install rpmdevtools`
  1. `$ rpmdev-extract xxxx.src.rpm`
     * tarと同じ感じで現在ディレクトリにディレクトリ作成されてその中に展開されます。

## SRPMのビルドも試してみたい場合

1. `$ rpmdev-setuptree`
  * HOMEディレクトリの下に `rpmbuild/{BUILD|BUILDROOT|RPMS|SOURCES|SPEC|SPECS|SRPMS}` ディレクトリを作成します。
  * `~/.rpmmacros` を調整します。
  * 詳細な処理は `/usr/bin/rpmdev-setuptree` を確認（シェルスクリプトです）。
1. `$ rpmbuild --recompile xxxx.src.rpm`
  * `rpmdev-setuptree` を実行済みのユーザであれば、どこのディレクトリからでも実行可能です。
  * `$HOME/rpmbuild` の下に、ソースとspecファイルを展開し、コンパイルします。この後、`$ rpmbuild -ba rpmbuild/SPECS/xxx.spec` などでパッケージのビルド作業をを進められます。

SRPMの展開やビルドは、いろいろなバリエーションがありますので、以下の記事も参考にしてみてください。rpmdevtoolsが無かった時は結構泥臭い作業が必要でした。

- SRPMの扱い方法メモ - Qiita
  - http://qiita.com/makisyu/items/0aecd4565fc119424ee0
- SRPMからソースを取り出す方法 - shohu33's diary
  - http://shohu.hatenablog.com/entry/20080103/1199351846
- Re: How do I change the SRPM install path ?
  - https://www.redhat.com/archives/rpm-list/2002-November/msg00021.html
- rpmbuild環境の構築 - Qiita
  - http://qiita.com/IK12_info/items/bcf695460363bae87eb9
- いまさら聞けないrpmbuildことはじめ - hack in 3 minutes
  - https://blog.tnmt.info/2011/04/29/rpmbuild-for-beginner/
- CentOS7.1 64bit rpmbuildコマンドによるRPMの作成 | kakiro-web カキローウェブ
  - http://www.kakiro-web.com/linux/rpmbuild.html