CentOSでの依存関係解決 - yumとdnfを使ったrpmパッケージ管理（基本編）


# yumとdnf

CentOSでは、yumとdnfを使用してrpmパッケージの依存関係を解決します。

## YUMについて

YUM（Yellowdog Update Modifier）は、rpmのフロントエンドプログラムであり、ソフトウェアパッケージの依存関係を解決できます。複数のリポジトリ間でパッケージを特定でき、up2dateの代替ツールとして機能します。

CentOS 8ではyumの代わりにdnfが導入されましたが、yumとの互換性が保たれており、設定も共通しています。

```shell
[root@loaclhost ~]$ll /usr/bin/yum 
lrwxrwxrwx. 1 root root 5 Mar 24 17:08 /usr/bin/yum -> dnf-3
```

## 1.1 yum/dnfの動作原理

yum/dnfはC/Sモデルに基づいています。
- yumサーバーにはrpmパッケージと関連パッケージのメタデータベースが保存されています。
- yumクライアントはyumサーバーにアクセスし、インストールやクエリなどを行います。

### yumの実装プロセス

まず、yumサーバー上にyumリポジトリ（倉庫）を作成します。この倉庫には多くのrpmパッケージと、パッケージに関連するメタデータファイル（特定のディレクトリrepodataに配置）が事前に格納されています。yumクライアントがyum/dnfツールを利用してパッケージをインストールする際、repodataのメタデータを自動でダウンロードし、関連パッケージおよび依存関係が存在するかを確認します。そして、倉庫から関連パッケージを自動で見つけてダウンロードし、インストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515709/acd180bf-a4e3-d5e0-c232-75ca0decc3c5.png)


### 新しいリポジトリを作成する場合

yum install xxxやyum update xxxを使用すると、まずリポジトリに接続できるかを確認します。接続できればリポジトリ内のrepodataをダウンロードします（新しいリポジトリでない場合は、既存のローカルrepodataを直接参照）。次に、repodata内にxxxパッケージがあるかどうかを問い合わせます。パッケージが存在する場合、リポジトリのサーバーからxxx.rpm（依存関係を含む）をダウンロードし、インストールを開始します。インストールが完了したらパッケージ情報を削除します。


## 1.2 yumクライアントの設定

### yumクライアントの設定ファイル

- `/etc/yum.conf`: すべてのリポジトリに共通の設定を提供します。
- `/etc/yum.repos.d/*.repo`: 各リポジトリに個別の設定ファイルを提供します。

### ヘルプの取得

```shell
[root@rocky86 ~]# man 5 yum.conf
```

### 共通設定

```shell
[root@rocky86 ~]# ll /etc/yum.conf 
lrwxrwxrwx. 1 root root 12 Mar 24 17:08 /etc/yum.conf -> dnf/dnf.conf
[root@rocky86 ~]# cat /etc/yum.conf 
[main]
gpgcheck=1 # インストールパッケージの合法性と完全性を検証する
installonly_limit=3 # 同時にインストールできるパッケージ数の上限、最小値は2。0または1に設定すると無制限
clean_requirements_on_remove=True # パッケージ削除時に使用されなくなった依存パッケージも削除
best=True # アップグレード時に最新バージョンを自動的に選択
skip_if_unavailable=False # 利用不可の場合はスキップ
```

### リポジトリ設定ファイルの指示

```shell
[repositoryID]
name=Some name for this repository # リポジトリの名前
baseurl=url://path/to/repository/ # リポジトリのURL
mirrorlist=http://list/ # 複数のbaseurlを指すリスト
enabled={1|0} # 有効化するかどうか、デフォルトは1
gpgcheck={1|0} # パッケージの検証を行うかどうか、デフォルトは1
gpgkey={URL|file://FILENAME} # 検証キーのURLまたはファイルパス
enablegroups={1|0} # yum groupを有効にするかどうか、デフォルトは1
failovermethod={roundrobin|priority} # 複数のbaseurlへのアクセス方法、roundrobinはランダム、priorityは順番
cost=1000 # 優先度を決定するコスト、デフォルトは1000
```

### baseurlの書き方

baseurlは複数の書き方とプロトコルをサポートします。
注意：yumリポジトリのパスは必ずrepodataディレクトリを指す必要があります。

```shell
baseurl=file:///cdrom/AppStream/
baseurl=https://mirrors.aliyun.com/rockylinux/8.6/AppStream/x86_64/os/
baseurl=http://mirrors.aliyun.com/rockylinux/8.6/AppStream/x86_64/os/
baseurl=ftp://10.0.0.159/
```

### よく使われる変数

- `$arch`: CPUアーキテクチャ（例：aarch64, i586, i686, x86_64）
- `$basearch`: 基本アーキテクチャ（例：i386, x86_64）
- `$releasever`: システムバージョン

変数を使用した例：

```shell
mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=$basearch&repo=BaseOS-$releasever
```

変数が置き換えられた後の例：

```shell
mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=x86_64&repo=BaseOS-8
```

### yum管理ツールの確認

```shell
yum-config-manager
[root@rocky86 yum.repos.d]# rpm -qf `which yum-config-manager`
yum-utils-4.0.21-11.el8.noarch
```

### よく使われるオプション

- `--add-repo=URL`: リポジトリを追加
- `--disable repoid`: リポジトリを無効化
- `--enable repoid`: リポジトリを有効化

### 使用例

リポジトリの追加：

```shell
[root@rocky86 ~]# yum-config-manager --add-repo=https://mirrors.nju.edu.cn/epel/8/Everything/x86_64/
Adding repo from: https://mirrors.nju.edu.cn/epel/8/Everything/x86_64/
```

リポジトリの確認：

```shell
[root@rocky86 yum.repos.d]# cat mirrors.nju.edu.cn_epel_8_Everything_x86_64_.repo 
[mirrors.nju.edu.cn_epel_8_Everything_x86_64_]
name=created by dnf config-manager from 
https://mirrors.nju.edu.cn/epel/8/Everything/x86_64/
baseurl=https://mirrors.nju.edu.cn/epel/8/Everything/x86_64/
enabled=1
```

リポジトリの無効化：

```shell
[root@rocky86 yum.repos.d]# yum-config-manager --disable mirrors.nju.edu.cn_epel_8_Everything_x86_64_
```

リポジトリの有効化：

```shell
[root@rocky86 yum.repos.d]# yum-config-manager --enable mirrors.nju.edu.cn_epel_8_Everything_x86_64_
```