【Linux】パッケージ管理①(rpm)

# パッケージとは
ソフトウェアを利用する際に必要となる`プログラム・ライブラリ・設定ファイル・ドキュメント`等のセットを`パッケージ`と言います。

依存関係・競合関係の確認やパッケージの取得等を管理する仕組みは、`パッケージ管理`と言います。

`依存関係`は、パッケージAを動作させる為には、パッケージBが必要になるという関係性を指します。絵を描く為に紙(パッケージA)を用意したけど、ペン(パッケージB)も必要みたいな感じです。

`競合関係`は、別のパッケージでインストールされているファイルを含むパッケージのインストールを行った場合、すでにインストールされているファイルと競合する場合の関係値を指します。

このパッケージ管理を行う際には、`rpm`コマンドと`yum`コマンドを利用します。※自分は、`rpm`コマンドはあまり使わないです。パッケージ用意したりするのが、面倒です。。`rpm -qa`コマンドでパッケージ一覧用意して、どこかに転記する位でしか使った事がないです。

# rpmコマンド
rpmパッケージの管理を行えるコマンドです。
`yum`とか`dnf`があるので、`rpm`コマンドを使った事はあまりないです。(バージョンを事細かに指定する必要があれば、使うかもしれないですが、、)

ただせっかく勉強しているので、軽く動作検証をしたいと思います。

試しに、`httpd`をインストールしてみます。
インストールは、`-i`オプションを利用して行えるようです。また、`-v`で詳細情報及び`-h`で進行状況を確認出来るようです。

いざ、実行します。
実行してみると、ファイルがないよと怒られました。

```shell_session:httpインストール失敗
[root@localhost ~]# rpm -ivh httpd-2.4.6-98.el7.centos.7.x86_64.rpm
エラー: httpd-2.4.6-98.el7.centos.7.x86_64.rpm のオープンに失敗: そのようなファイルやディレクトリはありません
```

はい、、これはシンプルにパッケージがローカルに用意されていなかった事が原因です。
パッケージを用意します。Webから取得してもよいのですが、依存関係にあるパッケージが多いと嫌なので、`yumdownloader`を使用します。

下記コマンドで、`yum-utils パッケージ`をインストールすると使用出来ます。

```shell_session:yum-utils インストール
[root@localhost ~]# yum install yum-utils
```

パッケージを取得したいと思います。
`--resolve オプション`を使用する事で、依存関係を考慮してダウンロードしてくれます。
`httpd`と`httpd-tools`がダウンロードされました。

```shell_session:パッケージダウンロード
[root@localhost ~]# yumdownloader --resolve httpd
[root@localhost ~]# ll
合計 2880
-rw-r--r-- 1 root root 2849180  4月  6 02:37 httpd-2.4.6-98.el7.centos.7.x86_64.rpm
-rw-r--r-- 1 root root   96652  4月  6 02:37 httpd-tools-2.4.6-98.el7.centos.7.x86_64.rpm
```

パッケージ取得後に`httpd`でインストールを実行したところ、今度は`依存性の欠如`で怒られました。
`httpd-tools-2.4.6-98.el7.centos.7`が必要みたいです。なので、先に`httpd-tools`をインストールしてから、`httpd`をインストールします。

```shell_session:依存性の欠如
[root@localhost ~]# rpm -i httpd-2.4.6-98.el7.centos.7.x86_64.rpm
エラー: 依存性の欠如:
        httpd-tools = 2.4.6-98.el7.centos.7 は httpd-2.4.6-98.el7.centos.7.x86_64 に必要とされています

# httpd-toolsをインストール
[root@localhost ~]# rpm -ivh httpd-tools-2.4.6-98.el7.centos.7.x86_64.rpm
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:httpd-tools-2.4.6-98.el7.centos.7################################# [100%]

# httpdをインストール
[root@localhost ~]# rpm -ivh httpd-2.4.6-98.el7.centos.7.x86_64.rpm
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:httpd-2.4.6-98.el7.centos.7      ################################# [100%]
```

`httpd`がインストールされている事を確認しようと思います。
`-q`オプションでパッケージに関しての情報を調べる事が出来ます。単体で使用した場合は、導入したパッケージ名が表示されます。
コマンドを実行したところ、無事にインストールされている事を確認出来ました。


```shell_session:インストールされている事を確認
[root@localhost ~]# rpm -q httpd httpd-tools
httpd-2.4.6-98.el7.centos.7.x86_64
httpd-tools-2.4.6-98.el7.centos.7.x86_64
```

インストールが実行出来た事を確認したので、`httpd`はアンインストールしたいと思います。
`-e`オプションでアンインストール出来ます。

ちなみに、アンインストールする際も依存関係の確認を行っているようです。`httpd`が`httpd-tools`を必要としているので、先に`httpd`からアンインストール → `httpd-tools`をアンインストールします。

