【Linux】パッケージ管理に関する学習記録

2024年2月12日

こんにちは、キクです。

本記事は、僕が自己学習で学んだことをブログでアウトプットするシリーズになります。
今回は『Linuにおけるパッケージ管理』について書いていこうと思います。

それでは、よろしくお願いします。

注意事項

本記事は自己学習としてのアウトプットが目的となります。

そのため、本記事には誤った情報が含まれる可能性もありますが、ご了承ください。

パッケージ管理について

パッケージ

本記事のメインテーマは「パッケージ管理」ですが、そもそも「パッケージ」とは何なのか

パッケージは、Linuxが採用しているアプリケーションの配布形態のこと
必要なソフトやライブラリがひとまとまりになっているファイルの名称

パッケージには、主に以下のものが含まれている

主にパッケージに含まれるもの

  • アプリケーションの実行ファイル
  • アプリケーションに必要なライブラリ
  • アプリケーションの設定ファイル
  • アプリケーションのドキュメント

パッケージ名とパッケージファイル名

パッケージ管理について調べていると、「パッケージ名」と「パッケージファイル名」を区別して使う場面があることが分かる
例えば、rpmコマンドの引数として指定する際に使い分けることがある

それぞれ次のような記載方法になる

区分名前例
パッケージ名postfix
パッケージファイル名postfix-1.1.12-1.i386.rpm

後述するが、rpmコマンドでインストールやアンインストールをするような場面ではパッケージファイル名で指定する

パッケージ管理

パッケージ管理とは、実行ファイルや設定ファイル、ライブラリを「パッケージ」としてひとまとめに配布・管理することを指す

主に管理する項目としては、次のようなものが挙げられる

  • パッケージの種類
  • パッケージのバージョン

パッケージ管理を行う上では、次のような操作をすることになる

パッケージ管理における主な操作

  • パッケージの調査(照会)
  • パッケージのインストール
  • パッケージのアンインストール
  • パッケージのバージョン更新 など

パッケージ管理システム

上記の「パッケージ管理」機能を管理するツールのこと
ソフトウェア同士の整合性や前提条件の欠落を防ぐために、依存関係とバージョン情報のデータベースを維持するという役割も持つ

代表的なものには、以下のものが挙げられる

RHEL系Debian系補足
RPMDPKG依存関係の解決はしてくれない
YUMAPT依存関係を自動的に解決してくれる

パッケージ管理のタイミング

「どのような場面でパッケージ管理が必要になるか?」を分類すると、以下のようになると思われる

  1. システム構築時(照会 / インストール)

システムの初期構築時には、必要なパッケージの情報を照会したり、インストールしたりする

  1. システム運用期間

システムは作って終わりではなく、その後稼働し続けるのが基本である
パッケージ管理のメインは「システム運用期間」にあると言える

この期間においては、例えば以下のような管理が必要になる

システム運用期間におけるパッケージ管理

  • 依存関係にあるパッケージの更新(照会 / バージョン更新)
  • 依存関係にあるパッケージの変更(照会 / インストール / アンインストール)

Linuxへのソフトウェア導入方法

大きく以下2パターンに分かれる

  1. ソースコードを利用する

ソフトウェアのソースコードをtarで解凍し、「./configure」「make」「make install」という3つの手順を使ってコンパイル、インストールする

依存関係は自力で把握する必要があり、難易度が高い

  1. パッケージ管理システムを利用する

パッケージ同士の依存関係も考慮してくれるため便利
パッケージの削除時も不要なものを一緒に消してくれるため、ゴミが残らない

基本的にはこちらの方法で導入することが多い

RHEL系パッケージ管理システムの深掘り

先ほど、RHEL系のパッケージ管理システムとして「RPM」と「YUM」が登場したが、本項ではそれらについてコマンドなども含めてもう少し深掘りする

RPM(Red Hat Package Manager)

パッケージ管理システムのひとつ
主にRedHat系列(RHEL, CentOS, Fedora)のディストリビュージョンで採用されることが多い

パッケージ同士の依存情報は把握しているが、自動的に依存関係の解決はしてくれない

RPMのパッケージファイル名は次のような書式となっている

RPMパッケージファイル名の書式例

書式:bash-3.1-10.i386.rpm

  • bash:パッケージの名称部分
  • 3.1:バージョン番号
  • 10:リリース番号
  • i386:アーキテクチャ
  • rpm:拡張子

よく利用するコマンド

# rpm -ivh パッケージファイル名

指定したパッケージをインストール


