Linux yum を基礎から理解する

普段なんとなく yum を使っていませんか?私はそうです。

ということで、 yum を基礎からおさらいしました。

検証環境

CentOS 8 を利用する。

]# cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
]# uname -a
Linux localhost.localdomain 4.18.0-80.el8.x86_64 #1 SMP Tue Jun 4 09:19:46 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

yum の概要

  • yum はパッケージを管理するソフトウェア。
  • 一般的にはインターネット越しでリポジトリにアクセスし、必要な rpm パッケージをダウンロードする。このとき rpm 間の依存関係は自動で解決してくれる。
  • CentOS 8 では バックエンドに dnf が使われる。yum と dnf の違いは 6.1. YUM スタックへの主な変更 を参照してください。ユーザ視点では yum の CLI インタフェースが提供されるので、あまり気にせずに済む。
  • インストールしたパッケージ は RPM データベースが管理する。

f:id:kimulla:20200119083403p:plain

パッケージ

パッケージの実体は rpm ファイル。 rpm ファイルには、メタデータ・インストール手順・インストールするファイル などが格納されている。rpm パッケージの具体的な構造は、次のサイトが参考になった。
参考 Maximum RPM: Taking the RPM Package Manager to the Limit

次のコマンドで、 rpm の中身を確認する。

// rpm パッケージだけをダウンロードする
]# yumdownloader postgresql-server
メタデータの期限切れの最終確認: 0:23:16 時間前の 2020年01月18日 22時17分29秒 に実施しました。
postgresql-server-10.6-1.module_el8.0.0+15+f57f353b.x86_64.rpm

// インストール時に実行されるコマンド
]# rpm -q --scripts postgresql-server-10.6-1.module_el8.0.0+15+f57f353b.x86_64.rpm
preinstall scriptlet (using /bin/sh):
/usr/sbin/groupadd -g 26 -o -r postgres >/dev/null 2>&1 || :
/usr/sbin/useradd -M -N -g postgres -o -r -d /var/lib/pgsql -s /bin/bash \
        -c "PostgreSQL Server" -u 26 postgres >/dev/null 2>&1 || :
postinstall scriptlet (using /bin/sh):

if [ $1 -eq 1 ] ; then
        # Initial installation
        systemctl --no-reload preset postgresql.service &>/dev/null || :
fi
preuninstall scriptlet (using /bin/sh):

if [ $1 -eq 0 ] ; then
        # Package removal, not upgrade
        systemctl --no-reload disable --now postgresql.service &>/dev/null || :
fi
postuninstall scriptlet (using /bin/sh):

if [ $1 -ge 1 ] ; then
        # Package upgrade, not uninstall
        systemctl try-restart postgresql.service &>/dev/null || :
fi

// 依存関係(ファイル名はわかるけど、どのパッケージかはわからない)
]# ]# rpm -qRp postgresql-server-10.6-1.module_el8.0.0+15+f57f353b.x86_64.rpm
/bin/bash
/bin/sh
/bin/sh
/bin/sh
/bin/sh
/bin/sh
/usr/sbin/useradd
config(postgresql-server) = 10.6-1.module_el8.0.0+15+f57f353b
libc.so.6()(64bit)
libc.so.6(GLIBC_2.11)(64bit)
libc.so.6(GLIBC_2.14)(64bit)
libc.so.6(GLIBC_2.15)(64bit)
...

// インストールされるファイル
]# rpm2cpio postgresql-server-10.6-1.module_el8.0.0+15+f57f353b.x86_64.rpm | cpio -t
./etc/pam.d/postgresql
./etc/postgresql-setup
./etc/postgresql-setup/upgrade
./etc/postgresql-setup/upgrade/postgresql.conf
./usr/bin/initdb
./usr/bin/pg_basebackup
./usr/bin/pg_controldata
./usr/bin/pg_ctl
./usr/bin/pg_receivewal
./usr/bin/pg_recvlogical
./usr/bin/pg_resetwal
./usr/bin/pg_rewind
./usr/bin/postgres
./usr/bin/postgresql-setup
...

