有償のLinuxディストリであるRedHatをはじめとするRedHat系のディストリでは、長らくyumというパッケージマネージャーが使用されてきました。(debian、Ubuntuで言うaptにあたるもの)
ところが、このyumというパッケージマネージャーは以前から様々な問題が指摘されており、yumの改良版であるdnf(Dandified Yum)への移行が進められていました。
無料のサーバー用ディストリとして人気のCentOSでも、CentOS 8からついにこのdnfがyumの代わりとして正式に実装され、デフォルトのパッケージマネージャーとなっています。
さて、このdnfですが、yumにはなかった新たな概念が実装されています。
その一つが”module”という仕組みです。
moduleは、従来のリポジトリをさらに細分化する仕組みです。
例えば、CentOS7の時、特定のバージョンのphpをインストールする際にremiリポジトリをよく使用しますが、例えばphp7.4のphp周りのパッケージを指定してインストールする場合、
sudo yum install --enablerepo=remi,remi-php74 php
のように、リポジトリを切り替えることで対応せざるを得ない状況でした。
しかしこの場合、enablerepoの表記を忘れてphpをインストールしてしまうと、デフォルトのリポジトリから古いバージョンのパッケージがインストールされてしまったり、最悪、パッケージの依存関係の不整合を引き起こしてしまう可能性があったりなど問題がありました。
dnf moduleではリポジトリの中で複数のStreamとしてパッケージの依存関係を細分化しておくことで、同じリポジトリを参照していても、用意されているStreamの中から希望するStreamを指定することで好きなバージョンのパッケージをインストールすることができます。
パッケージ”php”で、各リポジトリで利用できるモジュール一覧を確認する場合は、次のコマンドを実行します。
dnf module list php
#情報を閲覧するだけならroot権限がなくてもいけるっぽい?
自分の環境で実行すると、下記のようになりました。
$ dnf module list php
メタデータの期限切れの最終確認: 0:03:40 時間前の 2020年11月17日 10時47分49秒 に実施しました。
CentOS-8 - AppStream
Name Stream Profiles Summary
php 7.2 [d] common [d], devel, minimal PHP scripting language
php 7.3 common [d], devel, minimal PHP scripting language
Remi's Modular repository for Enterprise Linux 8 - x86_64
Name Stream Profiles Summary
php remi-7.2 common [d], devel, minimal PHP scripting language
php remi-7.3 common [d], devel, minimal PHP scripting language
php remi-7.4 [e] common [d] [i], devel, minimal PHP scripting language
php remi-8.0 common [d], devel, minimal PHP scripting language
ヒント: [d]efault, [e]nabled, [x]disabled, [i]nstalled
この一覧に存在するバージョンであれば、Streamを切り替えることで好きなバージョンをインストールできます。
コマンドの書式は下記のとおりです。
sudo dnf module install module名:Stream名
例えば、remiリポジトリのphp8.0をインストールしたい、という場合は
sudo dnf module install php:remi-8.0
のようにすることで、php8.0周りのパッケージを依存関係込みでインストールできます。
さらに、Streamの中でも”Profiles”という単位で細分化が行われています。
Streamは主にバージョン選択で分かれているのに対し、Profilesは用途で分けられています。
例として、mariadbのモジュール一覧を見てみます。
$ dnf module list mariadb
メタデータの期限切れの最終確認: 0:20:32 時間前の 2020年11月17日 10時47分49秒 に実施しました。
CentOS-8 - AppStream
Name Stream Profiles Summary
mariadb 10.3 [d][e] client [i], galera, server [d] MariaDB Module
ヒント: [d]efault, [e]nabled, [x]disabled, [i]nstalled
Profiles欄を確認すると、”client”と”galera”、”server”の2種類が存在しています。
mariadbの場合、clientを選択するとmysqlのクライアントの動作のみに必要なパッケージがインストールされ、serverを選択すれば、従来通りmysqlサーバーとクライアントの両方がインストールされるようです。
プロファイルを選択する場合は、
sudo dnf module install module名:Stream名/Profiles名
のように指定します。(Stream名は省略すればデフォルトのものがインストールされるようです。)
今回は例としてmariadbクライアントだけをインストールするように指定してみます。
$ sudo dnf module install mariadb/client
メタデータの期限切れの最終確認: 2:19:03 時間前の 2020年11月17日 08時47分06秒 に実施しました。
依存関係が解決しました。
==============================================================================================================================
パッケージ Arch バージョン リポジトリー サイズ
==============================================================================================================================
group/module パッケージをインストール中:
mariadb x86_64 3:10.3.17-1.module_el8.1.0+257+48736ea6 AppStream 6.1 M
依存関係のインストール中:
mariadb-common x86_64 3:10.3.17-1.module_el8.1.0+257+48736ea6 AppStream 62 k
mariadb-connector-c x86_64 3.0.7-1.el8 AppStream 148 k
mariadb-connector-c-config noarch 3.0.7-1.el8 AppStream 13 k
モジュールプロファイルのインストール中:
mariadb/client
モジュールストリームの有効化中:
mariadb 10.3
トランザクションの概要
==============================================================================================================================
インストール 4 パッケージ
ダウンロードサイズの合計: 6.3 M
インストール済みのサイズ: 40 M
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
(1/4): mariadb-common-10.3.17-1.module_el8.1.0+257+48736ea6.x86_64.rpm 605 kB/s | 62 kB 00:00
(2/4): mariadb-connector-c-3.0.7-1.el8.x86_64.rpm 1.1 MB/s | 148 kB 00:00
(3/4): mariadb-connector-c-config-3.0.7-1.el8.noarch.rpm 373 kB/s | 13 kB 00:00
(4/4): mariadb-10.3.17-1.module_el8.1.0+257+48736ea6.x86_64.rpm 17 MB/s | 6.1 MB 00:00
------------------------------------------------------------------------------------------------------------------------------
合計 5.4 MB/s | 6.3 MB 00:01
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
scriptlet の実行中: mariadb-connector-c-3.0.7-1.el8.x86_64 1/1
準備 : 1/1
インストール中 : mariadb-connector-c-config-3.0.7-1.el8.noarch 1/4
インストール中 : mariadb-common-3:10.3.17-1.module_el8.1.0+257+48736ea6.x86_64 2/4
インストール中 : mariadb-connector-c-3.0.7-1.el8.x86_64 3/4
インストール中 : mariadb-3:10.3.17-1.module_el8.1.0+257+48736ea6.x86_64 4/4
scriptlet の実行中: mariadb-3:10.3.17-1.module_el8.1.0+257+48736ea6.x86_64 4/4
検証 : mariadb-3:10.3.17-1.module_el8.1.0+257+48736ea6.x86_64 1/4
検証 : mariadb-common-3:10.3.17-1.module_el8.1.0+257+48736ea6.x86_64 2/4
検証 : mariadb-connector-c-3.0.7-1.el8.x86_64 3/4
検証 : mariadb-connector-c-config-3.0.7-1.el8.noarch 4/4
インストール済み:
mariadb-3:10.3.17-1.module_el8.1.0+257+48736ea6.x86_64 mariadb-common-3:10.3.17-1.module_el8.1.0+257+48736ea6.x86_64
mariadb-connector-c-3.0.7-1.el8.x86_64 mariadb-connector-c-config-3.0.7-1.el8.noarch
完了しました!
最後に出力される、今回インストールされたパッケージ一覧を見ると、mariadb-serverが含まれていないことからちゃんとmariadbサーバー周りのパッケージは除外されていることがわかります。
dnfのmodule機能をうまく使いこなせれば、今まで悩まされてきたパッケージのバージョン管理がより楽になりそうですね。
CentOS8やその他RHEL8に対応したディストリを触られている方は、是非試してみてください。
参考:
RHEL 8 あるいは Fedora 28 のモジュールについて – von Ewigkeit
dnf コマンドでパッケージとモジュールを混在させてみて、両者の挙動について迫った。 – Qiita