🔥

dnfとパッケージについてまとめてみた

2025/03/11に公開

はじめに

Amazon Linux2023のEC2インスタンスのサーバ運用・保守を実施している際に、パッケージ管理システムであるdnfを利用するため個人用メモとしてまとめます。

パッケージとは

パッケージとは、ソフトウェアをインストールするために必用なファイルである。
Linuxではソフトウェアをパッケージという単位で配布・管理する。
パッケージファイルには以下のように構成されている。

構成要素 説明
プログラム本体 コンパイル済みの実行ファイル、直接実行可能なバイナリファイル
ライブラリ プログラムが動作するために必要となる再利用可能な共通機能
設定ファイル 設定内容が記載されたテキストファイル、インストールスクリプト
ドキュメント READMEなどのパッケージに関する情報
メタデータ パッケージ名、バージョン、依存関係などの情報

上記のパッケージはディストリビューションごとによってパッケージ管理システムが異なる。
大きくはDebianとRPMごとによって異なる。

ディストリビューションごとのパッケージ管理システム

パッケージ方式 説明 パッケージの拡張子 管理ツール
Debian方式 Debian GNU/Linuxなどで採用されている .deb dpkg, apt
RPM方式 RedHat Enterprise Linuxなどで採用されている .rpm rpm, yum, dnf

パッケージ依存の関係

パッケージ管理によりソフトウェアのインストール、削除、依存関係のチェックの管理が容易になる。
パッケージAにはBが必用、パッケージBにはCが必用。つまり、間接的にパッケージAを実行するためには、Cが必用となる。このような依存関係における複雑性をパッケージ管理の仕組みが解決してくれる。

パッケージ管理システム

上記のパッケージを管理するためにLinuxではパッケージ管理システムがある。
パッケージ管理システムでは以下のような要素が含まれている。

要素 説明
パッケージ管理ツール パッケージを操作するためのツール。Debian系ではapt、RedHat系ならyumdnfなど。
リポジトリ パッケージを提供・保管している場所。インターネットのリポジトリからパッケージをインストールする場合を外部リポジトリ、社内サーバ上のリポジトリからインストールする場合は内部リポジトリを利用する

リポジトリとは

リポジトリとは各種パッケージを保存しておくためのサーバ(保管庫) です。
インターネット上のリポジトリを外部リポジトリ、社内ネットワーク上のリポジトリを内部リポジトリという。
外部リポジトリには以下のようなものがあり、大きくは公式リポジトリとサードパーティリポジトリに分けられる。

名称 説明
BaseOS RHELの基本的なOS機能を提供する公式リポジトリ。コアパッケージに含まれる
Docker Dockerの公式サードパーティリポジトリ。Dockerエンジンやコンテナ関連のツールを提供

基本的なパッケージは公式リポジトリから取得可能だが、Dockerなどのようにサードパーティリポジトリから取得しなければならない場合もある。

公式リポジトリに対象のパッケージが含まれていない場合

RedHatの公式リポジトリに目的のパッケージが含まれていない場合、サードパーティリポジトリからパッケージを取得する。
サードパーティリポジトリからパッケージを取得する場合、以下のような手順が必要となる。

# サードパーティリポジトリを追加し、メタデータをキャッシュに保存する
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
dnf makecache

# パッケージをインストールする
dnf install docker-ce

リポジトリとGPG

GPG(GNU Privacy Guard)は、リポジトリからダウンロードしたパッケージの信頼性と整合性を保証するための暗号化技術。デジタル署名を用いて、以下の要素を確認する。

  • 信頼性の保証
  • 整合性の確認
  • セキュリティの強化