ということで、パッケージの実体は yum ではなく rpm だとわかる。ただし rpm はパッケージ間の依存関係がわからないので、これを yum が解決する。

プロキシ

前述の通り、 yum リポジトリにはネットワーク越しにアクセスする。そのため、プロキシ環境では設定が必要。環境変数(http_proxy)を参照してくれないので /etc/dnf/dnf.conf に記述する。

[main]
...
proxy=http://hostname:port/

リポジトリ

参照先のリポジトリは /etc/yum.repos.d/ に記載されている。

]# ls /etc/yum.repos.d/
CentOS-AppStream.repo  CentOS-CR.repo         CentOS-Extras.repo  CentOS-PowerTools.repo  CentOS-Vault.repo       CentOS-fasttrack.repo  epel-testing.repo
CentOS-Base.repo       CentOS-Debuginfo.repo  CentOS-Media.repo   CentOS-Sources.repo     CentOS-centosplus.repo  epel-playground.repo   epel.repo

.repo ファイルは次のようになっている。

]# cat /etc/yum.repos.d/CentOS-AppStream.repo
...
[AppStream]
# リポジトリ名
name=CentOS-$releasever - AppStream
# ミラーサーバのリスト。このリストから良い感じに近いところが選ばれる。
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=AppStream&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/AppStream/$basearch/os/
# GPG の検証を有効にする(ダウンロード先が正しい場所かの確認)
gpgcheck=1
# yum リポジトリを有効にする
enabled=1
# GPG のキー情報
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

$で始まるのは変数。次のコマンドで中身を確認できる。

]# python3 -c 'import dnf, pprint; db = dnf.dnf.Base(); pprint.pprint(db.conf.substitutions,width=1)'
{'arch': 'x86_64',
 'basearch': 'x86_64',
 'releasever': '8'}

// /etc/yum/vars にも変数定義がある
]# cat /etc/yum/vars/infra
stock

yum repoinfo を使えば、一発でリポジトリの URL を確認できる。

]# yum repoinfo
メタデータの期限切れの最終確認: 0:11:45 時間前の 2020年01月17日 10時43分52秒 に実施しました。

Repo-id      : AppStream
Repo-name    : CentOS-8 - AppStream
Repo-revision: 1579219754
Repo-updated : 2020年01月16日 19時09分14秒
Repo-pkgs    : 4,933
Repo-size    : 6.4 G
Repo-mirrors : http://mirrorlist.centos.org/?release=8&arch=x86_64&repo=AppStream&infra=stock
Repo-baseurl : http://ftp-srv2.kddilabs.jp/Linux/packages/CentOS/8.1.1911/AppStream/x86_64/os/ (9 more)
Repo-expire  : 172,800 秒 (最終: 2020年01月17日 10時43分46秒)
Repo-filename: /etc/yum.repos.d/CentOS-AppStream.repo
...

リポジトリの URL を見るとわかるが、 CentOS のリポジトリではマイナーバージョンの違いを意識していない(mirror が release=8)。つまり使い始めたときのバージョンが古くても、パッケージを更新しまくれば最新のマイナーバージョンに近づく。

// CentOS 8.0 を使っている
]# cat /etc/redhat-release
CentOS Linux release 8.0.1905 (Core)

// 全てのパッケージをアップデートする
]# yum update -y
...

// CentOS 8.1 にアップデートされている
]# cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)

マイナーバージョンを固定したい場合は、先述の .repo ファイルで baseurl を指定する。ただし CentOS のオフィシャルリポジトリは古いマイナーバージョンのパッケージをサポートしないため、過去のスナップショット(CentOS 過去リポジトリのスナップショット)を指定することになる。このリポジトリはセキュリティパッチが提供されないので、利用は推奨されていない。基本的には、定期的なアップデートが望ましいと思う。

なお、 yum リポジトリはオフィシャルリポジトリ以外にもさまざま提供されている。 CentOS のオフィシャルリポジトリは提供されているミドルウェアバージョンがだいたい古いので、 最新版のミドルウェアをインストールしたいときに追加することがある。 野良パッケージはセキュリティ的にあやしい点は注意が必要。最近は、検証目的だったらコンテナ使えば済むことも多い。

