dnfとパッケージについてまとめてみた
はじめに
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系ならyum やdnf など。 |
リポジトリ | パッケージを提供・保管している場所。インターネットのリポジトリからパッケージをインストールする場合を外部リポジトリ 、社内サーバ上のリポジトリからインストールする場合は内部リポジトリ を利用する |
リポジトリとは
リポジトリとは各種パッケージを保存しておくためのサーバ(保管庫) です。
インターネット上のリポジトリを外部リポジトリ、社内ネットワーク上のリポジトリを内部リポジトリという。
外部リポジトリには以下のようなものがあり、大きくは公式リポジトリとサードパーティリポジトリに分けられる。
名称 | 説明 |
---|---|
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で受け取る。
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