通常、リポジトリを設定する際には、GPG公開鍵も同時にインポートしてパッケージの署名を検証する。
署名に問題がある場合、パッケージのインストールは中断され、警告メッセージが表示される。
GPGの設定は、各リポジトリの設定ファイルである/etc/dnf.repos.d/*.repo内で次のように定義される。

  • gpgcheck
    • GPG署名の検証を有効化・無効化にするかの設定
  • gpgkey
    • 使用する公開鍵のURLまたはファイル名を指定する

dnfについて

RedHat系のパッケージ管理ツールは現在はdnfが一般的になります。

dnfコマンド

コマンド 意味
dnf install パッケージをインストールする
dnf update インストール済みのパッケージをアップデートする
dnf upgrade インストール済みのパッケージをアップデートし、旧パッケージを自動削除する
dnf remove インストール済みのパッケージを削除する
dnf reinstall インストール済みのパッケージを再インストールする
dnf downgrade パッケージをダウングレードする
dnf check-update 現在のリポジトリバージョンでアップデート可能なパッケージを表示する
dnf list installed インストール済みのパッケージの一覧を表示する
dnf info パッケージの詳細情報を表示する
dnf repository --requires パッケージの依存関係を表示する
dnf search パッケージを検索する
dnf repolist リポジトリの一覧を表示する
dnf repolist enabled 有効になっているリポジトリの一覧を表示する
dnf config-manager --add-repo リポジトリURLを追加する
dnf config-manager --set-enabled 指定したリポジトリを恒久的に有効にする
dnf config-manager --set-disabled 指定したリポジトリを恒久的に無効にする
dnf --version dnfのバージョンを表示する

dnfに関する設定ファイル

主に以下の設定ファイルがある。

ファイル名 説明
/etc/dnf/dnf.conf メインの設定ファイル、リポジトリやキャッシュ、GPGチェックの設定など基本的な設定
/etc/yum.repos.d/*.repo リポジトリ情報が記載されているファイル群、リポジトリ事に個別の.repoファイルがある
/etc/dnf/vars/* 変数の定義ファイル、releaseverやbasearchなどの変数が定義
/var/log/dnf.log パッケージインストールやアップデートのログが保存されているファイル
/var/cache/dnf/* パッケージのキャッシュやメタデータが保存されているディレクトリ

dnfを用いたパッケージ更新・確認方法

Amazon Linux2023ではパッケージを最新バージョンに更新したいとき、注意点がある。

# パッケージの更新
$ dnf update
Last metadata expiration check: 4:50:00 ago on Mon Jan 20 01:25:32 2025.
=================================================================
WARNING:
  A newer release of "Amazon Linux" is available.

  Available Versions:

  Version 2023.6.20250115:
    Run the following command to upgrade to 2023.6.20250115:

      dnf upgrade --releasever=2023.6.20250115

    Release notes:
     https://docs.aws.amazon.com/linux/al2023/release-notes/relnotes-2023.6.20250115.html

===================================================================
Dependencies resolved.
Nothing to do.
Complete!

一見、パッケージの更新は無かったように見えるが、WARNINGで表示されている内容を注目する必要がある。
これは、「最新のリポジトリバージョンがあるから指定すれば更新できるよ」という内容である。

そのため、dnfにおいてパッケージをアップデートする際、以下のようにリポジトリのバージョンを指定すればアップデートすることができる。

dnf update --releasever=2023.6.20241010

上記の--releaseverという引数にリポジトリのバージョンを指定すれば、リポジトリから提供されているパッケージのバージョンにアップデートできる。
そもそも更新可能なリポジトリのバージョンの確認は下記のコマンドから実施できる。

# 更新可能なリポジトリバージョンを検出
$ dnf check-release-update
WARNING:
  A newer release of "Amazon Linux" is available.

  Available Versions:

  Version 2023.6.20250115:
    Run the following command to upgrade to 2023.6.20250115:

      dnf upgrade --releasever=2023.6.20250115

    Release notes:
     https://docs.aws.amazon.com/linux/al2023/release-notes/relnotes-2023.6.20250115.html

上記のコマンドを実行することで、更新可能なリポジトリのバージョンが「2023.6.20250115」であることがわかる。
また、dnf check-update --releasever=リポジトリバージョンを実行することで、指定したリポジトリバージョンで更新可能なパッケージの一覧を表示することができる。

$ dnf check-update --releasever=2023.6.20250115

amazon-linux-repo-s3.noarch  2023.6.20250115-0.amzn2023  amazonlinux
amazon-rpm-config.noarch     228-4.amzn2023.0.1          amazonlinux
amazon-ssm-agent.x86_64      3.3.987.0-1.amzn2023        amazonlinux
# 省略

上記でアップデート可能なパッケージをdnf update パッケージ名 --releasever=リポジトリバージョンで実行することでアップデートすることができる。

なお、リポジトリバージョンの追加とは、即ちAMIの追加である。リポジトリバージョンが追加されたことを通知したい場合は、以下のAWS公式ドキュメントに従ってAMIの追加をAmazon SNSで受け取る。

https://docs.aws.amazon.com/ja_jp/linux/al2023/ug/receive-update-notification.html

dnfで実行したインストールやアップデートした履歴を確認する

上記で実行したパッケージのアップデートの内容をdnf historyというコマンドで実行履歴を確認する。

$ dnf history

ID     | Command line                                                                                                                                                | Date and time    | Action(s)      | Altered
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    22 | install smart-restart                                                                                                                                       | 2025-01-20 03:02 | Install        |    2
    21 | upgrade --releasever=2023.6.20241010                                                                                                                        | 2025-01-20 02:38 | I, U           |   14 EE
    20 | update python3.9 --releasever 2023.6.20241212                                                                                                               | 2025-01-20 00:12 | Upgrade        |    2
    19 | update kernel --releasever 2023.6.20241212                                                                                                                  | 2025-01-20 00:07 | C, E, I        |    3 EE

上記のdnf historyコマンドで実行履歴を表示できる。
各実行結果の詳細情報を確認する場合dnf history info <ID>を入力する。

$ dnf history info 20

Transaction ID : 20
Begin time     : Mon Jan 20 00:12:15 2025
Begin rpmdb    : 91bfec227442ba476d50c3ae2e8fb3fc26e9f08a5a85f98785aa96a05691a9bb
End time       : Mon Jan 20 00:12:17 2025 (2 seconds)
End rpmdb      : bb57c68eb1dc06e481ec8e431997a312b1260ff55b5746126767c5e422d7255f
User           : System <unset>
Return-Code    : Success
Releasever     : 2023.6.20241212
Command Line   : update python3.9 --releasever 2023.6.20241212
Comment        :
Packages Altered:
    Upgrade  python3-3.9.20-1.amzn2023.0.2.x86_64      @amazonlinux
    Upgraded python3-3.9.16-1.amzn2023.0.9.x86_64      @@System
    Upgrade  python3-libs-3.9.20-1.amzn2023.0.2.x86_64 @amazonlinux
    Upgraded python3-libs-3.9.16-1.amzn2023.0.9.x86_64 @@System

インストールあるいはアップデートしたパッケージについて確認できる。
ちなみにUpgradeはアップデート後のパッケージ名で、Upgradedはアップデート前のパッケージ名である。
上記でいうと、python3-3.9.16-1.amzn2023.0.9.x86_64というパッケージをpython3-3.9.20-1.amzn2023.0.2.x86_64というバージョンにアップデートしたということがわかる。

Discussion