.repo ファイルは手でも追加できるが、一部のリポジトリは yum で追加できる。

// 例. epel を追加する
]# yum install -y epel-release
...
インストール済み:
  epel-release-8-5.el8.noarch

完了しました!

// 追加されたリポジトリを確認する
]# yum repolist  epel
メタデータの期限切れの最終確認: 0:26:49 時間前の 2020年01月17日 10時43分52秒 に実施しました。
repo id                                                 repo の名前                                                                                     状態
*epel                                                   Extra Packages for Enterprise Linux 8 - x86_64                                                  4,401


// 例. postgresql のリポジトリを追加する
]# yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm

// 追加されたリポジトリを確認する
]# yum repolist 'pgd*'
メタデータの期限切れの最終確認: 0:01:15 時間前の 2020年01月17日 11時13分37秒 に実施しました。
repo id                                                     repo の名前                                                                                    状態
pgdg10                                                      PostgreSQL 10 for RHEL/CentOS 8 - x86_64                                                       676
pgdg11                                                      PostgreSQL 11 for RHEL/CentOS 8 - x86_64                                                       711

dnf の内部の動きを軽く調べる

dnf が RPM データベースや yum リポジトリのキャッシュを操作するときは hawkey や libdnf が使われているっぽい。これで python からパッケージに関する操作ができるので軽く試してみた。

# RPM データベースの読み込み
>>> import hawkey
>>> sack = hawkey.Sack()
>>> sack.load_system_repo()

# このファイルが含まれる パッケージ を探す
>>> subject = hawkey.Subject("/sbin/ldconfig")
>>> query = subject.get_best_query(sack)
>>> query.run()
[<hawkey.Package object id 160, glibc-2.28-72.el8.x86_64, @System>]
# yum リポジトリキャッシュ の読み込み
# hawkey.Repo は ddeprecate らしいけど、とりあえず hawkey で試す
>>> repo = hawkey.Repo("AppStream")
/usr/lib64/python3.6/site-packages/hawkey/__init__.py:345: DeprecationWarning: The class hawkey.Repo is deprecated. Please use dnf.repo.Repo instead. The class will be removed on 2019-12-31.
  warnings.warn(msg, DeprecationWarning)
>>> repo.repomd_fn = "/var/cache/dnf/AppStream-a520ed22b0a8a736/repodata/repomd.xml"
>>> repo.primary_fn = "/var/cache/dnf/AppStream-a520ed22b0a8a736/repodata/cd0620b70e0fea590c1a2f8d76011fccb24fc268efa121e670a9ae809661147d-primary.xml.gz"
>>> repo.filelists_fn = "/var/cache/dnf/AppStream-a520ed22b0a8a736/repodata/25f52a6969043ad2e69b4aaeac995e6fb999545c363d573b498f72d2784b63d9-filelists.xml.gz"
>>> sack = hawkey.Sack()
>>> sack.load_repo(repo, load_filelists=True)

# インストールされてない依存ファイルを検索する
>>> subject = hawkey.Subject("/var/log/httpd")
>>> query = subject.get_best_query(sack)
>>> query.run()
[<hawkey.Package object id 1323, httpd-2.4.37-16.module_el8.1.0+256+ae790463.x86_64, AppStream>]

実際の dnf では /usr/lib/python3.6/site-packages/dnf/sack.py/usr/lib/python3.6/site-packages/dnf/package.py で hawkey のクラスを継承して利用しているっぽい。

操作コマンド

リポジトリ系

すべてのリポジトリが常に利用されるわけではない。(有効は enabled=1 )

有効なリポジトリの一覧は yum repolist で表示できる。

]# yum repolist
メタデータの期限切れの最終確認: 1:29:01 時間前の 2020年01月17日 06時20分37秒 に実施しました。
repo id                                                   repo の名前                                                                                   状態
AppStream                                                 CentOS-8 - AppStream                                                                          4,933
BaseOS                                                    CentOS-8 - Base                                                                               1,784
PowerTools                                                CentOS-8 - PowerTools                                                                         1,462
*epel                                                     Extra Packages for Enterprise Linux 8 - x86_64                                                4,401
extras                                                    CentOS-8 - Extras