# rpm -Uvh パッケージファイル名

指定したパッケージをアップデート
指定したパッケージが存在しない場合にはインストールされる

安易にアップデートすると依存関係が崩れることがあるため、後述の「YUM」に一任するのもあり


# rpm -e パッケージ名

指定したパッケージをアンインストール


$ rpm -qa パッケージ名

指定したパッケージがインストール済みであればパッケージ名が表示される


$ rpm -qi パッケージ名

指定したインストール済みのパッケージ詳細情報を表示


$ rpm -ql パッケージ名

指定したパッケージによってインストールされたファイル一覧を表示


$ rpm -qf ファイル名

指定したファイルがどのパッケージに含まれているかを表示


$ rpm -qR パッケージ名

指定したインストール済みパッケージの依存関係を表示


$ rpm -qip ローカルパッケージファイル名

ローカルにある指定したパッケージの詳細情報を表示
絶対パスもしくは相対パスでパッケージファイル名を指定する

用途としては、インストール前に対象パッケージの情報を取得したい場合などが考えられる


$ rpm -qlp ローカルパッケージファイル名

ローカルにある指定したパッケージによってインストールされるファイル一覧を表示
絶対パスもしくは相対パスでパッケージファイル名を指定する

用途としては、インストール前に対象パッケージによってどのようなファイルがインストールされるかという情報を取得したい場合などが考えられる

YUM(Yellowdog Updater Modified)

パッケージの統合管理システム

RPMパッケージを管理するもので、パッケージ同士の依存関係を自動的に解決してくれるなどrpmコマンドよりも使い勝手が良い
パッケージはリポジトリ上で管理されるため、インストールなどの作業においてパッケージを自分で準備する必要がない

よく利用するコマンド

# yum check-update

リポジトリを確認して、インストール済みのパッケージでアップデートできるものがあるかチェック


# yum update パッケージ名

指定したインストール済みのパッケージをアップデートする
なお、パッケージ名を指定しなかった場合は全パッケージがアップデートされる


# yum install パッケージ名

リポジトリからパッケージをインストール
依存関係にあるパッケージも自動的にインストール


# yum search パッケージ名

指定したパッケージをリポジトリから検索


# yum remove パッケージ名

指定したインストール済みパッケージを削除


# yum info パッケージ名

指定したパッケージ情報を表示


# yum list installed

インストール済みのパッケージ一覧を表示

メモ

yumでインストールをした場合、パッケージ(.rpm)自体のダウンロードはしていないと思われる
findコマンドでインストール済みのパッケージファイルを探してみたが見つからなかった

一方で「yumdownloader」コマンドでパッケージを取得した場合、カレントディレクトリにパッケージファイルがダウンロードされた

yumに関する主な設定ファイル

1. /etc/yum.confファイル

yumにおける全体的な設定を管理する
デフォルトでは[main]セクションとコメントのみ記載されている

設定ファイル内の[main]セクションに記載の「cachedir」は、インターネットやローカルのリポジトリからパッケージを取得する際に、一時的に格納されるディレクトリを指す

[repository]セクションを追加することで、リポジトリ固有のオプションを設定することもできるが、この設定は非推奨

また、[main]セクションのreposdirという項目では、repoファイルの参照先ディレクトリを指定することができる模様
この項目の記載がなかった場合には、yumはデフォルトのディレクトリ「/etc/yum.repos.d/」を使用する

ポイント

リポジトリ設定は、「/etc/yum.repos.d/」配下にある各repoファイルによって設定することが推奨されている

2. /etc/yum.repos.d/xx.repoファイル

リポジトリに関する設定ファイル

yumコマンドを実行した際には、基本的に「/etc/yum.repos.d」ディレクトリ配下にあるrepoファイルで有効化されているリポジトリを参照する

疑問

リポジトリの参照先は「baseurl」で設定するイメージだったが「metalink」になっているのはなぜ?
そもそもmetalinkとは?

調査結果

それぞれ以下のような用途の項目

項目名説明
baseurlリポジトリのベースURL
おそらく特定のリポジトリを指定する場合に使用する項目
metalink有効なミラーリポジトリ一覧を含む metallink ファイルの URL
おそらく「ここに記載された複数のリポジトリの中から有効なものを使ってね」という感じ

RPMとYUMの大きな違い

既に触れているが、RPMとYUMはそれぞれ以下のような位置付けのツール

RPM:パッケージ管理システム

YUM:パッケージ統合管理システム

