【RedHat系（CentOSなど）】初学者が抑えておきたいyumの概要・主要なコマンド・外部リポジトリ

##はじめに
はじめまして、プログラミングを学び始めて間もない初学者です。
学んだことをQIitaでアウトプットしていきます。
記事に気になる点がありましたら、ご指摘・アドバイスよろしくお願いします。
　　
##対象者
- 初学者
- RedHat系（CenoOSなど）を触り始めて間もない方
- yumコマンドの大雑把な概要を知りたい方

##構成
- yumの概要
    - yumとは？
    - パッケージとは？
    - RPMとyum
    - 依存関係とは？
    - RPMとyumの具体例
- 主要なコマンド
    - yum install
    - yum update
    - yum erase
- インストールできるパッケージの確認方法
    - yum list
    - yum list installed
    - yum list updates
    - yum list available
    - yum list extras
    - yum search
    - yum info
- 外部リポジトリ
    - リポジトリの確認
    - 外部リポジトリの取り込み


##環境

- EC2（AWS）
- CentOS Linux 7 x86_64 HVM EBS ENA 2002_01-b7ee8a69-ee97-4a49-9e68-afaee216db2e-ami-0042af67f8e4dcc20.4(AMI名) 


##yumの概要

###yumとは？
yumとは、Linuxシステム(RedHat系)のパッケージ管理を容易にしてくれるツールまたはコマンドのことです。

- JavaScriptでいうとnpm
- RubyでいうとBundler
- PHPでいうとComposer

のような存在です。

大雑把にいうとパッケージのインストールやアップデート、削除などを簡単にしてくれるものです。また、依存関係の問題も解決してくれます。

依存関係？？？（こちらは後述します💦）

###パッケージとは？
パッケージとは、ある機能を実現するためにまとめられたファイルたち（プログラム）のことです。

例えば

- Webサーバーの機能を実現してくれるパッケージ
- ファイルのアップロード機能を実現してくれるパッケージ
- メール送信機能を実現してくれるパッケージ

誰かが準備してくれた「便利な道具」みたいなものでしょうか。

###RPMとyum
実は、Linuxシステム（RedHat系）には、パッケージをインストール、削除などのパッケージ管理してくれるRPM（Red Hat Package Manager）というものがあります。RPMもパッケージを扱うことができるパッケージ管理コマンドです。


どうして２つもパッケージ管理コマンドがあるのでしょうか。この２つの違いは何か気になりますよね。

この２つの主な違いは、「依存関係を解決」してくれるかどうかです。


先ほど、説明すると言った「依存関係」が出てきました💦

---