リポジトリにアクセスすると、リポジトリの情報などは /var/cache/dnf/ にキャッシュされる。

]# ls /var/cache/dnf/
AppStream-a520ed22b0a8a736         PowerTools-filenames.solvx        cr-039a6a50a93fd9f5                         epel.solv
AppStream-filenames.solvx          PowerTools.solv                   epel-6519ee669354a484                       expired_repos.json
AppStream-source-d916d81a182f85b8  base-debuginfo-08a542605d8eb5c1   epel-debuginfo-959fe314f3484166             extras-2770d521ba03e231
AppStream.solv                     base-debuginfo-5345089e85c6a348   epel-filenames.solvx                        extras-filenames.solvx
BaseOS-929b586ef1f72f69            base-debuginfo-5980dc1967f83779   epel-playground-debuginfo-e325992085d3d403  extras-source-e5a50b143fd03d3a
BaseOS-filenames.solvx             base-debuginfo-d0bcd5150a07fdca   epel-presto.solvx                           extras.solv
BaseOS-source-c81876907597427a     bpftools-46d7d628f821a1b2         epel-source-8d551035510941c5                last_makecache
BaseOS.solv                        c8-media-BaseOS-457410b384608a54  epel-testing-debuginfo-cdd88e3082e30ebe     packages.db
PowerTools-25a6a2b331e53e98        centosplus-7c2fb1944c8ef543       epel-updateinfo.solvx                       tempfiles.json

// 主に repodata(パッケージのメタ情報) がキャッシュされる
]# ls /var/cache/dnf/AppStream-a520ed22b0a8a736/
mirrorlist  packages  repodata

// キャッシュ元は baseurl(今回だと http://ftp-srv2.kddilabs.jp/Linux/packages/CentOS/8.1.1911/AppStream/x86_64/os/repodata/)
]# ls repodata/
025600546e8cc2f3e6981c1ad506349c3f651bdf0dfd2ee2526f835b9f39b39d-comps-AppStream.x86_64.xml.xz
25f52a6969043ad2e69b4aaeac995e6fb999545c363d573b498f72d2784b63d9-filelists.xml.gz
5e56e0e0a2d21f525ee7169def6f7b7fb7e4f1b69b0c98ba537269c8d928135a-modules.yaml.gz
cd0620b70e0fea590c1a2f8d76011fccb24fc268efa121e670a9ae809661147d-primary.xml.gz
repomd.xml

// repomd.xml に定義が書いてある
]# cat repodata/repomd.xml
<?xml version="1.0" encoding="UTF-8"?>
<repomd xmlns="http://linux.duke.edu/metadata/repo" xmlns:rpm="http://linux.duke.edu/metadata/rpm">
  <revision>1579219754</revision>
  <data type="primary">
    <checksum type="sha256">cd0620b70e0fea590c1a2f8d76011fccb24fc268efa121e670a9ae809661147d</checksum>
    <open-checksum type="sha256">da301599fd5e9dedfa1f6b8d4a8ea57d57f41cbc8b7b0cc62dcdf6e281852fd4</open-checksum>
    <location href="repodata/cd0620b70e0fea590c1a2f8d76011fccb24fc268efa121e670a9ae809661147d-primary.xml.gz"/>
    <timestamp>1579219748</timestamp>
    <size>1517855</size>
    <open-size>15027575</open-size>
  </data>
...


