yum、rpm 何が違う。。？

## はじめに
いつも何気なく`yum install ${パッケージ名}`でなんとなくインストールしていたのですが、
そもそもyumってなんだ？なんか調べたらrpmって出てくるけど何が違うんだ？
そんな思いから自分の考えをまとめるために書きます。

同様の疑問を持つ人の助けになれば幸いなのと、誤ってることがあればコメントにて指摘していただけますと幸いです！

## yumとは

yumはCentOSを始め、Red Hat系のLinuxディストリビューションで使用されている、パッケージ管理ツールで、パッケージをインストール、削除、更新といったあらゆる操作ができます。
そしてyumと同様にrpmもパッケージ管理ツールです。
両者には以下のような違いがあります。

||yum|rpm|
|---|---|---|
|依存関係の自動解決|◯|X|
|自動更新|◯|X|

`yum`の場合は、何かパッケージをinstallした際に、他にも必要なパッケージがないかチェックし一緒にインストールすることができます。
一方rpmコマンドの場合はそういった依存関係は関係なく、指定したパッケージのみをインストイールします。
なのでrpmコマンドを使う場面としては限定的にはなりそうですが、インストールするパッケージを個別に選定してカスタマイズが必要な時になるのでしょうか。

rpmの後継としてyumが登場した背景もあり、yumのほうが高機能なので基本的にはyumを使用することにはなるかと思います。

## yumの仕組みについて

一旦yumの仕組みについて全体を以下に記載します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492874/0677b28e-3f3b-e073-9526-91ee65e879e5.png)


`パッケージが置いてある場所`
ここに```yum install```で実際にインストールするパッケージが置かれています。
では、どうやってパッケージを置いてある場所を参照しているんだ？と思ったのですが、それは`/etc/yum.repos.d/`配下の
ファイルに記載してあります。

`/etc/yum.repos.d/`配下の`CentOS-Base.repo`を見てみます。

```
sh-4.2$ cat CentOS-Base.repo
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#

[base]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
baseurl=http://vault.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
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://vault.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://vault.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://vault.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
```

上記の中の、以下に書かれているURLにパッケージを取りに行っています。
```
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
baseurl=http://vault.centos.org/centos/$releasever/os/$basearch/
```
`mirrorlist`はパッケージが置かれたサーバーの中から地理的に一番近い場所からパッケージを取得してくれます。
`baseurl`では直接サーバーのURLを指定します。
余談ですが、筆者がこのブログ中で使用しているOSはCentOS7なのですが、提供されていたリポジトリが停止されているため、初期設定のまま`yum install`してもパッケージを取得できません。
以下の記事を参考に`baseurl`の値を変更する必要があるので良かったら参考にしてください。
[CentOS 7 の標準リポジトリの停止について
](https://www.miraclelinux.com/support/linux-extended-support/linux-extended-support/linux-extended-support-switch-repository-centos7)

実際に`yum install`してみます。

```
sh-4.2$ sudo yum install postgresql
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * epel: d2lzkl7pfhq30w.cloudfront.net
Resolving Dependencies
--> Running transaction check
---> Package postgresql.x86_64 0:9.2.24-9.el7_9 will be installed
--> Processing Dependency: postgresql-libs(x86-64) = 9.2.24-9.el7_9 for package: postgresql-9.2.24-9.el7_9.x86_64
--> Processing Dependency: libpq.so.5()(64bit) for package: postgresql-9.2.24-9.el7_9.x86_64
--> Running transaction check
---> Package postgresql-libs.x86_64 0:9.2.24-9.el7_9 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

====================================================================================================================================================================================================================
 Package                                                Arch                                          Version                                                  Repository                                      Size
====================================================================================================================================================================================================================
Installing:
 postgresql                                             x86_64                                        9.2.24-9.el7_9                                           updates                                        3.0 M
Installing for dependencies:
 postgresql-libs                                        x86_64                                        9.2.24-9.el7_9                                           updates                                        235 k

Transaction Summary
====================================================================================================================================================================================================================
Install  1 Package (+1 Dependent package)

Total download size: 3.3 M
Installed size: 17 M
Is this ok [y/d/N]: yes
Downloading packages:
(1/2): postgresql-libs-9.2.24-9.el7_9.x86_64.rpm                                                                                                                                             | 235 kB  00:00:00
(2/2): postgresql-9.2.24-9.el7_9.x86_64.rpm                                                                                                                                                  | 3.0 MB  00:00:00
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                                               8.4 MB/s | 3.3 MB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : postgresql-libs-9.2.24-9.el7_9.x86_64                                                                                                                                                            1/2
  Installing : postgresql-9.2.24-9.el7_9.x86_64                                                                                                                                                                 2/2
  Verifying  : postgresql-9.2.24-9.el7_9.x86_64                                                                                                                                                                 1/2
  Verifying  : postgresql-libs-9.2.24-9.el7_9.x86_64                                                                                                                                                            2/2

Installed:
  postgresql.x86_64 0:9.2.24-9.el7_9

Dependency Installed:
  postgresql-libs.x86_64 0:9.2.24-9.el7_9

Complete!
```

以下の部分ですが、元々指定したパッケージは`postgresql`ですが、yumのおかげで他にも必要なパッケージとして` postgresql-libs`もインストールされています。
rpmコマンドでインストールする場合は、こういった依存関係にある、他に必要なパッケージは自分で判断する必要があるので注意が必要です。
```
====================================================================================================================================================================================================================
 Package                                                Arch                                          Version                                                  Repository                                      Size
====================================================================================================================================================================================================================
Installing:
 postgresql                                             x86_64                                        9.2.24-9.el7_9                                           updates                                        3.0 M
Installing for dependencies:
 postgresql-libs                                        x86_64                                        9.2.24-9.el7_9                                           updates                                        235 k

Transaction Summary
====================================================================================================================================================================================================================
```
そしてyumコマンドでインストールしたパッケージは、`/var/lib/rpm`配下のrpmDBに保存されます。
最後に`yum ijnstall`実行からパッケージがインストールされて保存する流れを追記します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492874/a0bcc201-bc54-dd32-a27b-af2d8aa07f4c.png)


## 終わりに
おおよその概要でしたが参考になりますと幸いです。
また誤った部分があればぜひコメントで教えていただけますと幸いです！！