RHEL9のつもりの Rocky Linux 9に rpmパッケージのローカルリポジトリを作ります。
事の発端は、仕事で RHEL8の本番機と開発機のパッケージバージョンの同期を取る必要に迫られた事でした。
本番機のパッケージアップデートは開発機で確認してから適用したいと思ったのでした。
RHELのデフォルト設定では、他の Linuxディストリビューションと同様に、RHEL(IBMですかね)が提供しているインターネット上のリポジトリからパッケージを取得できるようになっています。
開発機に最新のパッケージを適用するのは問題ないのですが、開発機で数日かけてそれを検証している間にパッケージ自体が更にアップデートされてしまうとか、依存パッケージも変わってしまうとか、本番機とパッケージの同期を取るのに不都合がありました。
開発機に適用したパッケージのうち確認が取れたものだけ本番機に適用したい…
これを叶えるため、こんな手順を考えました。
- 本番機にローカルリポジトリを作っておく
- 本番機はローカルリポジトリしか見ない
- 開発機でパッケージをアップデート
- 開発機でアップデート後のテスト
- テスト済みパッケージを本番機のローカルリポジトリに入れる(単なるコピー)
- 本番機のパッケージをアップデート
- 本番機でアップデート後のテスト
こうすることで、本番機と開発機で新パッケージインストールやパッケージアップデートの適用日時の差が埋められるはずと。
rpmパッケージのローカルリポジトリについて検索すると、インターネットに繋がっていないサーバーでの利用の例が一杯ありますので情報取得には事欠きませんが、こういう使い方をしている人が余りいないようなので、もしかするともっと良い方法があるのかもなって思います。
でも備忘録的に書いておこうかなと。
ここでは珍しく Ubuntuじゃなくて Rocky Linuxでやります。
Rocky Linux 9のインストールについては「Rocky Linuxインストール(CentOS代替)」に書いておりますので、そちらをご参照願います。
2023年5月1日時点での最新環境で、以下の通りになりました。
本番機役・開発機役とも同じです。
Rocky Linux 9.1
VMware Workstation Playerに Rocky Linux 9.1の仮想マシンを以下の通り 2つ作りました。
Rocky-2 : 本番機役
Rocky-3 : 開発機役
ログインができるようになっているところからスタートです。
両方とも同時に全パッケージのアップデートをして、最新状態にしました。
(例として [Rocky-2]のほう)
[subro@Rocky-2 ~]$ sudo dnf update
〜〜〜 以下略 〜〜〜
まず最初に、[Rocky-2][Rocky-3]の両方に、ローカルリポジトリデータベースを作るパッケージを入れておきます。
([Rocky-3]ではこのパッケージは使わないんですが、パッケージの同期を取らねばならないので…)
(画面は例として[Rocky-2]だけ)
[subro@Rocky-2 ~]$ sudo dnf install -y createrepo
Rocky Linux 9 - BaseOS 5.3 kB/s | 4.1 kB 00:00
Rocky Linux 9 - BaseOS 2.1 MB/s | 1.8 MB 00:00
Rocky Linux 9 - AppStream 6.7 kB/s | 4.5 kB 00:00
Rocky Linux 9 - AppStream 4.4 MB/s | 6.8 MB 00:01
Rocky Linux 9 - Extras 3.8 kB/s | 2.9 kB 00:00
依存関係が解決しました。
====================================================================================================================================================================================================
パッケージ アーキテクチャー バージョン リポジトリー サイズ
====================================================================================================================================================================================================
インストール:
createrepo_c x86_64 0.17.7-4.el9_0 appstream 74 k
依存関係のインストール:
createrepo_c-libs x86_64 0.17.7-4.el9_0 appstream 98 k
トランザクションの概要
====================================================================================================================================================================================================
インストール 2 パッケージ
ダウンロードサイズの合計: 172 k
インストール後のサイズ: 441 k
パッケージのダウンロード:
(1/2): createrepo_c-0.17.7-4.el9_0.x86_64.rpm 280 kB/s | 74 kB 00:00
(2/2): createrepo_c-libs-0.17.7-4.el9_0.x86_64.rpm 357 kB/s | 98 kB 00:00
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
合計 205 kB/s | 172 kB 00:00
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
準備 : 1/1
インストール中 : createrepo_c-libs-0.17.7-4.el9_0.x86_64 1/2
インストール中 : createrepo_c-0.17.7-4.el9_0.x86_64 2/2
scriptletの実行中: createrepo_c-0.17.7-4.el9_0.x86_64 2/2
検証 : createrepo_c-libs-0.17.7-4.el9_0.x86_64 1/2
検証 : createrepo_c-0.17.7-4.el9_0.x86_64 2/2
インストール済み:
createrepo_c-0.17.7-4.el9_0.x86_64 createrepo_c-libs-0.17.7-4.el9_0.x86_64
完了しました!
本番機役の [Rocky-2]はリポジトリを使えなくします。
まずは登録されているリポジトリの一覧です。
[subro@Rocky-2 ~]$ dnf repolist --all
repo id repo の名前 状態
appstream Rocky Linux 9 - AppStream 有効化
appstream-debug Rocky Linux 9 - AppStream - Debug 無効化
appstream-source Rocky Linux 9 - AppStream - Source 無効化
baseos Rocky Linux 9 - BaseOS 有効化
baseos-debug Rocky Linux 9 - BaseOS - Debug 無効化
baseos-source Rocky Linux 9 - BaseOS - Source 無効化
crb Rocky Linux 9 - CRB 無効化
crb-debug Rocky Linux 9 - CRB - Debug 無効化
crb-source Rocky Linux 9 - CRB - Source 無効化
devel Rocky Linux 9 - Devel WARNING! FOR BUILDROOT ONLY DO NOT LEAVE ENABLED 無効化
devel-debug Rocky Linux 9 - Devel Debug WARNING! FOR BUILDROOT ONLY DO NOT LEAVE ENABLED 無効化
devel-source Rocky Linux 9 - Devel Source WARNING! FOR BUILDROOT ONLY DO NOT LEAVE ENABLED 無効化
extras Rocky Linux 9 - Extras 有効化
extras-debug Rocky Linux 9 - Extras Debug 無効化
extras-source Rocky Linux 9 - Extras Source 無効化
highavailability Rocky Linux 9 - High Availability 無効化
highavailability-debug Rocky Linux 9 - High Availability - Debug 無効化
highavailability-source Rocky Linux 9 - High Availability - Source 無効化
nfv Rocky Linux 9 - NFV 無効化
nfv-debug Rocky Linux 9 - NFV Debug 無効化
nfv-source Rocky Linux 9 - NFV Source 無効化
plus Rocky Linux 9 - Plus 無効化
plus-debug Rocky Linux 9 - Plus - Debug 無効化
plus-source Rocky Linux 9 - Plus - Source 無効化
resilientstorage Rocky Linux 9 - Resilient Storage 無効化
resilientstorage-debug Rocky Linux 9 - Resilient Storage - Debug 無効化
resilientstorage-source Rocky Linux 9 - Resilient Storage - Source 無効化
rt Rocky Linux 9 - Realtime 無効化
rt-debug Rocky Linux 9 - Realtime Debug 無効化
rt-source Rocky Linux 9 - Realtime Source 無効化
sap Rocky Linux 9 - SAP 無効化
sap-debug Rocky Linux 9 - SAP Debug 無効化
sap-source Rocky Linux 9 - SAP Source 無効化
saphana Rocky Linux 9 - SAPHANA 無効化
saphana-debug Rocky Linux 9 - SAPHANA Debug 無効化
saphana-source Rocky Linux 9 - SAPHANA Source 無効化
[有効化]されているのが 3つありますね。
これらを全て[無効化]にして見えなくします。
[subro@Rocky-2 ~]$ sudo dnf config-manager --disable appstream
[subro@Rocky-2 ~]$ sudo dnf config-manager --disable baseos
[subro@Rocky-2 ~]$ sudo dnf config-manager --disable extras
改めて一覧を取ると、3つとも[無効化]になりました。
[subro@Rocky-2 ~]$ dnf repolist --all
repo id repo の名前 状態
appstream Rocky Linux 9 - AppStream 無効化
appstream-debug Rocky Linux 9 - AppStream - Debug 無効化
appstream-source Rocky Linux 9 - AppStream - Source 無効化
baseos Rocky Linux 9 - BaseOS 無効化
baseos-debug Rocky Linux 9 - BaseOS - Debug 無効化
baseos-source Rocky Linux 9 - BaseOS - Source 無効化
crb Rocky Linux 9 - CRB 無効化
crb-debug Rocky Linux 9 - CRB - Debug 無効化
crb-source Rocky Linux 9 - CRB - Source 無効化
devel Rocky Linux 9 - Devel WARNING! FOR BUILDROOT ONLY DO NOT LEAVE ENABLED 無効化
devel-debug Rocky Linux 9 - Devel Debug WARNING! FOR BUILDROOT ONLY DO NOT LEAVE ENABLED 無効化
devel-source Rocky Linux 9 - Devel Source WARNING! FOR BUILDROOT ONLY DO NOT LEAVE ENABLED 無効化
extras Rocky Linux 9 - Extras 無効化
extras-debug Rocky Linux 9 - Extras Debug 無効化
extras-source Rocky Linux 9 - Extras Source 無効化
highavailability Rocky Linux 9 - High Availability 無効化
highavailability-debug Rocky Linux 9 - High Availability - Debug 無効化
highavailability-source Rocky Linux 9 - High Availability - Source 無効化
nfv Rocky Linux 9 - NFV 無効化
nfv-debug Rocky Linux 9 - NFV Debug 無効化
nfv-source Rocky Linux 9 - NFV Source 無効化
plus Rocky Linux 9 - Plus 無効化
plus-debug Rocky Linux 9 - Plus - Debug 無効化
plus-source Rocky Linux 9 - Plus - Source 無効化
resilientstorage Rocky Linux 9 - Resilient Storage 無効化
resilientstorage-debug Rocky Linux 9 - Resilient Storage - Debug 無効化
resilientstorage-source Rocky Linux 9 - Resilient Storage - Source 無効化
rt Rocky Linux 9 - Realtime 無効化
rt-debug Rocky Linux 9 - Realtime Debug 無効化
rt-source Rocky Linux 9 - Realtime Source 無効化
sap Rocky Linux 9 - SAP 無効化
sap-debug Rocky Linux 9 - SAP Debug 無効化
sap-source Rocky Linux 9 - SAP Source 無効化
saphana Rocky Linux 9 - SAPHANA 無効化
saphana-debug Rocky Linux 9 - SAPHANA Debug 無効化
saphana-source Rocky Linux 9 - SAPHANA Source 無効化
これで何かパッケージをインストールしようとしても、何も入らなくなります。
[subro@Rocky-2 ~]$ sudo dnf install nginx
エラー: "/etc/yum.repos.d", "/etc/yum/repos.d", "/etc/distro.repos.d" には有効化されたリポジトリーがありません。
この状態だと不意にパッケージがアップデートされてしまうこともありませんね。
[Rocky-2]にローカルリポジトリを作ります。
実際にパッケージ管理される場所及びそのデータベースとしてディレクトリが 1つ必要で、場所は任意なのでここでは [/repo]ディレクトリを作ります。
[subro@Rocky-2 ~]$ sudo mkdir /repo
[/repo]ディレクトリにデータベースを作ります。
[subro@Rocky-2 ~]$ sudo createrepo --database /repo
Directory walk started
Directory walk done - 0 packages
Temporary output repo path: /repo/.repodata/
Preparing sqlite DBs
Pool started (with 5 workers)
Pool finished
[subro@Rocky-2 ~]$ ls -lR /repo
合計 4
drwxr-xr-x. 2 root root 4096 5月 1 16:03 repodata
/repo/repodata:
合計 28
-rw-r--r--. 1 root root 134 5月 1 16:03 1cb61ea996355add02b1426ed4c1780ea75ce0c04c5d1107c025c3fbd7d8bcae-primary.xml.gz
-rw-r--r--. 1 root root 574 5月 1 16:03 84823fd3ece1cbb9caf902f18fea26f8c3e0e36fef5a2138e4d1ebdcfcd6551b-other.sqlite.bz2
-rw-r--r--. 1 root root 123 5月 1 16:03 95a4415d859d7120efb6b3cf964c07bebbff9a5275ca673e6e74a97bcbfb2a5f-filelists.xml.gz
-rw-r--r--. 1 root root 1352 5月 1 16:03 9e1fa9eafa1d6a7fa1c824e8dee832be6d72768247dcfa4fb83b51bb1d2b351e-primary.sqlite.bz2
-rw-r--r--. 1 root root 123 5月 1 16:03 ef3e20691954c3d1318ec3071a982da339f4ed76967ded668b795c9e070aaab6-other.xml.gz
-rw-r--r--. 1 root root 609 5月 1 16:03 fba6640a4700eea50e3abc4c19e3e97642274c144ce0b4ca3cf9290596ecd8bf-filelists.sqlite.bz2
-rw-r--r--. 1 root root 3068 5月 1 16:03 repomd.xml
できました。
このリポジトリを dnf(yum)のリポジトリ走査対象として登録するため [/etc/yum.repos.d/local.repo]というファイルを作りました。
/etc/yum.repos.d/local.repo]
[local] ← リポジトリID
name=Local Repository ← リポジトリの名前
baseurl=file:///repo ← リポジトリの場所「file://」で始まっています
gpgcheck=0 ← パッケージのGPGチェック(出所のチェック)はしない
enabled=1 ← リポジトリは有効化されている
これでローカルリポジトリはできました。
使用例として開発機役の [Rocky-3]で NGINXをインストールしてみます。
後で [Rcoky-2]に持っていくパッケージファイルを先にダウンロードしておきます。
キャッシュファイルを消さない方法を探し中ですが見つけられていません。
ダウンロード場所を指定しないと [/var/cache/dnf]ディレクトリ以下にあるリポジトリ別のディレクトリに振り分けられますが、そこから対象のものだけ拾ってくるのは骨なので、作業している [subro]ユーザーのホームディレクトリ下に [work/rpm]ディレクトリを作り、そこにダウンロードするようにしました。
[subro@Rocky-3 ~]$ sudo dnf install -y nginx --downloadonly --downloaddir=./work/rpm
メタデータの期限切れの最終確認: 1:54:40 時間前の 2023年05月01日 15時12分46秒 に実施しました。
依存関係が解決しました。
====================================================================================================================================================================================================
パッケージ アーキテクチャー バージョン リポジトリー サイズ
====================================================================================================================================================================================================
インストール:
nginx x86_64 1:1.20.1-13.el9 appstream 38 k
依存関係のインストール:
nginx-core x86_64 1:1.20.1-13.el9 appstream 567 k
nginx-filesystem noarch 1:1.20.1-13.el9 appstream 11 k
rocky-logos-httpd noarch 90.14-1.el9 appstream 24 k
トランザクションの概要
====================================================================================================================================================================================================
インストール 4 パッケージ
ダウンロードサイズの合計: 640 k
インストール後のサイズ: 1.8 M
DNF はトランザクションでパッケージのダウンロードのみ行います。
パッケージのダウンロード:
(1/4): nginx-filesystem-1.20.1-13.el9.noarch.rpm 35 kB/s | 11 kB 00:00
(2/4): nrocky-logos-httpd-90.14-1.el9.noarch.rpm 78 kB/s | 24 kB 00:00
(3/4): nnginx-1.20.1-13.el9.x86_64.rpm 117 kB/s | 38 kB 00:00
(4/4): nnginx-core-1.20.1-13.el9.x86_64.rpm 7.5 MB/s | 567 kB 00:00
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
合計 672 kB/s | 640 kB 00:00
完了しました!
ダウンロード済みのパッケージは、次の正常なトランザクションまでキャッシュに保存されました。
'dnf clean packages' を実行することでキャッシュパッケージを削除できます。
[subro@Rocky-3 ~]$ ls -l work/rpm
合計 648
-rw-r--r--. 1 root root 38791 5月 1 17:07 nnginx-1.20.1-13.el9.x86_64.rpm
-rw-r--r--. 1 root root 581012 5月 1 17:07 nnginx-core-1.20.1-13.el9.x86_64.rpm
-rw-r--r--. 1 root root 10971 5月 1 17:07 nnginx-filesystem-1.20.1-13.el9.noarch.rpm
-rw-r--r--. 1 root root 24793 5月 1 17:07 nocky-logos-httpd-90.14-1.el9.noarch.rpm
[nginx]をインストールする場合は、以下 4つの RPMパッケージがインストール対象になりますね。
rocky-logos-httpd-90.14-1.el9.noarch.rpm
nginx-filesystem-1.20.1-13.el9.noarch.rpm
nginx-1.20.1-13.el9.x86_64.rpm
nginx-core-1.20.1-13.el9.x86_64.rpm
この後で NGINXをインストールするとこのファイルはなくなってしまうので、ディレクトリをコピーしてバックアップを取っておきます。
[subro@Rocky-3 ~]$ cp -pr work/rpm work/rpm.bak
[subro@Rocky-3 ~]$ ls -l work/rpm.bak
合計 648
-rw-r--r--. 1 subro subro 38791 5月 1 17:07 nginx-1.20.1-13.el9.x86_64.rpm
-rw-r--r--. 1 subro subro 581012 5月 1 17:07 nginx-core-1.20.1-13.el9.x86_64.rpm
-rw-r--r--. 1 subro subro 10971 5月 1 17:07 nginx-filesystem-1.20.1-13.el9.noarch.rpm
-rw-r--r--. 1 subro subro 24793 5月 1 17:07 rocky-logos-httpd-90.14-1.el9.noarch.rpm
バックアップができました。
[Rocky-3]で NGINXを普通にインストールします。
今ダウンロードしたのと同じパッケージがインストールされています。
[subro@Rocky-3 ~]$ sudo dnf install -y nginx
メタデータの期限切れの最終確認: 1:59:58 時間前の 2023年05月01日 15時12分46秒 に実施しました。
依存関係が解決しました。
====================================================================================================================================================================================================
パッケージ アーキテクチャー バージョン リポジトリー サイズ
====================================================================================================================================================================================================
インストール:
nginx x86_64 1:1.20.1-13.el9 appstream 38 k
依存関係のインストール:
nginx-core x86_64 1:1.20.1-13.el9 appstream 567 k
nginx-filesystem noarch 1:1.20.1-13.el9 appstream 11 k
rocky-logos-httpd noarch 90.14-1.el9 appstream 24 k
トランザクションの概要
====================================================================================================================================================================================================
インストール 4 パッケージ
ダウンロードサイズの合計: 640 k
インストール後のサイズ: 1.8 M
パッケージのダウンロード:
(1/4): rocky-logos-httpd-90.14-1.el9.noarch.rpm 376 kB/s | 24 kB 00:00
(2/4): nginx-filesystem-1.20.1-13.el9.noarch.rpm 159 kB/s | 11 kB 00:00
(3/4): nginx-1.20.1-13.el9.x86_64.rpm 484 kB/s | 38 kB 00:00
(4/4): nginx-core-1.20.1-13.el9.x86_64.rpm 3.1 MB/s | 567 kB 00:00
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
合計 813 kB/s | 640 kB 00:00
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
準備 : 1/1
scriptletの実行中: nginx-filesystem-1:1.20.1-13.el9.noarch 1/4
インストール中 : nginx-filesystem-1:1.20.1-13.el9.noarch 1/4
インストール中 : nginx-core-1:1.20.1-13.el9.x86_64 2/4
インストール中 : rocky-logos-httpd-90.14-1.el9.noarch 3/4
インストール中 : nginx-1:1.20.1-13.el9.x86_64 4/4
scriptletの実行中: nginx-1:1.20.1-13.el9.x86_64 4/4
検証 : rocky-logos-httpd-90.14-1.el9.noarch 1/4
検証 : nginx-filesystem-1:1.20.1-13.el9.noarch 2/4
検証 : nginx-1:1.20.1-13.el9.x86_64 3/4
検証 : nginx-core-1:1.20.1-13.el9.x86_64 4/4
インストール済み:
nginx-1:1.20.1-13.el9.x86_64 nginx-core-1:1.20.1-13.el9.x86_64 nginx-filesystem-1:1.20.1-13.el9.noarch rocky-logos-httpd-90.14-1.el9.noarch
完了しました!
インストールできました。(当たり前ですが)
これで [Rocky-3]にてテストを行い、問題なければこの 4つのパッケージを [Rocky-2]のローカルリポジトリに入れます。
[Rocky-2]で作業しています。
scpコマンドで [/repo]ディレクトリに上でダウンロードした 4つのパッケージファイルをコピーしています。
[subro@Rocky-2 ~]$ sudo scp subro@Rocky-3:~/work/rpm.bak/*.rpm /repo
nginx-1.20.1-13.el9.x86_64.rpm 100% 38KB 11.4MB/s 00:00
nginx-core-1.20.1-13.el9.x86_64.rpm 100% 567KB 39.4MB/s 00:00
nginx-filesystem-1.20.1-13.el9.noarch.rpm 100% 11KB 4.7MB/s 00:00
rocky-logos-httpd-90.14-1.el9.noarch.rpm 100% 24KB 12.1MB/s 00:00
ローカルリポジトリのデータベースを更新します。
[subro@Rocky-2 ~]$ sudo createrepo --database /repo
Directory walk started
Directory walk done - 4 packages
Temporary output repo path: /repo/.repodata/
Preparing sqlite DBs
Pool started (with 5 workers)
Pool finished
更新できました。
4パッケージと出ていて、予想通りの動きです。
[Rocky-2]で NGINXをインストールします。
見て頂きたいのは [リポジトリー]列が [local]になっていることです。
[Rocky-3]の時はここが [appstream](インターネット上にある)でした。
[subro@Rocky-2 ~]$ sudo dnf install -y nginx
Local Repository 970 kB/s | 2.8 kB 00:00
依存関係が解決しました。
====================================================================================================================================================================================================
パッケージ アーキテクチャー バージョン リポジトリー サイズ
====================================================================================================================================================================================================
インストール:
nginx x86_64 1:1.20.1-13.el9 local 38 k
依存関係のインストール:
nginx-core x86_64 1:1.20.1-13.el9 local 567 k
nginx-filesystem noarch 1:1.20.1-13.el9 local 11 k
rocky-logos-httpd noarch 90.14-1.el9 local 24 k
トランザクションの概要
====================================================================================================================================================================================================
インストール 4 パッケージ
合計サイズ: 640 k
インストール後のサイズ: 1.8 M
パッケージのダウンロード:
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
準備 : 1/1
scriptletの実行中: nginx-filesystem-1:1.20.1-13.el9.noarch 1/4
インストール中 : nginx-filesystem-1:1.20.1-13.el9.noarch 1/4
インストール中 : nginx-core-1:1.20.1-13.el9.x86_64 2/4
インストール中 : rocky-logos-httpd-90.14-1.el9.noarch 3/4
インストール中 : nginx-1:1.20.1-13.el9.x86_64 4/4
scriptletの実行中: nginx-1:1.20.1-13.el9.x86_64 4/4
検証 : nginx-1:1.20.1-13.el9.x86_64 1/4
検証 : nginx-core-1:1.20.1-13.el9.x86_64 2/4
検証 : nginx-filesystem-1:1.20.1-13.el9.noarch 3/4
検証 : rocky-logos-httpd-90.14-1.el9.noarch 4/4
インストール済み:
nginx-1:1.20.1-13.el9.x86_64 nginx-core-1:1.20.1-13.el9.x86_64 nginx-filesystem-1:1.20.1-13.el9.noarch rocky-logos-httpd-90.14-1.el9.noarch
完了しました!
インストールできました。
以上でローカルリポジトリを作る話はおしまいです。
他にも「NGINXを使ってプライベートリポジトリを作る」という文脈で説明されている方法もあります通り、やり方は幾通りもあります。
とりあえず簡単に管理できる方法として以上書かせて頂きました。