RPMでは、パッケージの依存関係を知っているし教えてくれるが、依存関係のあるパッケージを別途インストールしたり削除したりはしてくれない
YUMでは、上記の「依存関係にあるパッケージ」を自動的に一緒にインストールしたり削除したりしてくれる

また、YUMはリポジトリからパッケージをインストールできるため、事前にパッケージファイルを準備する必要がない
RPMの場合は、事前にパッケージファイル(もしくはURL指定)を準備する必要がある

関連調査メモ

リポジトリ

パッケージの提供元
世界中にたくさんあり、それぞれ配布しているパッケージが異なる

リポジトリを追加することでパッケージのバリエーションは増えるが、安易に追加するのはセキュリティ上好ましくないので注意する

EPEL

サードパーティー製のリポジトリ
Fedoraプロジェクトの有志によって作成されており、信頼度の高いRHEL向けのリポジトリである

パッケージ「epel-release」をインストールすると、ローカルに「epel.repo」ファイルを含むファイル群が追加され、新たなリポジトリ参照先として利用できるようになる

以下のコマンドで追加できる

# yum install epel-release

■疑問

外部にあるリポジトリからパッケージをインストールするイメージだったが、上記のように「リポジトリをインストール」して、そこからパッケージをインストールするという流れっぽい?

その場合、リポジトリを更新しないと新しいパッケージは使えないということになりそうか?

■調査

上記の認識は概ね合っていそう
リモートリポジトリからローカルにリポジトリをダウンロードし、ローカルのリポジトリからパッケージをインストールするのが一般的っぽい

■追記

上記認識は間違っているかも?
あくまでもepel-releaseはパッケージであり、リポジトリそのものではない

例えば、epel-releaseを取得した際にはepel.repoファイルが追加され、そこに記載されたURLのリポジトリを参照するようになる
つまり、ローカルにリポジトリをそのまま取得しているわけではなさそう

・・・そもそも、いちいち全パッケージごとリポジトリを取得していたら、ローカルのリソースがもたないか

また、コマンドによってリモートリポジトリから直接パッケージを取得することもできるみたい
例えば、yum-utilsパッケージに「yumdownloader」コマンドを利用すると、リポジトリからパッケージのダウンロードのみを実行

yumコマンドで使用するリポジトリの設定

各repoファイル内では、以下のように「enabled=x」という設定が入っている

[epel]
name=Extra Packages for Enterprise Linux $releasever - $basearch
# It is much more secure to use the metalink, but if you wish to use a local mirror
# place its address here.
#baseurl=https://download.example/pub/epel/$releasever/Everything/$basearch/
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-$releasever&arch=$basearch&infra=$infra&content=$contentdir
enabled=1
gpgcheck=1
countme=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-$releasever

[epel-debuginfo]
name=Extra Packages for Enterprise Linux $releasever - $basearch - Debug
# It is much more secure to use the metalink, but if you wish to use a local mirror
# place its address here.
#baseurl=https://download.example/pub/epel/$releasever/Everything/$basearch/debug/
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-$releasever&arch=$basearch&infra=$infra&content=$contentdir
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-$releasever
gpgcheck=1

「enabled=0」は無効化を意味しており、yumコマンド実行時の参照先として利用されない
「enabled=1」は有効化を意味しており、yumコマンド実行時の参照先として利用される

実機確認(CentOS Stream9)

パッケージ名を間違えてインストールしようとした際に、以下のリポジトリに接続しに行っているのが分かった

CentOS Stream 9 - BaseOS   3.9 kB/s | 4.8 kB     00:01
CentOS Stream 9 - BaseOS    540 kB/s | 8.8 MB     00:16
CentOS Stream 9 - AppStream    7.1 kB/s | 4.9 kB     00:00
CentOS Stream 9 - AppStream   657 kB/s |  17 MB     00:26
CentOS Stream 9 - Extras packages    4.4 kB/s |  15 kB     00:03

これらは/etc/yum.repos.d/配下にある各repoファイルの中で「enabled=1」となっているリポジトリ

パッケージ「epel-release」をインストールしてみた

[root@localhost ~]# yum install epel-release
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 0:11:08 ago on Mon Feb  5 22:23:23 2024.
Dependencies resolved.
==========================================================================================================================================
 Package                                         Architecture                  Version                Repository                   Size
==========================================================================================================================================
Installing:
 epel-release                                    noarch                        9-7.el9                extras-common                19 k
Installing weak dependencies:
 epel-next-release                               noarch                        9-7.el9                extras-common               8.1 k

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

