普段なんとなく 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 ファイル。 rpm ファイルには、メタデータ・インストール手順・インストールするファイル などが格納されている。rpm パッケージの具体的な構造は、次のサイトが参考になる。
参考 Maximum RPM: Taking the RPM Package Manager to the Limit
パッケージの中身の確認
まず 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
続いて、インストールされるファイルを確認する。
]# 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 -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)
...
どのように依存関係を解決するか?
yum がどのように依存関係を解決するのかを説明する。大まかに、次の流れになっている。
- リポジトリにアクセスする
- リポジトリの情報を取得する
- パッケージの依存関係を解決する
- 依存するファイルをダウンロードする
リポジトリにアクセスする
参照先のリポジトリは /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(http://mirrorlist.centos.org/?release=8&arch=x86_64&repo=AppStream&infra=stock) を見るとわかるが、 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
URL 指定でもいける。
// 例. 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
リポジトリの情報を取得する
先述した yum リポジトリ(たとえば http://ftp-srv2.kddilabs.jp/Linux/packages/CentOS/8.1.1911/AppStream/x86_64/os/)には、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>1583442846</revision>
<data type="primary">
<checksum type="sha256">2cede7c42f45529dddf24e87f8efde2307e9a5d864e16b2b7b9f70edcf62c089</checksum>
<open-checksum type="sha256">fce809e1aa0bda7d0c4feae290b67a3e464584f054d0ef568fa4c50a94035da6</open-checksum>
<location href="repodata/2cede7c42f45529dddf24e87f8efde2307e9a5d864e16b2b7b9f70edcf62c089-primary.xml.gz"/>
<timestamp>1583442839</timestamp>
<size>1582689</size>
<open-size>15951759</open-size>
</data>
<data type="filelists">
<checksum type="sha256">9fd0fdcad384526e5dbe6841bc446d7a12c892b26f479f4017ef9ab00dbeeeb0</checksum>
<open-checksum type="sha256">09b85490475f7e0c1459c9def803ce307abb5bcfbb103721ae7761eee6db9e88</open-checksum>
<location href="repodata/9fd0fdcad384526e5dbe6841bc446d7a12c892b26f479f4017ef9ab00dbeeeb0-filelists.xml.gz"/>
<timestamp>1583442839</timestamp>
<size>5142434</size>
<open-size>65464057</open-size>
</data>
...
リンクされている別ファイル(たとえば type=primary
の repodata/2cede7c42f45529dddf24e87f8efde2307e9a5d864e16b2b7b9f70edcf62c089-primary.xml.gz
)を確認すると、次のように記載されている。これらは rpm が元になっているメタデータファイルで、依存関係の解決に重要なのは、パッケージが提供するファイルの一覧と依存するファイルの一覧が記載されている部分。
...
<package type="rpm">
<name>jq</name>
<arch>x86_64</arch>
<version epoch="0" ver="1.5" rel="12.el8"/>
<checksum type="sha256" pkgid="YES">65d37df250e218828523bea2882f4bfad1ffc4dcc0f56aadd92b9c5265e7ae37</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
and filter and map and transform structured data with
the same ease that sed, awk, grep and friends let you
play with text.
It is written in portable C, and it has zero runtime
dependencies.
jq can mangle the data format that you have into the
one that you want with very little effort, and the
program to do so is often shorter and simpler than
you'd expect.</description>
<packager>CentOS Buildsys <bugs@centos.org></packager>
<url>http://stedolan.github.io/jq/</url>
<time file="1562074383" build="1557872881"/>
<size package="165044" installed="367321" archive="369376"/>
<location href="Packages/jq-1.5-12.el8.x86_64.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="12540"/>
<!-- パッケージが提供するファイル -->
<rpm:provides>
<rpm:entry name="jq" flags="EQ" epoch="0" ver="1.5" rel="12.el8"/>
<rpm:entry name="jq(x86-64)" flags="EQ" epoch="0" ver="1.5" rel="12.el8"/>
<rpm:entry name="libjq.so.1()(64bit)"/>
</rpm:provides>
<!-- パッケージが必要とするファイル -->
<rpm:requires>
<rpm:entry name="ld-linux-x86-64.so.2()(64bit)"/>
<rpm:entry name="ld-linux-x86-64.so.2(GLIBC_2.3)(64bit)"/>
<rpm:entry name="libm.so.6()(64bit)"/>
<rpm:entry name="libm.so.6(GLIBC_2.2.5)(64bit)"/>
<rpm:entry name="libonig.so.5()(64bit)"/>
<rpm:entry name="rtld(GNU_HASH)"/>
<rpm:entry name="libc.so.6(GLIBC_2.14)(64bit)"/>
</rpm:requires>
<file>/usr/bin/jq</file>
</format>
</package>
<package type="rpm">
...
</package>
...
パッケージの依存関係を解決する
上記のメタデータファイルを利用して依存関係を解決する。dnf では 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 らしいので注意。
>>> 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 のクラスを継承して利用している。
依存するファイルをダウンロードする
ダウンロードして rpm でインストールするだけ。なお、RPM データベースも更新される。
yum の使い方
ここからは、yum の使い方を説明する。
プロキシ
前述の通り、 yum リポジトリにはネットワーク越しにアクセスする。そのため、プロキシ環境では設定が必要。環境変数(http_proxy)を参照してくれないので /etc/dnf/dnf.conf
に記述する。
[main]
...
proxy=http://hostname:port/
リポジトリ系
すべてのリポジトリが常に利用されるわけではない。(有効は 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
...
そのため、一部のコマンド(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