こんにちは、キクです。
本記事は、僕が自己学習で学んだことをブログでアウトプットするシリーズになります。
今回は『Linuにおけるパッケージ管理』について書いていこうと思います。
本記事の内容
それでは、よろしくお願いします。
パッケージ管理について
パッケージ
本記事のメインテーマは「パッケージ管理」ですが、そもそも「パッケージ」とは何なのか
パッケージは、Linuxが採用しているアプリケーションの配布形態のこと
必要なソフトやライブラリがひとまとまりになっているファイルの名称
パッケージには、主に以下のものが含まれている
パッケージ名とパッケージファイル名
パッケージ管理について調べていると、「パッケージ名」と「パッケージファイル名」を区別して使う場面があることが分かる
例えば、rpmコマンドの引数として指定する際に使い分けることがある
それぞれ次のような記載方法になる
区分 | 名前例 |
---|---|
パッケージ名 | postfix |
パッケージファイル名 | postfix-1.1.12-1.i386.rpm |
後述するが、rpmコマンドでインストールやアンインストールをするような場面ではパッケージファイル名で指定する
参考:rpm,yum,dpkg,apt-getなどで「パッケージファイル名」「パッケージ名」どちらを指定するのかメモ書き
参考:【 rpm 】コマンド(応用編その2)――パッケージの情報を調べる(2)
パッケージ管理
パッケージ管理とは、実行ファイルや設定ファイル、ライブラリを「パッケージ」としてひとまとめに配布・管理することを指す
主に管理する項目としては、次のようなものが挙げられる
- パッケージの種類
- パッケージのバージョン
パッケージ管理を行う上では、次のような操作をすることになる
パッケージ管理における主な操作
- パッケージの調査(照会)
- パッケージのインストール
- パッケージのアンインストール
- パッケージのバージョン更新 など
パッケージ管理システム
上記の「パッケージ管理」機能を管理するツールのこと
ソフトウェア同士の整合性や前提条件の欠落を防ぐために、依存関係とバージョン情報のデータベースを維持するという役割も持つ
代表的なものには、以下のものが挙げられる
RHEL系 | Debian系 | 補足 |
---|---|---|
RPM | DPKG | 依存関係の解決はしてくれない |
YUM | APT | 依存関係を自動的に解決してくれる |
参考:Linux基礎(パッケージ管理について)
参考:パッケージ管理システム(Wikipedia)
パッケージ管理のタイミング
「どのような場面でパッケージ管理が必要になるか?」を分類すると、以下のようになると思われる
- システム構築時(照会 / インストール)
システムの初期構築時には、必要なパッケージの情報を照会したり、インストールしたりする
- システム運用期間
システムは作って終わりではなく、その後稼働し続けるのが基本である
パッケージ管理のメインは「システム運用期間」にあると言える
この期間においては、例えば以下のような管理が必要になる
参考:リポジトリとは何か?yumを通して理解する(Linux学習)
Linuxへのソフトウェア導入方法
大きく以下2パターンに分かれる
- ソースコードを利用する
ソフトウェアのソースコードをtarで解凍し、「./configure」「make」「make install」という3つの手順を使ってコンパイル、インストールする
依存関係は自力で把握する必要があり、難易度が高い
- パッケージ管理システムを利用する
パッケージ同士の依存関係も考慮してくれるため便利
パッケージの削除時も不要なものを一緒に消してくれるため、ゴミが残らない
基本的にはこちらの方法で導入することが多い
RHEL系パッケージ管理システムの深掘り
先ほど、RHEL系のパッケージ管理システムとして「RPM」と「YUM」が登場したが、本項ではそれらについてコマンドなども含めてもう少し深掘りする
RPM(Red Hat Package Manager)
パッケージ管理システムのひとつ
主にRedHat系列(RHEL, CentOS, Fedora)のディストリビュージョンで採用されることが多い
パッケージ同士の依存情報は把握しているが、自動的に依存関係の解決はしてくれない
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 update】yumのパッケージを安全にアップデートする
yumに関する主な設定ファイル
1. /etc/yum.confファイル
yumにおける全体的な設定を管理する
デフォルトでは[main]セクションとコメントのみ記載されている
設定ファイル内の[main]セクションに記載の「cachedir」は、インターネットやローカルのリポジトリからパッケージを取得する際に、一時的に格納されるディレクトリを指す
[repository]セクションを追加することで、リポジトリ固有のオプションを設定することもできるが、この設定は非推奨
また、[main]セクションのreposdirという項目では、repoファイルの参照先ディレクトリを指定することができる模様
この項目の記載がなかった場合には、yumはデフォルトのディレクトリ「/etc/yum.repos.d/」を使用する
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
参考:rpmパッケージファイルに含まれるファイルを確認する (rpm -qpl)
参考情報
参考:【パッケージ管理システムとは?】Linuxでのパッケージ管理の使い方まとめました
参考:あらためてEPELリポジトリの使い方をまとめてみた
参考:パッケージマニフェスト
参考:パッケージ管理ツールの紹介【OS/言語別】