// 解凍して中身を見ると、パッケージのメタ情報が保存されていることがわかる
// ちなみにこのファイルは dnf で作成するのではなく、単にリポジトリのキャッシュっぽいです(1h くらいソースコード上を探したのにな…)
]# gunzip repodata/cd0620b70e0fea590c1a2f8d76011fccb24fc268efa121e670a9ae809661147d-primary.xml.gz
]# cat repodata/cd0620b70e0fea590c1a2f8d76011fccb24fc268efa121e670a9ae809661147d-primary.xml
...
<package type="rpm">
  <name>jq</name>
  <arch>i686</arch>
  <version epoch="0" ver="1.5" rel="12.el8"/>
  <checksum type="sha256" pkgid="YES">c23fdc38ad49b2fac5ebcc6adea08531252984a477b8b56c28f4b3d7cb0450ca</checksum>
  <summary>Command-line JSON processor</summary>
  <description>lightweight and flexible command-line JSON processor

 jq is like sed for JSON data ?  you can use it to slice
 <省略>
 </description>
  <packager>CentOS Buildsys &lt;bugs@centos.org&gt;</packager>
  <url>http://stedolan.github.io/jq/</url>
  <time file="1562074382" build="1557872905"/>
  <size package="194644" installed="480925" archive="482972"/>
  <location href="Packages/jq-1.5-12.el8.i686.rpm"/>
  <format>
    <rpm:license>MIT and ASL 2.0 and CC-BY and GPLv3</rpm:license>
    <rpm:vendor>CentOS</rpm:vendor>
    <rpm:group>Unspecified</rpm:group>
    <rpm:buildhost>x86-01.mbox.centos.org</rpm:buildhost>
    <rpm:sourcerpm>jq-1.5-12.el8.src.rpm</rpm:sourcerpm>
    <rpm:header-range start="5608" end="12516"/>
    // 提供されるファイル一覧 (yum provides で検索する対象)
    <rpm:provides>
      <rpm:entry name="jq" flags="EQ" epoch="0" ver="1.5" rel="12.el8"/>
      <rpm:entry name="jq(x86-32)" flags="EQ" epoch="0" ver="1.5" rel="12.el8"/>
      <rpm:entry name="libjq.so.1"/>
    </rpm:provides>
    // 依存関係(yum deplist で検索する対象)
    <rpm:requires>
      <rpm:entry name="ld-linux.so.2"/>
      <rpm:entry name="ld-linux.so.2(GLIBC_2.3)"/>
      <rpm:entry name="libm.so.6"/>
      <rpm:entry name="libm.so.6(GLIBC_2.0)"/>
      <rpm:entry name="libm.so.6(GLIBC_2.1)"/>
      <rpm:entry name="libonig.so.5"/>
      <rpm:entry name="rtld(GNU_HASH)"/>
      <rpm:entry name="libc.so.6(GLIBC_2.4)"/>
    </rpm:requires>
    <file>/usr/bin/jq</file>
  </format>
</package>
...

そのため、ネットワークがつながらない状態でも一部のコマンドは実行できる。(yum リポジトリのキャッシュで済む場合 や rpm データベースで済む場合)

// ネットワークを切断した状態で次の操作を行う
]# yum search java
メタデータの期限切れの最終確認: 0:14:03 時間前の 2020年01月17日 08時29分24秒 に実施しました。
================================================================== 名前 & 概要 一致: java ===================================================================
java-hdf.x86_64 : HDF4 java library
java-hdf5.x86_64 : HDF5 java library
jargs-javadoc.noarch : Javadoc for jargs
java-atk-wrapper.x86_64 : Java ATK Wrapper
tzdata-java.noarch : Timezone data for Java
...

]#  yum list installed
インストール済みパッケージ
NetworkManager.x86_64                 1:1.20.0-3.el8                                    @BaseOS
NetworkManager-config-server.noarch   1:1.20.0-3.el8                                    @BaseOS
NetworkManager-libnm.x86_64           1:1.20.0-3.el8                                    @BaseOS
NetworkManager-team.x86_64            1:1.20.0-3.el8                                    @BaseOS
...

しかしパッケージのインストールは失敗する。

// ネットワークを切断した状態で次の操作を行う

]# yum install java
メタデータの期限切れの最終確認: 0:15:50 時間前の 2020年01月17日 08時29分24秒 に実施しました。
パッケージ java-1.8.0-openjdk-1:1.8.0.232.b09-0.el8_0.x86_64 は既にインストールされています。
依存関係が解決しました。
=============================================================================================================================================================
 パッケージ                                      アーキテクチャー           バージョン                                   リポジトリー                  サイズ
