yum についてよくわかっていないので調べる

https://qiita.com/advent-calendar/2022/miraito-inc


前日は @__tomotomon さんの [Re:dash についての記事](https://qiita.com/__tomotomon/items/c12582fcc6292c0fe723) でした。

Re:dash はちゃんと触ったことがなかったので、勉強になりました。ありがとうございました。


少し遅れてしまいましたが、7日目は普段なんとなく触っている yum について調べてみた結果を記事にしました。


## 用語の整理

### yum（Yellowdog Updater Modified）

- RPM Package Manager のパッケージを管理するメタパッケージ管理システム
- **yumは、内部でRPMを呼び出している**
- **パッケージの依存関係を自動解決**

### RPM

- RPM Package Manager (前は Red Hat Package Manager) の略
- **rpm 形式パッケージを対象とした** Red Hat Linux で開発されたツール
- RedHat系OSが使うパッケージ管理システム
- **パッケージの依存関係の自動解決はやってくれない**


### パッケージ

[Wiki](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)

> OSになんらかのソフトウェアを追加インストールする場合には、ソフトウェアに関係するファイル一式をまとめた「パッケージ」が利用される。パッケージの形式は複数あるが、利用される形式はOSによって限定されることが多い。

■ 実行形式でないもの

> インストールされるデータ・依存関係のみが含まれており、OSに搭載されているパッケージ管理システムを用いることでインストールできる。

- RPM形式パッケージ
    - Red Hat Linux用に開発されたパッケージ形式
- deb形式パッケージ
    - Debian用に開発されたパッケージ形式

他にも色々な形式のパッケージがある。


■ 実行形式
> ソフトウェアのアーカイブにインストール処理を行う仕組みを追加した形式。Mac OSやWindowsでよく使われ、Linuxディストリビューション向けのソフトウェアでも稀に利用される。依存関係の解決・インストールは、パッケージが独自に行う。

こちらは今回対象ではないので深く調べない。


### パッケージ管理システムの種類

- Debian系
    - dpkg
    - APT
- Red Hat系
    - RPM
    - Yum
- Mac
    - Homebrew
- Windows
    - Windows Package Manager

他にも色々ある。


### リポジトリ

- パッケージの提供元
- 世界中にあって、配布しているパッケージが違う
- 公式のものと非公式のものがある


## yum のリポジトリについて

有効になっているリポジトリの一覧。

```
# yum repolist

repo id             repo name             status
base/7/x86_64       CentOS-7 - Base       10072
extras/7/x86_64     CentOS-7 - Extras     515
updates/7/x86_64    CentOS-7 - Updates    4425
repolist: 15012
```

おそらく、`yum install` コマンドなどの対象となるリポジトリがこの一覧ということ。

リポジトリの情報を管理しているの `/etc/yum.repos.d/` 以下に置かれたファイル
上記の有効、無効も管理している。

```
# ls -l /etc/yum.repos.d/
total 28
-rw-r--r-- 1 root root 1664 Aug 30  2017 CentOS-Base.repo
-rw-r--r-- 1 root root 1309 Aug 30  2017 CentOS-CR.repo
-rw-r--r-- 1 root root  649 Aug 30  2017 CentOS-Debuginfo.repo
-rw-r--r-- 1 root root  630 Aug 30  2017 CentOS-Media.repo
-rw-r--r-- 1 root root 1331 Aug 30  2017 CentOS-Sources.repo
-rw-r--r-- 1 root root 3830 Aug 30  2017 CentOS-Vault.repo
-rw-r--r-- 1 root root  314 Aug 30  2017 CentOS-fasttrack.repo
```

中身を確認してみる。

```php
#  cat /etc/yum.repos.d/CentOS-Base.repo

[base]
# リポジトリ名
name=CentOS-$releasever - Base
# ミラーサーバのリスト。近い場所からインストールしてくるらしい。
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
# GPG の検証を有効にする(ダウンロード先が正しい場所かの確認)
gpgcheck=1
# GPG のキー情報
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
```
`enabled=1` と書かれていないが、 `enabled=0` が明示的に書かれているため、おそらくデフォルトが
`enabled=1` なので `CentOS-7 - Base` `CentOS-7 - Updates` `CentOS-7 - Extras` リポジトリが有効化されていることがわかる。

先ほどの `yum repolist` で確認した内容とも一致しているように見える。

`baseos`リポジトリなどの説明は[この辺](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/package_manifest/index)。

有効化されているリポジトリからパッケージを取得することができる。


## リポジトリの追加

### `yum install` と `yum localinstall` の違い

`yum install` or `yum localinstall` コマンドでリポジトリを追加することが可能。

２つの違いは次の通り

|    |  yum install  |  yum localinstall  |
| ---- | ---- | ---- |
|  パッケージのインストール  |  できる  |  できない  |
|  リポジトリの追加  |  できる  |  できる  |

RHEL 5 以前のバージョンでは、`yum install` ではリポジトリの追加はできなかったが、
RHEL 6 以降では可能になったらしい。


### リポジトリを追加してみる


[MySQL のリポジトリの追加](https://dev.mysql.com/doc/refman/8.0/en/linux-installation-yum-repo.html)を試してみる。

追加する[リポジトリ](https://dev.mysql.com/downloads/repo/yum/) はこちら。
今回は CentOS 7 系なので `Red Hat Enterprise Linux 7 / Oracle Linux 7 (Architecture Independent), RPM Package` を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364773/2d176df5-bd55-2fc5-5ef7-a8d7fd85b1fe.png)


ダウンロードリンクの URL をコピーしておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364773/70348526-4b19-28f5-3f1c-58316bf4c485.png)



```
# yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm

... 省略 ...

Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : mysql80-community-release-el7-7.noarch      1/1
  Verifying  : mysql80-community-release-el7-7.noarch      1/1

Installed:
  mysql80-community-release.noarch 0:el7-7

Complete!
```

リポジトリが追加されたことを確認する。

```
# yum repolist

repo id                             repo name                    status
base/7/x86_64                       CentOS-7 - Base              10072
extras/7/x86_64                     CentOS-7 - Extras            515
mysql-connectors-community/x86_64   MySQL Connectors Community   146
mysql-tools-community/x86_64        MySQL Tools Community        58
mysql80-community/x86_64            MySQL 8.0 Community Server   156
updates/7/x86_64                    CentOS-7 - Updates           4425
repolist: 15372
```

MySQL のリポジトリが追加されている。

リポジトリの追加というより、リポジトリの情報の追加の方が正しいかも。

リポジトリを追加しただけなので当然 MySQL がインストールされたわけじゃない。


```
# mysql --version
bash: mysql: command not found
```

## yum install を試す

### MySQL Client をインストールする

```
yum install -y mysql-community-client

... 省略 ...


Installed:
  mysql-community-client.x86_64 0:8.0.31-1.el7

Dependency Installed:
  mysql-community-client-plugins.x86_64 0:8.0.31-1.el7                                mysql-community-common.x86_64 0:8.0.31-1.el7                                mysql-community-libs.x86_64 0:8.0.31-1.el7

Complete!

```

```
# mysql --version
mysql  Ver 8.0.31 for Linux on x86_64 (MySQL Community Server - GPL)
```

### ダウンロードされた rpm ファイルを確認

一度ダウンロードされた rpm ファイルは、再度取得して来なくてもいいように、
 `/var/cache/yum/x86_64/7/` ディレクトリにキャッシュされるらしい。

`yum clean` で削除される。


```
# ls -la /var/cache/yum/x86_64/7/
total 40
drwxr-xr-x 8 root root 4096 Dec  9 05:10 .
drwxr-xr-x 3 root root 4096 Dec  9 02:10 ..
drwxr-xr-x 4 root root 4096 Dec  9 02:10 base
drwxr-xr-x 4 root root 4096 Dec  9 02:10 extras
drwxr-xr-x 4 root root 4096 Dec  9 05:10 mysql-connectors-community
drwxr-xr-x 4 root root 4096 Dec  9 05:10 mysql-tools-community
drwxr-xr-x 4 root root 4096 Dec  9 05:10 mysql80-community
-rw-r--r-- 1 root root  121 Dec  9 05:10 timedhosts
-rw-r--r-- 1 root root  407 Dec  9 02:10 timedhosts.txt
drwxr-xr-x 4 root root 4096 Dec  9 02:10 updates
```

```
ls -l /var/cache/yum/x86_64/7/mysql-connectors-community/
total 116
-rw-r--r-- 1 root root 95132 Oct  8 12:22 8393eb6d1cc24f6768d2260581e1ef283f65bdbf-primary.sqlite.bz2
-rw-r--r-- 1 root root     0 Dec  9 05:10 cachecookie
drwxr-xr-x 2 root root  4096 Dec  9 05:10 gen
drwxr-xr-x 2 root root  4096 Dec  9 05:10 packages
-rw-r--r-- 1 root root  2622 Oct  8 12:22 repomd.xml
```


### インストールされた rpm パッケージの情報を参照

```
rpm -qi mysql-community-client
Name        : mysql-community-client
Version     : 8.0.31
Release     : 1.el7
Architecture: x86_64
Install Date: Fri Dec  9 05:10:15 2022
Group       : Applications/Databases
Size        : 83836667
License     : Copyright (c) 2000, 2022, Oracle and/or its affiliates. Under GPLv2 license as shown in the Description field.
Signature   : RSA/SHA256, Wed Sep 14 08:28:57 2022, Key ID 467b942d3a79bd29
Source RPM  : mysql-community-8.0.31-1.el7.src.rpm
Build Date  : Tue Sep 13 19:18:01 2022
Build Host  : pb2-el7-20.regionaliad02.mysql2iad.oraclevcn.com
Relocations : (not relocatable)
Packager    : MySQL Release Engineering <mysql-build@oss.oracle.com>
Vendor      : Oracle and/or its affiliates
URL         : http://www.mysql.com/
Summary     : MySQL database client applications and tools
Description :
This package contains the standard MySQL clients and administration
tools.
```

これは rpm database というところからデータを取得してきているらしい。

rpm データベースには rpm install などをするとデータが追加されるらしい。

rpm データベースの場所は `/var/lib/rpm` にあるらしい。

```
# ls -l /var/lib/rpm
total 19988
-rw-r--r-- 1 root root   954368 Dec  9 05:10 Basenames
-rw-r--r-- 1 root root     8192 Dec  9 05:10 Conflictname
-rw-r--r-- 1 root root   274432 Dec  9 05:10 Dirnames
-rw-r--r-- 1 root root     8192 Dec  9 05:10 Group
-rw-r--r-- 1 root root    12288 Dec  9 05:10 Installtid
-rw-r--r-- 1 root root    16384 Dec  9 05:10 Name
-rw-r--r-- 1 root root     8192 Dec  9 05:10 Obsoletename
-rw-r--r-- 1 root root 15720448 Dec  9 05:10 Packages
-rw-r--r-- 1 root root  1646592 Dec  9 05:10 Providename
-rw-r--r-- 1 root root    98304 Dec  9 05:10 Requirename
-rw-r--r-- 1 root root    24576 Dec  9 05:10 Sha1header
-rw-r--r-- 1 root root    16384 Dec  9 05:10 Sigmd5
-rw-r--r-- 1 root root     8192 Sep 11  2017 Triggername
-rw-r--r-- 1 root root   270336 Dec  9 05:53 __db.001
-rw-r--r-- 1 root root    81920 Dec  9 05:53 __db.002
-rw-r--r-- 1 root root  1318912 Dec  9 05:53 __db.003
```

### インストールされた rpm パッケージを確認

```
rpm -ql mysql-community-client

/usr/bin/mysql
/usr/bin/mysql_config_editor
/usr/bin/mysql_migrate_keyring
/usr/bin/mysqladmin
/usr/bin/mysqlbinlog
/usr/bin/mysqlcheck
/usr/bin/mysqldump
/usr/bin/mysqlimport
/usr/bin/mysqlpump
/usr/bin/mysqlshow
/usr/bin/mysqlslap
/usr/share/doc/mysql-community-client-8.0.31
/usr/share/doc/mysql-community-client-8.0.31/LICENSE
/usr/share/doc/mysql-community-client-8.0.31/README
/usr/share/man/man1/mysql.1.gz
/usr/share/man/man1/mysql_config_editor.1.gz
/usr/share/man/man1/mysqladmin.1.gz
/usr/share/man/man1/mysqlbinlog.1.gz
/usr/share/man/man1/mysqlcheck.1.gz
/usr/share/man/man1/mysqldump.1.gz
/usr/share/man/man1/mysqlimport.1.gz
/usr/share/man/man1/mysqlpump.1.gz
/usr/share/man/man1/mysqlshow.1.gz
/usr/share/man/man1/mysqlslap.1.gz
```

## yum install を行った際の流れ


![イメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364773/b46fc427-3301-e2ff-748a-e5b831982ea6.png)

多分こんな感じになっているはず。
違ったら誰か教えて。



## 動作確認した環境

https://hub.docker.com/layers/library/centos/7.4.1708/images/sha256-9f266d35e02cc56fe11a70ecdbe918ea091d828736521c91dda4cc0c287856a9?context=explore

```
# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
```


## おわり

8日目は @Nyokki さんの　PostgreSQL 15 で追加された MERGE 機能の記事です！！


## 参考

https://blog.kasei-san.com/entry/2015/10/07/085002

https://qiita.com/ritukiii/items/cc22efd005a06b8d4a86


https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0

https://www.kimullaa.com/posts/202001190119/#%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B

https://tech-blog.rakus.co.jp/entry/2017/12/14/105052

https://qiita.com/taro-hida/items/1cc86a1c713e835ffb41

https://qiita.com/bezeklik/items/9766003c19f9664602fe

https://access.redhat.com/sites/default/files/attachments/rh_yum_cheatsheet_1214_jcs_print-ja.pdf

https://qiita.com/mashiro_lain/items/c37ab3e33e244784bd2f