浜松のWEBシステム開発・スマートフォンアプリ開発・RTK-GNSS関連の開発はお任せください
株式会社シーポイントラボ
TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:静岡県浜松市中区富塚町1933-1 佐鳴湖パークタウンサウス2F

CentOS8から採用されたdnf(Dandified Yum)のmoduleがかなり便利かもしれない話

有償の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

  • この記事いいね! (0)