Total download size: 27 k
Installed size: 29 k
Is this ok [y/N]: y
Downloading Packages:
(1/2): epel-next-release-9-7.el9.noarch.rpm                      142 kB/s | 8.1 kB     00:00    
(2/2): epel-release-9-7.el9.noarch.rpm                           177 kB/s |  19 kB     00:00    
--------------------------------------------------------------------------------------------
Total                                                            14 kB/s |  27 kB     00:01     
CentOS Stream 9 - Extras packages                                942 kB/s | 2.1 kB     00:00    
Importing GPG key 0x1D997668:
 Userid     : "CentOS Extras SIG (https://wiki.centos.org/SpecialInterestGroup) <security@centos.org>"
 Fingerprint: 363F C097 2F64 B699 AED3 968E 1FF6 A217 1D99 7668
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Extras-SHA512
Is this ok [y/N]: y
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                      1/1 
  Installing       : epel-release-9-7.el9.noarch                          1/2 
  Running scriptlet: epel-release-9-7.el9.noarch                          1/2 
Many EPEL packages require the CodeReady Builder (CRB) repository.
It is recommended that you run /usr/bin/crb enable to enable the CRB repository.

  Installing       : epel-next-release-9-7.el9.noarch                     2/2 
  Running scriptlet: epel-next-release-9-7.el9.noarch                     2/2 
  Verifying        : epel-next-release-9-7.el9.noarch                     1/2 
  Verifying        : epel-release-9-7.el9.noarch                          2/2 

Installed:
  epel-next-release-9-7.el9.noarch                                        epel-release-9-7.el9.noarch                                                                                                        

Complete!

epelに関するrepoファイルが増えた

[root@localhost ~]# ll /etc/yum.repos.d/
total 32
-rw-r--r--. 1 root root 4229 Mar  2  2022 centos-addons.repo
-rw-r--r--. 1 root root 2588 Mar  2  2022 centos.repo
-rw-r--r--. 1 root root 1142 Aug 17 00:00 epel-cisco-openh264.repo
-rw-r--r--. 1 root root 1621 Aug 17 00:00 epel-next-testing.repo
-rw-r--r--. 1 root root 1519 Aug 17 00:00 epel-next.repo
-rw-r--r--. 1 root root 1552 Aug 17 00:00 epel-testing.repo
-rw-r--r--. 1 root root 1453 Aug 17 00:00 epel.repo

リポジトリ一覧の確認