=============================================================================================================================================================
アップグレード:
 java-1.8.0-openjdk                              x86_64                     1:1.8.0.232.b09-2.el8_1                      AppStream                     317 k
 java-1.8.0-openjdk-devel                        x86_64                     1:1.8.0.232.b09-2.el8_1                      AppStream                     9.8 M
 java-1.8.0-openjdk-headless                     x86_64                     1:1.8.0.232.b09-2.el8_1                      AppStream                      33 M

トランザクションの概要
=============================================================================================================================================================
アップグレード  3 パッケージ

ダウンロードサイズの合計: 43 M
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
                                                                [===                                                       ] ---  B/s |   0  B     --:-- ETA
ダウンロード済みのパッケージは、次の正常なトランザクションまでキャッシュに保存されました。
'dnf clean packages' を実行することでキャッシュパッケージを削除できます。
エラー: パッケージのダウンロード中にエラーが発生しました:
  Curl error (7): Couldn't connect to server for http://mirrorlist.centos.org/?release=8&arch=x86_64&repo=AppStream&infra=stock [Failed to connect to localhost port 8080: 接続を拒否されました]

なんらかの操作が失敗したときにその結果がキャッシュされてしまい、修正しても直らない場合がある。yum clean を使うとキャッシュを削除でき、この問題を解消できる。

]# yum clean all
38 ファイルが削除されました

検索系

だいたいのパッケージ名がわかっていれば yum search を使う。

]# yum search openjdk
メタデータの期限切れの最終確認: 0:27:07 時間前の 2020年01月17日 06時20分37秒 に実施しました。
================================================================= 概要 & 名前 一致: openjdk =================================================================
java-11-openjdk-demo.x86_64 : OpenJDK Demos 11
java-1.8.0-openjdk-demo.x86_64 : OpenJDK Demos 8
java-latest-openjdk-demo.x86_64 : OpenJDK Demos 13
java-11-openjdk-jmods.x86_64 : JMods for OpenJDK 11
java-11-openjdk-src.x86_64 : OpenJDK Source Bundle 11
java-1.8.0-openjdk-src.x86_64 : OpenJDK Source Bundle 8
java-11-openjdk.x86_64 : OpenJDK Runtime Environment 11
java-latest-openjdk-jmods.x86_64 : JMods for OpenJDK 13
...

コマンド名しかわからなければ、yum provides を使う。 口頭で教えてもらった手順を試そうとしたときに「コマンド入ってないぞ…今さら聞きづらい…」ってときに使う。

]# yum provides psql
メタデータの期限切れの最終確認: 0:19:25 時間前の 2020年01月17日 06時20分37秒 に実施しました。
postgresql-10.6-1.module_el8.0.0+15+f57f353b.x86_64 : PostgreSQL client programs
Repo        : AppStream
一致:
ファイル名    : /usr/bin/psql

依存パッケージを調べたいときは yum deplist を使う。 こういうのを見ると 「頑張ってくれてるんだな…」と思う。

]# yum deplist postgresql
メタデータの期限切れの最終確認: 0:09:26 時間前の 2020年01月17日 10時43分52秒 に実施しました。
package: postgresql-10.6-1.module_el8.0.0+15+f57f353b.x86_64
  dependency: libc.so.6(GLIBC_2.15)(64bit)
   provider: glibc-2.28-72.el8.x86_64
  dependency: libm.so.6()(64bit)
   provider: glibc-2.28-72.el8.x86_64
  dependency: libm.so.6(GLIBC_2.2.5)(64bit)
   provider: glibc-2.28-72.el8.x86_64
  dependency: libpq.so.5()(64bit)
   provider: libpq-10.5-1.el8.x86_64
  dependency: libpq.so.5(RHPG_10)(64bit)
   provider: libpq-10.5-1.el8.x86_64
...