【参考資料】
[【RPM入門】Linuxのパッケージ管理システム「RPM」とは？ \| UX MILK](https://uxmilk.jp/10240)

---

###依存関係とは？
Google Chromeで「依存」と検索すると、

>「依存」とは、他人や組織、モノに愛情や支持、保護、援助を求め、それがなくては生きていけない状態であり、行為や思考のコントロール障害といわれています。自分ではやめられなくなり、精神医学の立場から病気と認められているものを「依存症」といいます。



とこのような文言がありました。簡単に言うと「君がいないと生きていけないよ状態」のことです。恋愛を想像するとわかりやすいですね👍

---
【参考資料】
[依存について](http://www.u-gakugei.ac.jp/~hokekan/d-izon0908.html)

---

実はこのようなことがパッケージ管理の世界でもあるのです！！！

例えば、

うまうまカレーパッケージ（機能はうまいカレーライスを作る）というパッケージがあるとします。

このうまうまカレーパッケージは、お野菜トントンパッケージ（機能は野菜を切る）とじっくりグツグツパッケージ（機能は具材を煮込む）を取り込んで実現されているパッケージです。

この関係が依存関係です。

うまうまカレーパッケージはお野菜トントンパッケージとじっくりグツグツパッケージがない場合、うまいカレーを作るという機能を実現できない状態です。

言い換えるとうまうまカレーパッケージはお野菜トントンパッケージとじっくりグツグツパッケージに「あなたがいないと生きていけない状態」ということですね。(恋愛の依存関係と一緒！！)


###RPMとyumの具体例

それでは、RPMとyumの話に戻りましょう。
yumは、依存関係を解決してくれるという話でしたね。
さきほどのパッケージをコマンドで表してみましょう！！

####RPMの場合

```
$ rpm -ivh お野菜トントン.rpm
$ rpm -ivh じっくりぐつぐつ.rpm
$ rpm -ivh うまうまカレー.rpm
```

それぞれのパッケージをインストールしなければ、うまうまカレーの機能を使用できない💦

####yumの場合

```
$ yum install うまうまカレー（パッケージ名）
```

コマンド１つでうまうまカレーを作る機能を手に入れることができます。依存している２つのパッケージは自動でインストールしてくれています。（依存関係の解決）

このように依存関係を理解して、パッケージのインストールや削除を行なってくれるのがyumなのです🎉🎉🎉


※実はyumコマンドは内部でrpmコマンドを実行しています。「RPM」を元にしたより高機能なパッケージ管理システムがyumコマンドです。rpmコマンドの便利版がyumコマンドという認識が正しいと思われます。

##主要なコマンド

###yum install

・指定したパッケージをインストールする

```bash
$ yum install パッケージ名
```


###yum update

・指定したパッケージをアップデートする

```bash
$ yum update パッケージ名
```

###yum erase 
・指定したパッケージをアンインストールする

```bash
$ yum erase パッケージ名
```

----

【参考資料】
[yumコマンド一覧 \- Qiita](https://qiita.com/kazu56/items/3eeab8884f62be1cf3e6)

---

##インストールできるパッケージの確認方法

インストールやアップデートの方法が分かったので、インストールできるパッケージを確認できるようにしましょう。

###yum list

・パッケージのリストを表示する

```
$ yum list [installed|updates|available|extras]
```
［　］で囲まれたものは、オプションです。

`yum list`コマンドだけだと、パッケージが多すぎて表示しきれないので、「php」の文字列が入っているパッケージだけを例として載せておきます。

```
$ yum list | grep php
emacs-php-mode.noarch                       1.18.2-1.el7               base
graphviz-php.x86_64                         2.30.1-22.el7              base
php.x86_64                                  5.4.16-48.el7              base
php-bcmath.x86_64                           5.4.16-48.el7              base
php-cli.x86_64                              5.4.16-48.el7              base
php-common.x86_64                           5.4.16-48.el7              base
php-dba.x86_64                              5.4.16-48.el7              base
php-devel.x86_64                            5.4.16-48.el7              base
php-embedded.x86_64                         5.4.16-48.el7              base
php-enchant.x86_64                          5.4.16-48.el7              base
php-fpm.x86_64                              5.4.16-48.el7              base
php-gd.x86_64                               5.4.16-48.el7              base
php-intl.x86_64                             5.4.16-48.el7              base
php-ldap.x86_64                             5.4.16-48.el7              base
php-mbstring.x86_64                         5.4.16-48.el7              base
php-mysql.x86_64                            5.4.16-48.el7              base
php-mysqlnd.x86_64                          5.4.16-48.el7              base
php-odbc.x86_64                             5.4.16-48.el7              base
php-pdo.x86_64                              5.4.16-48.el7              base
php-pear.noarch                             1:1.9.4-22.el7             base
php-pecl-memcache.x86_64                    3.0.8-4.el7                base
php-pgsql.x86_64                            5.4.16-48.el7              base
php-process.x86_64                          5.4.16-48.el7              base
php-pspell.x86_64                           5.4.16-48.el7              base
php-recode.x86_64                           5.4.16-48.el7              base
php-snmp.x86_64                             5.4.16-48.el7              base
php-soap.x86_64                             5.4.16-48.el7              base
php-xml.x86_64                              5.4.16-48.el7              base
php-xmlrpc.x86_64                           5.4.16-48.el7              base
rrdtool-php.x86_64                          1.4.8-9.el7                base
uuid-php.x86_64                             1.6.2-26.el7               base
```


###yum list installed

・インストール済のパッケージを表示

```bash
$ yum list installed
```

具体例

```
$ yum list installed
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: d36uatko69830t.cloudfront.net
 * extras: d36uatko69830t.cloudfront.net
 * updates: d36uatko69830t.cloudfront.net
インストール済みパッケージ
PyYAML.x86_64                                                  3.10-11.el7                                       installed
acl.x86_64                                                     2.2.51-15.el7                                     @base
audit.x86_64                                                   2.8.5-4.el7                                       installed
audit-libs.x86_64                                              2.8.5-4.el7                                       installed
audit-libs-python.x86_64                                       2.8.5-4.el7                                       installed
authconfig.x86_64                                              6.2.8-30.el7                                      installed
basesystem.noarch                                              10.0-7.el7.centos                                 installed
bash.x86_64                                                    4.2.46-34.el7                                     @base
bc.x86_64                                                      1.06.95-13.el7                                    @base
bind-export-libs.x86_64                                        32:9.11.4-26.P2.el7_9.5                           @updates
binutils.x86_64                                                2.27-44.base.el7                                  @base
btrfs-progs.x86_64                                             4.9.1-1.el7                                       installed
bzip2-libs.x86_64                                              1.0.6-13.el7                                      installed
ca-certificates.noarch                                         2020.2.41-70.0.el7_8                              @base
centos-release.x86_64                                          7-9.2009.1.el7.centos                             @updates
checkpolicy.x86_64                                             2.5-8.el7                                         installed
chkconfig.x86_64                                               1.7.6-1.el7                                       @base
...
...
...（続く）
```

###yum list updates
・インストール済のパッケージでアップデート可能なパッケージを表示

```
$ yum list updates
```

###yum list available
・リポジトリ内で利用可能なパッケージを表示

```
$ yum list available
```

###yum list extras
・利用できなくなってしまったパッケージを表示

```
$ yum list extras
```

###yum search
・パッケージを検索

```
$ yum search パッケージ名や用語
```


yum search コマンドを使用すると、リポジトリ上のRPMのパッケージ名、詳細、サマリから対象のパッケージを検索する事ができます。

```
$ yum search php
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: d36uatko69830t.cloudfront.net
 * extras: d36uatko69830t.cloudfront.net
 * updates: d36uatko69830t.cloudfront.net
=================================================================================== N/S matched: php ===================================================================================
emacs-php-mode.noarch : Major GNU Emacs mode for editing PHP code
graphviz-php.x86_64 : PHP extension for graphviz
php.x86_64 : PHP scripting language for creating dynamic web sites
php-bcmath.x86_64 : A module for PHP applications for using the bcmath library
php-cli.x86_64 : Command-line interface for PHP
php-common.x86_64 : Common files for PHP
php-dba.x86_64 : A database abstraction layer module for PHP applications
php-devel.x86_64 : Files needed for building PHP extensions
php-embedded.x86_64 : PHP library for embedding in applications
php-enchant.x86_64 : Enchant spelling extension for PHP applications
php-fpm.x86_64 : PHP FastCGI Process Manager
php-gd.x86_64 : A module for PHP applications for using the gd graphics library
php-intl.x86_64 : Internationalization extension for PHP applications
php-ldap.x86_64 : A module for PHP applications that use LDAP
php-mbstring.x86_64 : A module for PHP applications which need multi-byte string handling
php-mysql.x86_64 : A module for PHP applications that use MySQL databases
php-mysqlnd.x86_64 : A module for PHP applications that use MySQL databases
php-odbc.x86_64 : A module for PHP applications that use ODBC databases
...
...
...（続く）
```

###yum info
・パッケージの情報を確認

```
$ yum info パッケージ名
```

```
$ yum info php
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: d36uatko69830t.cloudfront.net
 * extras: d36uatko69830t.cloudfront.net
 * updates: d36uatko69830t.cloudfront.net
利用可能なパッケージ
名前                : php
アーキテクチャー    : x86_64
バージョン          : 5.4.16
リリース            : 48.el7
容量                : 1.4 M
リポジトリー        : base/7/x86_64
要約                : PHP scripting language for creating dynamic web sites
URL                 : http://www.php.net/
ライセンス          : PHP and Zend and BSD
説明                : PHP is an HTML-embedded scripting language. PHP attempts to make it
                    : easy for developers to write dynamically generated web pages. PHP also
                    : offers built-in database integration for several commercial and
                    : non-commercial database management systems, so writing a
                    : database-enabled webpage with PHP is fairly simple. The most common
                    : use of PHP coding is probably as a replacement for CGI scripts.
                    :
                    : The php package contains the module (often referred to as mod_php)
                    : which adds support for the PHP language to Apache HTTP Server.
```

---
【参考資料】
[【yum list】パッケージ一覧を表示・確認する \| UX MILK](https://uxmilk.jp/9146)

---

##外部リポジトリ

yumリポジトリは、提供しているパッケージのバージョンが古かったり、欲しいパッケージがない場合があります。その時は、外部リポジトリから欲しいパッケージをインストールすることができます。

※リポジトリとは、パッケージなどの保存場所のこと

---
【参考資料】
[外部レポジトリとは \-CentOSで用語として使われるレポジトリとはどうい\- UNIX・Linux \| 教えて\!goo](https://oshiete.goo.ne.jp/qa/7295395.html)

---

###リポジトリの確認

現在、使用しているリポジトリを確認することができます。

```
$ yum repolist
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: d36uatko69830t.cloudfront.net
 * extras: d36uatko69830t.cloudfront.net
 * updates: d36uatko69830t.cloudfront.net
リポジトリー ID                                                                         リポジトリー名                                                                            状態
base/7/x86_64                                                                           CentOS-7 - Base                                                                           10,072
extras/7/x86_64                                                                         CentOS-7 - Extras                                                                            498
updates/7/x86_64                                                                        CentOS-7 - Updates                                                                         2,552
repolist: 13,122
```

###外部リポジトリの取り込み

下記の記事を参考にして、外部リポジトリである「Remi's RPM repository」を追加してみます。

---
【参考資料】
[yumリポジトリ追加リスト 完全版 \- Qiita](https://qiita.com/bezeklik/items/9766003c19f9664602fe)

---

```
$ sudo yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
読み込んだプラグイン:fastestmirror
remi-release-7.rpm                                                                                                                                                                   |  23 kB  00:00:00
/var/tmp/yum-root-cvPpK7/remi-release-7.rpm を調べています: remi-release-7.9-1.el7.remi.noarch
/var/tmp/yum-root-cvPpK7/remi-release-7.rpm をインストール済みとして設定しています
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ remi-release.noarch 0:7.9-1.el7.remi を インストール
--> 依存性の処理をしています: epel-release = 7 のパッケージ: remi-release-7.9-1.el7.remi.noarch
Loading mirror speeds from cached hostfile
 * base: d36uatko69830t.cloudfront.net
 * extras: d36uatko69830t.cloudfront.net
 * updates: d36uatko69830t.cloudfront.net
--> トランザクションの確認を実行しています。
---> パッケージ epel-release.noarch 0:7-11 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

============================================================================================================================================================================================================
 Package                                          アーキテクチャー                           バージョン                                           リポジトリー                                         容量
============================================================================================================================================================================================================
インストール中:
 remi-release                                     noarch                                     7.9-1.el7.remi                                       /remi-release-7                                      31 k
依存性関連でのインストールをします:
 epel-release                                     noarch                                     7-11                                                 extras                                               15 k

トランザクションの要約
============================================================================================================================================================================================================
インストール  1 パッケージ (+1 個の依存関係のパッケージ)

合計容量: 45 k
総ダウンロード容量: 15 k
インストール容量: 55 k
Is this ok [y/d/N]: y
Downloading packages:
epel-release-7-11.noarch.rpm                                                                                                                                                         |  15 kB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : epel-release-7-11.noarch                                                                                                                                                    1/2
  インストール中          : remi-release-7.9-1.el7.remi.noarch                                                                                                                                          2/2
  検証中                  : epel-release-7-11.noarch                                                                                                                                                    1/2
  検証中                  : remi-release-7.9-1.el7.remi.noarch                                                                                                                                          2/2

インストール:
  remi-release.noarch 0:7.9-1.el7.remi

依存性関連をインストールしました:
  epel-release.noarch 0:7-11

完了しました!
```

それでは、現在使用しているリポジトリを確認してみましょう。

```
$ yum repolist
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
epel/x86_64/metalink                                                                                                                                                                 | 9.5 kB  00:00:00
 * base: d36uatko69830t.cloudfront.net
 * epel: ftp.iij.ad.jp
 * extras: d36uatko69830t.cloudfront.net
 * remi-safe: ftp.riken.jp
 * updates: d36uatko69830t.cloudfront.net
epel                                                                                                                                                                                 | 4.7 kB  00:00:00
remi-safe                                                                                                                                                                            | 3.0 kB  00:00:00
(1/4): epel/x86_64/group_gz                                                                                                                                                          |  96 kB  00:00:00
(2/4): remi-safe/primary_db                                                                                                                                                          | 2.0 MB  00:00:00
epel/x86_64/updateinfo         FAILED
https://nrt.edge.kernel.org/fedora-buffet/epel/7/x86_64/repodata/f040f54116b01148f14d8321fada71bd850e9e667f48b4d949a884a1a2300b65-updateinfo.xml.bz2: [Errno 14] HTTPS Error 404 - Not FoundB  --:--:-- ETA
他のミラーを試します。
To address this issue please refer to the below wiki article

https://wiki.centos.org/yum-errors

If above article doesn't help to resolve this issue please use https://bugs.centos.org/.

(3/4): epel/x86_64/updateinfo                                                                                                                                                        | 1.0 MB  00:00:00
(4/4): epel/x86_64/primary_db                                                                                                                                                        | 6.9 MB  00:00:00
リポジトリー ID                                                               リポジトリー名                                                                                                          状態
base/7/x86_64                                                                 CentOS-7 - Base                                                                                                         10,072
epel/x86_64                                                                   Extra Packages for Enterprise Linux 7 - x86_64                                                                          13,625
extras/7/x86_64                                                               CentOS-7 - Extras                                                                                                          498
remi-safe                                                                     Safe Remi's RPM repository for Enterprise Linux 7 - x86_64                                                               4,470
updates/7/x86_64                                                              CentOS-7 - Updates                                                                                                       2,552
repolist: 31,217
```

使用できるリポジトリが増えていますね。この「Remi's RPM repository」はバージョンが新しいPHPを利用したい時に利用します。よって、php7.＊やphp8.＊などのパッケージがインストールできるようになりました。


```
$ yum list | grep php

（一部抜粋）
...
...
php74.x86_64                                1.0-3.el7.remi             remi-safe
php74-build.x86_64                          1.0-3.el7.remi             remi-safe
php74-php.x86_64                            7.4.22-1.el7.remi          remi-safe
php74-php-ast.x86_64                        1.0.14-1.el7.remi          remi-safe
php74-php-bcmath.x86_64                     7.4.22-1.el7.remi          remi-safe
php74-php-brotli.x86_64                     0.13.1-1.el7.remi          remi-safe
php74-php-cli.x86_64                        7.4.22-1.el7.remi          remi-safe
...
...
...
php80.x86_64                                1.0-3.el7.remi             remi-safe
php80-build.x86_64                          1.0-3.el7.remi             remi-safe
php80-php.x86_64                            8.0.9-1.el7.remi           remi-safe
php80-php-ast.x86_64                        1.0.14-1.el7.remi          remi-safe
php80-php-bcmath.x86_64                     8.0.9-1.el7.remi           remi-safe
php80-php-brotli.x86_64                     0.13.1-1.el7.remi          remi-safe
php80-php-cli.x86_64                        8.0.9-1.el7.remi           remi-safe
php80-php-common.x86_64                     8.0.9-1.el7.remi           remi-safe
php80-php-componere.x86_64                  3.1.2-1.el7.remi           remi-safe
...
...
...（続く）
```

php7.＊やphp8.＊などのパッケージが確認できます。このように、yumリポジトリにないパッケージも外部リポジトリを使用することによってインストールできるのです。

##おわりに
最後まで読んでいただきありがとうございます。今回の記事が少しでもyumやパッケージ管理の理解につながれば嬉しく思います。
Qiitaで初めての投稿でした。記事の作成は知識を整理しないと書けないので復習にもってこいですね。今後も定期的に記事を投稿していこうと思います。

##参考資料

- [【RPM入門】Linuxのパッケージ管理システム「RPM」とは？ \| UX MILK](https://uxmilk.jp/10240)
- [依存について](http://www.u-gakugei.ac.jp/~hokekan/d-izon0908.html)
- [yumコマンド一覧 \- Qiita](https://qiita.com/kazu56/items/3eeab8884f62be1cf3e6)
- [【yum list】パッケージ一覧を表示・確認する \| UX MILK](https://uxmilk.jp/9146)
- [外部レポジトリとは \-CentOSで用語として使われるレポジトリとはどうい\- UNIX・Linux \| 教えて\!goo](https://oshiete.goo.ne.jp/qa/7295395.html)
- [yumリポジトリ追加リスト 完全版 \- Qiita](https://qiita.com/bezeklik/items/9766003c19f9664602fe)