[root@localhost ~]# yum repolist 
Failed to set locale, defaulting to C.UTF-8
repo id                                               repo name
appstream                                             CentOS Stream 9 - AppStream
baseos                                                CentOS Stream 9 - BaseOS
epel                                                  Extra Packages for Enterprise Linux 9 - aarch64
epel-cisco-openh264                                   Extra Packages for Enterprise Linux 9 openh264 (From Cisco) - aarch64
epel-next                                             Extra Packages for Enterprise Linux 9 - Next - aarch64
extras-common                                         CentOS Stream 9 - Extras packages
[root@localhost ~]# yum repolist all
Failed to set locale, defaulting to C.UTF-8
repo id                                               repo name                                                                                               status
appstream                                             CentOS Stream 9 - AppStream                                                                             enabled
appstream-debug                                       CentOS Stream 9 - AppStream - Debug                                                                     disabled
appstream-source                                      CentOS Stream 9 - AppStream - Source                                                                    disabled
baseos                                                CentOS Stream 9 - BaseOS                                                                                enabled
baseos-debug                                          CentOS Stream 9 - BaseOS - Debug                                                                        disabled
baseos-source                                         CentOS Stream 9 - BaseOS - Source                                                                       disabled
crb                                                   CentOS Stream 9 - CRB                                                                                   disabled
crb-debug                                             CentOS Stream 9 - CRB - Debug                                                                           disabled
crb-source                                            CentOS Stream 9 - CRB - Source                                                                          disabled
epel                                                  Extra Packages for Enterprise Linux 9 - aarch64                                                         enabled
epel-cisco-openh264                                   Extra Packages for Enterprise Linux 9 openh264 (From Cisco) - aarch64                                   enabled
epel-cisco-openh264-debuginfo                         Extra Packages for Enterprise Linux 9 openh264 (From Cisco) - aarch64 - Debug                           disabled
epel-cisco-openh264-source                            Extra Packages for Enterprise Linux 9 openh264 (From Cisco) - aarch64 - Source                          disabled
epel-debuginfo                                        Extra Packages for Enterprise Linux 9 - aarch64 - Debug                                                 disabled
epel-next                                             Extra Packages for Enterprise Linux 9 - Next - aarch64                                                  enabled
epel-next-debuginfo                                   Extra Packages for Enterprise Linux 9 - Next - aarch64 - Debug                                          disabled
epel-next-source                                      Extra Packages for Enterprise Linux 9 - Next - aarch64 - Source                                         disabled
epel-next-testing                                     Extra Packages for Enterprise Linux 9 - Next - Testing - aarch64                                        disabled
epel-next-testing-debuginfo                           Extra Packages for Enterprise Linux 9 - Next - Testing - aarch64 - Debug                                disabled
epel-next-testing-source                              Extra Packages for Enterprise Linux 9 - Next - Testing - aarch64 - Source                               disabled
epel-source                                           Extra Packages for Enterprise Linux 9 - aarch64 - Source                                                disabled
epel-testing                                          Extra Packages for Enterprise Linux 9 - Testing - aarch64                                               disabled
epel-testing-debuginfo                                Extra Packages for Enterprise Linux 9 - Testing - aarch64 - Debug                                       disabled
epel-testing-source                                   Extra Packages for Enterprise Linux 9 - Testing - aarch64 - Source                                      disabled
extras-common                                         CentOS Stream 9 - Extras packages                                                                       enabled
extras-common-source                                  CentOS Stream 9 - Extras packages - Source                                                              disabled
highavailability                                      CentOS Stream 9 - HighAvailability                                                                      disabled
highavailability-debug                                CentOS Stream 9 - HighAvailability - Debug                                                              disabled
highavailability-source                               CentOS Stream 9 - HighAvailability - Source                                                             disabled
nfv                                                   CentOS Stream 9 - NFV                                                                                   disabled
nfv-debug                                             CentOS Stream 9 - NFV - Debug                                                                           disabled
nfv-source                                            CentOS Stream 9 - NFV - Source                                                                          disabled
resilientstorage                                      CentOS Stream 9 - ResilientStorage                                                                      disabled
resilientstorage-debug                                CentOS Stream 9 - ResilientStorage - Debug                                                              disabled
resilientstorage-source                               CentOS Stream 9 - ResilientStorage - Source                                                             disabled
rt                                                    CentOS Stream 9 - RT                                                                                    disabled
rt-debug                                              CentOS Stream 9 - RT - Debug                                                                            disabled
rt-source                                             CentOS Stream 9 - RT - Source                                                                           disabled

epel.repoファイルの確認

[root@localhost ~]# cat /etc/yum.repos.d/epel.repo 
[epel]
name=Extra Packages for Enterprise Linux $releasever - $basearch
# It is much more secure to use the metalink, but if you wish to use a local mirror
# place its address here.
#baseurl=https://download.example/pub/epel/$releasever/Everything/$basearch/
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-$releasever&arch=$basearch&infra=$infra&content=$contentdir
enabled=1
gpgcheck=1
countme=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-$releasever

[epel-debuginfo]
name=Extra Packages for Enterprise Linux $releasever - $basearch - Debug
# It is much more secure to use the metalink, but if you wish to use a local mirror
# place its address here.
#baseurl=https://download.example/pub/epel/$releasever/Everything/$basearch/debug/
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-$releasever&arch=$basearch&infra=$infra&content=$contentdir
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-$releasever
gpgcheck=1

[epel-source]
name=Extra Packages for Enterprise Linux $releasever - $basearch - Source
# It is much more secure to use the metalink, but if you wish to use a local mirror
# place its address here.
#baseurl=https://download.example/pub/epel/$releasever/Everything/source/tree/
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-source-$releasever&arch=$basearch&infra=$infra&content=$contentdir
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-$releasever
gpgcheck=1

インストール済みのパッケージ「epel-release」に含まれるファイルの確認

[root@localhost ~]# rpm -ql epel-release
/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-9
/etc/yum.repos.d/epel-cisco-openh264.repo
/etc/yum.repos.d/epel-testing.repo
/etc/yum.repos.d/epel.repo
/usr/bin/crb
/usr/lib/systemd/system-preset/90-epel.preset
/usr/share/licenses/epel-release
/usr/share/licenses/epel-release/GPL

参考情報

参考:【パッケージ管理システムとは?】Linuxでのパッケージ管理の使い方まとめました
参考:あらためてEPELリポジトリの使い方をまとめてみた
参考:パッケージマニフェスト
参考:パッケージ管理ツールの紹介【OS/言語別】

-学習記録, Linux
-,