```shell_session:アンインストール
[root@localhost ~]# rpm -qa | grep "httpd"
httpd-2.4.6-98.el7.centos.7.x86_64
httpd-tools-2.4.6-98.el7.centos.7.x86_64

# 依存関係でアンインストールがこける。
[root@localhost ~]# rpm -evh httpd-tools-2.4.6-98.el7.centos.7.x86_64
エラー: 依存性の欠如:
        httpd-tools = 2.4.6-98.el7.centos.7 は (インストール済み)httpd-2.4.6-98.el7.centos.7.x86_64 に必要とされています

# httpd → httpd-tools の順番でアンインストール
[root@localhost ~]# rpm -evh httpd-2.4.6-98.el7.centos.7.x86_64
準備しています...              ################################# [100%]
整理中 / 削除中...
   1:httpd-2.4.6-98.el7.centos.7      ################################# [100%]
[root@localhost ~]# rpm -evh httpd-tools-2.4.6-98.el7.centos.7.x86_64
準備しています...              ################################# [100%]
整理中 / 削除中...
   1:httpd-tools-2.4.6-98.el7.centos.7################################# [100%]
[root@localhost ~]# rpm -qa | grep "httpd"
```

順番が前後してしまうのですが、アップグレードも軽く検証してみようと思います。
`-U`オプションで実施する事が出来ます。バージョンが古いファイルもダウンロードしてきました。

```shell_session:アップグレード
# 古いバージョンのパッケージを探して、取得する。
[root@localhost ~]# yum list --showduplicates | grep "httpd"
[root@localhost ~]# yumdownloader --resolve httpd-2.4.6-95.el7.centos
[root@localhost ~]# ll
合計 5756
-rw-r--r-- 1 root root 2846172 10月 15  2020 httpd-2.4.6-95.el7.centos.x86_64.rpm
-rw-r--r-- 1 root root 2849180  4月  6 02:37 httpd-2.4.6-98.el7.centos.7.x86_64.rpm
-rw-r--r-- 1 root root   95136 10月 15  2020 httpd-tools-2.4.6-95.el7.centos.x86_64.rpm
-rw-r--r-- 1 root root   96652  4月  6 02:37 httpd-tools-2.4.6-98.el7.centos.7.x86_64.rpm

# 古いバージョンでインストールする。
[root@localhost ~]# rpm -ivh httpd-2.4.6-95.el7.centos.x86_64.rpm httpd-tools-2.4.6-95.el7.centos.x86_64.rpm
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:httpd-tools-2.4.6-95.el7.centos  ################################# [ 50%]
   2:httpd-2.4.6-95.el7.centos        ################################# [100%]
[root@localhost ~]# rpm -qa | grep "httpd"
httpd-tools-2.4.6-95.el7.centos.x86_64
httpd-2.4.6-95.el7.centos.x86_64

# 新しいバージョンにアップグレード
[root@localhost ~]# rpm -Uvh httpd-2.4.6-98.el7.centos.7.x86_64.rpm httpd-tools-2.4.6-98.el7.centos.7.x86_64.rpm
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:httpd-tools-2.4.6-98.el7.centos.7################################# [ 25%]
   2:httpd-2.4.6-98.el7.centos.7      ################################# [ 50%]
整理中 / 削除中...
   3:httpd-2.4.6-95.el7.centos        ################################# [ 75%]
   4:httpd-tools-2.4.6-95.el7.centos  ################################# [100%]
[root@localhost ~]# rpm -qa | grep "httpd"
httpd-tools-2.4.6-98.el7.centos.7.x86_64
httpd-2.4.6-98.el7.centos.7.x86_64

```

無事アップグレード出来た事を確認致しました。
`rpm`コマンドの検証はこれで終了とします。

よく使いそうなオプションだけ、下記表にまとめておきます。
一番よく使う場面は、`-qa`でインストール済みのパッケージ見る時です。

|パッケージのインストール・アップグレード・削除|説明|
|---|---|
|-i(--install)|パッケージをインストール|
|-U(--upgrade})|パッケージをアップグレード|
|-e(--erase)|パッケージをアンインストール|
|-v|詳細情報を表示|
|-h|進行状況を表示|

|パッケージの検索と検査(-qオプションと組み合わせて使用)|説明|
|---|---|
|-q(--query)|単体で使用した場合は、引数に指定したパッケージが存在する場合に導入しているパッケージを表示|
|-a(--all)|インストールされているすべてのパッケージを表示|
|-i(--info)|パッケージの詳細情報を表示|
|-f(--file)|ファイルを所有するパッケージを表示|
|-l(--list)|パッケージ内にあるすべてのファイルを表示|

## お次
次回はyumについて、検証します。