わからないなりに理解したい DNF

◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
【4/18開催】VSCode Dev Containersで楽々開発環境構築祭り〜Python/Reactなどなど〜
Visual Studio Codeの拡張機能であるDev Containersを使ってReactとかPythonとかSpring Bootとかの開発環境をラクチンで構築する方法を紹介するイベントです。
https://tech-lab.connpass.com/event/311864/

こんにちは。サイオステクノロジー OSS サポート担当 山本 です。

今回は前回お話ししたソフトウェアのインストールや管理をいい感じにしてくれる “パッケージ管理システム” の RPM…をより容易に使えるようにしてくれる DNF (Dandified YUM)を見ていきたいと思います。

■そもそもこれは何をするもの?

DNF は先述のとおり、パッケージ管理システムである RPM による管理などをよりいい感じにできるようにサポートしてくれるものです。
DNF 自体もまた、パッケージ管理システムの一つと扱われたりもします。

その性質上、DNF は RPM を使用しているシステム上でのみ使用されます。
類似するソフトウェアとしては、dpkg に対する apt や、DNF の前身である YUM などがあります。

DNF は RPM に関連する様々な機能…特にインストールに関する機能を提供しますが、そのメリットが最もわかりやすい例の一つとしてはパッケージのインストールでしょう。
例えばですが、RPM コマンドでパッケージファイルを使ってパッケージをインストールする場合、

 1. 何らかの手段 (該当パッケージファイルを探してダウンロードなど) でパッケージファイルを入手する
 2. RPM コマンドでインストールを試みる
  3-1-n. 依存性の解決に必要なパッケージを確認する
  3-2-n. 何らかの手段で依存性解決に必要なパッケージファイルを入手する
  3-3-n. 依存性解決に必要なパッケージのインストールを試みる
 4. インストール完了!

のような作業を全て手動でやっていくことになるかと思いますが、DNF ならコマンド一つでこの一連の操作を行なってくれます。

■DNF の基本的な使い方

ここからは、DNF の使用方法の一例を見ていきたいと思います。

今回の例では RedHat Enterprise Linux 9 を使用しますが、こちらは OS インストール時にデフォルトで DNF が使用可能な状態になっているはずです。
DNF を使用できる他の Linux のディストリビューションでも、基本的にはデフォルトで DNF が使用可能なハズです。

■パッケージのインストール:dnf install

DNF で RPM パッケージをインストールする場合は、以下のようなコマンドを実行します。
先述のとおり、RPM のパッケージファイルを事前に準備する必要などはありません

$ sudo dnf install <パッケージ名>

一例として、”postfix” というパッケージをインストールしたいなら以下のようになります。
見てのとおり、依存性の解決が必要な場合には自動的に必要なパッケージを探し出してまとめてインストールしてくれます。
インストール内容に問題がなければ、“y” を入力するとインストール処理が行われます。
インストールしたくない場合は “N” を入力します。

$ sudo dnf install postfix
   :
Dependencies resolved.
========================================================================================================================
 Package               Architecture         Version                      Repository                                Size
========================================================================================================================
Installing:
 postfix               x86_64               2:3.5.9-19.el9               rhel-9-appstream-rhui-rpms               1.5 M
Installing dependencies:
 libicu                x86_64               67.1-9.el9                   rhel-9-baseos-rhui-rpms                  9.6 M

Transaction Summary
========================================================================================================================
Install  2 Packages

Total download size: 11 M
Installed size: 37 M
Is this ok [y/N]:
■DNF はどこからパッケージファイルを持ってくるのか

このように DNF では事前に RPM のパッケージファイルを用意しておかなくてもパッケージをインストールしてくれますが、これは自動的にパッケージファイルを入手してインストールしてくれるだけであって、パッケージファイルが不要というわけではありません。

さて、では DNF が使用するパッケージファイルはどこから出てくるのでしょうか?
その答えは…大体想像はつくかと思いますが、ネットワーク上からです。

DNF を十全に利用するには、通常(※) “RPM のパッケージファイル置き場” と言える “リポジトリ” というページが必要になります。
また、当然ながら使用するリポジトリの URL へアクセス可能なネットワーク環境も必要になります。

使用するリポジトリの URL は、/etc/yum.repos.d (または /etc/dnf/dnf.conf) 内の “baseurl” “metalink” または “mirrorlist” のいずれかで指定します。

DNF は指定したリポジトリからのみパッケージファイルを取得するため、リポジトリに存在していないパッケージファイルのパッケージはインストールすることはできません(※)
他方、リポジトリからパッケージファイルを取得する都合上、DNF で使用するリポジトリは管理元・管理方針などを確認の上、信頼できると判断したもののみを使用するようにしてください。
前回お話ししたとおり、悪意あるスクリプトが含まれるパッケージファイルにより、様々な問題が発生しないとは言い切れないためです。

※ 予めパッケージファイルを用意しておけば、必ずしもリポジトリは必要というわけではありません。
事前に用意したパッケージファイルを使用する場合、”sudo dnf install <パッケージファイルのパス>” でインストール処理を行うことができます。

■パッケージのアップデート:dnf upgrade

インストール済みのパッケージをアップデートしたい場合は、以下のようなコマンドを実行します。

$ sudo dnf upgrade

上記コマンドでは、インストール済みの全てのパッケージを可能な限り最新のバージョンにアップデートしようとします。
以前にもお話ししたとおり、パッケージを最新の状態に保つのは脆弱性対策の観点において非常に重要であり、それをコマンド一つで一括で行うことができる “dnf upgrade” コマンドは非常に有用です。