最新版じゃないパッケージをインストールしたい場合は yum --showduplicates search を使う。

]# yum --showduplicates search glibc
メタデータの期限切れの最終確認: 1:05:51 時間前の 2020年01月17日 06時20分37秒 に実施しました。
=================================================================== 名前 完全一致: glibc ====================================================================
glibc-2.28-42.el8.1.x86_64 : The GNU libc libraries
glibc-2.28-72.el8.i686 : The GNU libc libraries
glibc-2.28-72.el8.x86_64 : The GNU libc libraries
...

// バージョンまで指定する
]# yum install -y glibc-2.28-72.el8.x86_64
...

パッケージを削除するときは yum remove(yum erase はエイリアス)を使う。

]# yum remove -y perf
...
削除しました:
  perf-4.18.0-147.3.1.el8_1.x86_64

完了しました!

更新系

パッケージを追加するときは yum install を使う。

// -y オプションを使うと、ユーザ確認なしでインストールできる
]# yum install -y jq

更新可能なパッケージを調べるときは yum check-update を使う。

]# yum check-update
...
kernel-headers.x86_64                                               4.18.0-147.el8                                                                  BaseOS
    kernel-headers.x86_64                                           4.18.0-80.11.2.el8_0                                                            @BaseOS
kernel-headers.x86_64                                               4.18.0-147.0.3.el8_1                                                            BaseOS
    kernel-headers.x86_64                                           4.18.0-80.11.2.el8_0                                                            @BaseOS
kernel-headers.x86_64                                               4.18.0-147.3.1.el8_1                                                            BaseOS
    kernel-headers.x86_64                                           4.18.0-80.11.2.el8_0                                                            @BaseOS
libssh-config.noarch                                                0.9.0-4.el8                                                                     BaseOS
    libssh.x86_64                                                   0.8.5-2.el8                                                                     @anaconda
yum-utils.noarch                                                    4.0.8-3.el8                                                                     BaseOS
    dnf-utils.noarch                                                4.0.2.2-3.el8                                                                   @BaseOS

実際にパッケージを更新するときは yum update を使う。

// 一部のパッケージだけ更新する。
]# yum update -y dnf-utils
...

アップグレード済み:
  dnf-4.2.7-7.el8_1.noarch             dnf-data-4.2.7-7.el8_1.noarch        dnf-plugins-core-4.0.8-3.el8.noarch libdnf-0.35.1-9.el8_1.x86_64
  librepo-1.10.3-3.el8.x86_64          libsolv-0.7.4-3.el8.x86_64           python3-dnf-4.2.7-7.el8_1.noarch    python3-dnf-plugins-core-4.0.8-3.el8.noarch
  python3-hawkey-0.35.1-9.el8_1.x86_64 python3-libdnf-0.35.1-9.el8_1.x86_64 python3-librepo-1.10.3-3.el8.x86_64 yum-4.2.7-7.el8_1.noarch

インストール済み:
  yum-utils-4.0.8-3.el8.noarch

完了しました!

// 全て更新する
]# yum update -y

昔のパッケージに戻すときは、yum downgrade を使う。

// インストール済みのパッケージ一覧を表示し、昔のパッケージがあることを確認する
]# yum list java-1.8.0-openjdk-devel
メタデータの期限切れの最終確認: 0:06:25 時間前の 2020年01月17日 08時02分12秒 に実施しました。
インストール済みパッケージ
java-1.8.0-openjdk-devel.x86_64                                              1:1.8.0.232.b09-0.el8_0                                               @AppStream
利用可能なパッケージ
java-1.8.0-openjdk-devel.x86_64                                              1:1.8.0.232.b09-2.el8_1                                               AppStream

]# yum update java-1.8.0-openjdk-devel
CentOS-8 - AppStream                                                                                                         7.9 kB/s | 4.3 kB     00:00
依存関係が解決しました。
=============================================================================================================================================================
 パッケージ                                      アーキテクチャー           バージョン                                   リポジトリー                  サイズ
=============================================================================================================================================================
アップグレード:
 java-1.8.0-openjdk                              x86_64                     1:1.8.0.232.b09-2.el8_1                      AppStream                     317 k
 java-1.8.0-openjdk-devel                        x86_64                     1:1.8.0.232.b09-2.el8_1                      AppStream                     9.8 M
 java-1.8.0-openjdk-headless                     x86_64                     1:1.8.0.232.b09-2.el8_1                      AppStream                      33 M
...

]# yum downgrade java-1.8.0-openjdk-devel
CentOS-8 - AppStream                                                                                                         3.7 kB/s | 4.3 kB     00:01
依存関係が解決しました。
=============================================================================================================================================================
 パッケージ                                      アーキテクチャー           バージョン                                   リポジトリー                  サイズ
=============================================================================================================================================================
ダウングレード:
 java-1.8.0-openjdk                              x86_64                     1:1.8.0.232.b09-0.el8_0                      AppStream                     299 k
 java-1.8.0-openjdk-devel                        x86_64                     1:1.8.0.232.b09-0.el8_0                      AppStream                     9.7 M
 java-1.8.0-openjdk-headless                     x86_64                     1:1.8.0.232.b09-0.el8_0                      AppStream                      32 M
...

アップデートの履歴を見るときは yum history を使う。

]# yum history
ID     | コマンドライン           | 日時             | 動作           | 変更さ
-------------------------------------------------------------------------------
    30 | update dnf-utils         | 2020-01-17 07:17 | I, O, U        |   14
    29 | builddep coreutils-8.30- | 2020-01-05 11:35 | Install        |   12
    28 | --enablerepo=*debug* deb | 2020-01-05 11:19 | Install        |    2
    27 | --enablerepo=*debug* deb | 2020-01-05 10:50 | Install        |    3
    26 | --enablerepo=*debug* deb | 2020-01-05 10:40 | Install        |    1
...

// パッケージごとに検索できる
]#  yum history glibc
ID     | コマンドライン           | 日時             | 動作           | 変更さ
-------------------------------------------------------------------------------
    31 | install -y glibc-2.28-72 | 2020-01-17 07:28 | Upgrade        |    6  <
     1 |                          | 2019-12-12 18:19 | Install        |  613 >E

各ヒストリの詳細は yum history info を使う。

]# yum history info 19
トランザクション ID : 19
開始時間            : 2020年01月03日 11時44分17秒
開始 rpmdb          : 995:a18673e372c3415463e4b424d834d7b8a6244225
終了時間            : 2020年01月03日 11時44分17秒 (0 秒)
終了 rpmdb          : 996:0b6a633209a84b1d46f9117b3121ef21e87064eb
ユーザー            : root <root>
終了コード          : 成功
Releasever     : 8
コマンドライン      : install -y perf
変更されたパッケージ:
    インストール perf-4.18.0-80.11.2.el8_0.x86_64 @BaseOS
...

履歴から操作一式を取り消したい場合は yum history undo を使う。

]# yum history undo 19
メタデータの期限切れの最終確認: 0:13:17 時間前の 2020年01月17日 08時02分12秒 に実施しました。
トランザクション 19 を 2020年01月03日 11時44分17秒 から取り消しています
    インストール perf-4.18.0-80.11.2.el8_0.x86_64 @BaseOS
依存関係が解決しました。
=============================================================================================================================================================
 パッケージ                      アーキテクチャー                  バージョン                                       リポジトリー                       サイズ
=============================================================================================================================================================
削除中:
 perf                            x86_64                            4.18.0-80.11.2.el8_0                             @BaseOS                            7.3 M

トランザクションの概要
=============================================================================================================================================================
削除  1 パッケージ

解放された容量: 7.3 M
これでよろしいですか? [y/N]: y
...

「やっぱり undo やめた!」ってときは yum history redo を使う。 ただし該当パッケージがリポジトリに既に存在しなければ、実行は失敗する。

]# yum history redo 19
メタデータの期限切れの最終確認: 0:14:10 時間前の 2020年01月17日 08時02分12秒 に実施しました。
Repeating transaction 19, from 2020年01月03日 11時44分17秒
    インストール perf-4.18.0-80.11.2.el8_0.x86_64 @BaseOS
利用可能なパッケージ perf-4.18.0-80.11.2.el8_0.x86_64 がありません。
エラー: An operation cannot be redone