$ sudo dnf upgrade
   :
Dependencies resolved.
========================================================================================================================
 Package                                   Arch      Version                        Repository                     Size
========================================================================================================================
Installing:
 kernel                                    x86_64    5.14.0-162.12.1.el9_1          rhel-9-baseos-rhui-rpms       1.9 M
 kernel-core                               x86_64    5.14.0-162.12.1.el9_1          rhel-9-baseos-rhui-rpms        46 M
 kernel-modules                            x86_64    5.14.0-162.12.1.el9_1          rhel-9-baseos-rhui-rpms        34 M
Upgrading:
 NetworkManager                            x86_64    1:1.40.0-1.el9                 rhel-9-baseos-rhui-rpms       2.2 M
 NetworkManager-cloud-setup                x86_64    1:1.40.0-1.el9                 rhel-9-appstream-rhui-rpms     71 k
   :

アップデートがあるかの確認だけをまず行いたい場合は、”check-update” を使うこともできます。

$ sudo dnf check-update

他方、パッケージ名を指定することで指定したパッケージのみをアップデートしたり、
パッケージ名とバージョン番号を合わせて指定することで、指定したバージョンへアップデートを行うことも可能です。

$ sudo dnf upgrade <パッケージ名 (+バージョン)>

 (インストール済みのものより古いバージョンに変更したい場合は以下。※ ダウングレードは一般的に非推奨です)
$ sudo dnf downgrade <パッケージ名 + バージョン)>
$ sudo dnf upgrade kernel-5.14.0-162.12.1.el9_1
   :
Dependencies resolved.
========================================================================================================================
 Package                   Architecture      Version                           Repository                          Size
========================================================================================================================
Installing:
 kernel                    x86_64            5.14.0-162.12.1.el9_1             rhel-9-baseos-rhui-rpms            1.9 M
 kernel-core               x86_64            5.14.0-162.12.1.el9_1             rhel-9-baseos-rhui-rpms             46 M
 kernel-modules            x86_64            5.14.0-162.12.1.el9_1             rhel-9-baseos-rhui-rpms             34 M

Transaction Summary
========================================================================================================================   :

■パッケージファイルのダウンロード:dnf download

何らかの理由でパッケージファイルのダウンロードのみを行いたい場合、以下のようなコマンドを使用できます。

$ sudo dnf download <パッケージ名 (+バージョン)>

(このコマンドに限らずですが)バージョンを指定しない場合、原則としてそのパッケージで利用可能な最新版が対象になります。

■特定の要素が含まれるパッケージの確認:dnf provides

$ sudo dnf provides <確認したい要素>

上記のようなコマンドで、インストール済みパッケージまたはリポジトリ上から指定した要素に関連するパッケージを探すことができます。
指定できるのは例えばコマンドファイル・ディレクトリ、依存性の名前などがあります。

$ sudo dnf provides cd
   :
bash-5.1.8-4.el9.x86_64 : The GNU Bourne Again shell
Repo        : @System
Matched from:
Filename    : /usr/bin/cd

bash-5.1.8-4.el9.x86_64 : The GNU Bourne Again shell
Repo        : rhel-9-baseos-rhui-rpms
Matched from:
Filename    : /usr/bin/cd

bash-5.1.8-5.el9.x86_64 : The GNU Bourne Again shell
Repo        : rhel-9-baseos-rhui-rpms
Matched from:
Filename    : /usr/bin/cd

bash-5.1.8-6.el9_1.x86_64 : The GNU Bourne Again shell
Repo        : rhel-9-baseos-rhui-rpms
Matched from:
Filename    : /usr/bin/cd

[ec2-user@ip-172-31-8-243 ~]$ sudo dnf provides "libicuuc.so.67()(64bit)"
   :
libicu-67.1-9.el9.x86_64 : International Components for Unicode - libraries
Repo        : rhel-9-baseos-rhui-rpms
Matched from:
Provide    : libicuuc.so.67()(64bit)

$

■パッケージの更新履歴:dnf history

$ sudo dnf history

上記コマンドにより、DNF を使って行なったインストール・アップデートなどの履歴を表示することができます。

$ sudo dnf history
   :
ID     | Command line                                                      | Date and time    | Action(s)      | Altered
------------------------------------------------------------------------------------------------------------------------
     1 | install postfix                                                   | 2023-02-06 05:37 | Install        |    2

この更新履歴は更に、”dnf history info” や “dnf history rollback” など更新履歴を介した操作に使うことができます。

■最後に

今回は DNF について見てきました。
ここで紹介したコマンドはごく一部ですが、主に RPM のパッケージのインストールに関わる部分を強力にサポートしてくれるものであることはなんとなく感じてもらえるかと思います。

DNF でインストールするパッケージは RPM のパッケージであるため、DNF でインストールしたパッケージも前回お話しした RPM コマンドで操作・確認することができます。
そう頻繁にパッケージを操作することはあまりないかもしれませんが、前回の RPM も合わせて実はかなり様々な操作や情報確認ができるんだ、ということは頭の片隅に置いておくと何かの役に立つかもしれません。
特に、”dnf upgrade” コマンドは定期的に実行しておきたいですね。

(他の回)
わからないなりに理解したい RPM

アバター画像
About 山本 53 Articles
元サーバサイドエンジニアのサポートエンジニア。「物事は理解できれば活路が見出せる可能性がある」という信条のもと、今日も石橋を叩く。
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる