インターネットに接続されていない環境でLinux OSインストールをしたり、追加PKGをインストールしたりする場合は、ローカルリポジトリが必要です。今回は、ローカルリポジトリの構築方法を記載します。題材として扱うのはRHEL9.6です。
ローカルリポジトリの用途
ローカルリポジトリの用途には、以下の2つがあると思っています。
① DVDメディアやUSBスティックメモリからOSを初期インストールした後に、追加したいPKGをインストールする。
② PXEbootを利用して、ローカルリポジトリからOSを初期インストールする。
②のほうは、PXEbootに関する知識が必要ですし、DHCPサーバやTFTPサーバの構築も必要になるので、ちょっと敷居が高いです。①のほうはずっと簡単です。
1. 簡易なローカルリポジトリ
(1) ファイルシステム上にリポジトリを作成する
ISO形式のインストールメディアがあるなら、それをiso9660形式でマウントしてしまうのが一番簡単です。それだけでローカルなリポジトリになります。
以下の例では、/tmpに置いたISO形式のRHEL9.6インストールメディアを/media/rhel-9.6-x86_64にmountしています。
# mkdir /media/rhel-9.6-x86_64
# mount -t iso9660 -o loop /tmp/rhel-9.6-x86_64-dvd.iso /media/rhel-9.6-x86_64
このように作成したローカルリポジトリを、PKGの追加インストールのために使用したい場合は、
/etc/yum.repos.d/local.repo (ファイル名は local.repo でなくても良いです) を以下の内容で作成します。
[local-rhel-9.6-for-x86_64-baseos-rpms]
name=Red Hat Enterprise Linux 9.6 for x86_64 - BaseOS (local)
baseurl=file:///media/rhel-9.6-x86_64/BaseOS
enabled=1
gpgcheck=0
[local-rhel-9.6-for-x86_64-appstream-rpms]
name=Red Hat Enterprise Linux 9.6 for x86_64 - AppStream (local)
baseurl=file:///media/rhel-9.6-x86_64/AppStream
enabled=1
gpgcheck=0
この記述はあくまでも例です。[ ]で囲まれた文字列は repo id で、name で指定した文字列はレポジトリの名前です。他と重複しないように好きな名前を付けてください。basrurl=に指定するURLは、先のISOメディアのmount先となります。
dnf repolistを実行して、定義した通りのrepo idと名前が表示されればOKです。
# dnf repolist
サブスクリプション管理リポジトリーを更新しています。
repo id repo の名前
local-rhel-9.6-for-x86_64-appstream-rpms Red Hat Enterprise Linux 9.6 for x86_64 - AppStream (local)
local-rhel-9.6-for-x86_64-baseos-rpms Red Hat Enterprise Linux 9.6 for x86_64 - BaseOS (local)
/etc/yum.repos.d/ 配下に他のリポジトリ定義ファイルがあれば、それも表示されます。そのリポジトリがネットワーク上のもので、かつ、そのネットワークに疎通ができない状態にあるのであれば、そのリポジトリ定義の中で「enabled=0」にするか、ファイル自体をどこかに退避しておいたほうが良いです。
RHELの場合、サブスクリプション登録の操作を行わないと、有効なリポジトリ定義ファイルは作成されません。
(2) ローカルネットワーク上にリポジトリを作成する
1台のサーバに対してPKGを追加インストールするなら、(1)の方法でリポジトリを作成するのが一番楽です。多数台のサーバに対してPKGを追加インストールするなら、1台のサーバにhttpサーバをインストールして、ネットワーク経由でアクセスできるリポジトリを作成するほうが効率が良いです。
まずは、httpサーバをインストールしましょう。以下はapacheをインストールする方法です。
# dnf -y install httpd
apacheをインストールしたら、/etc/httpd/conf/httpd.conf において、ServerName行だけ定義しましょう。今回、httptサーバをインストールしたホストのIPアドレスが 192.168.2.210 なので、以下の通り定義しています。
ServerName 192.168.2.210:80
apacheの起動、及び自動起動の設定もしておきます。
# systemctl enable httpd
# systemctl start httpd
次に、リポジトリをhttpdのコンテンツとして配信するために、/var/www/html/ 配下にリポジトリに必要となるファイル一式を配置します。
私の環境では、/var/www/html/repositories/ というディレクトリを作成し、その下にレポジトリのディレクトリを作成することにしました。レポジトリのディレクトリとファイル一式は、先のISOメディアの中身をまるごとコピーするのも良いのですが、この例ではあくまでも簡易なリポジトリなので、以下のようにシンボリックリンクで作成することにします。
# ln -s /media/rhel-9.6-x86_64 /var/www/html/repositories
シンボリックリンク作成後、/var/www/html/repositories/rhel-9.6-x86_64/ 配下のファイルの内容は以下のようになっています。
# ls -l /var/www/html/repositories/rhel-9.6-x86_64/
合計 45
drwxr-xr-x 1 root root 2048 4月 9 09:05 AppStream
drwxr-xr-x 1 root root 2048 4月 9 09:05 BaseOS
drwxrwxr-x 1 root root 2048 4月 9 08:13 EFI
-r--r--r-- 1 root root 8154 4月 9 08:05 EULA
-r--r--r-- 1 root root 18092 4月 9 08:05 GPL
-r--r--r-- 1 root root 1669 4月 9 08:05 RPM-GPG-KEY-redhat-beta
-r--r--r-- 1 root root 3682 4月 9 08:05 RPM-GPG-KEY-redhat-release
-r--r--r-- 1 root root 2135 4月 9 09:05 extra_files.json
drwxrwxr-x 1 root root 2048 4月 9 08:13 images
drwxrwxr-x 1 root root 2048 4月 9 08:13 isolinux
-r--r--r-- 1 root root 103 4月 9 09:05 media.repo
ネットワーク上のリポジトリを参照する場合は、/etc/yum.repos.d/local.repo を以下の例を参考にして作成します。この例では、basrurlの指定に、httpサーバとなるサーバのIPアドレスとリポジトリのパスが定義されています。
[local-rhel-9.6-for-x86_64-baseos-rpms]
name=Red Hat Enterprise Linux 9.6 for x86_64 - BaseOS (local)
baseurl=http://192.168.2.210/repositories/rhel-9-x86_64/BaseOS
enabled=1
gpgcheck=0
[local-rhel-9.6-for-x86_64-appstream-rpms]
name=Red Hat Enterprise Linux 9.6 for x86_64 - AppStream (local)
baseurl=http://192.168.2.210/repositories/rhel-9-x86_64/AppStream
enabled=1
gpgcheck=0
/etc/yum.repos.d/local.repo を作成するのは、リポジトリとなるサーバのほうではなく、PKGをインストールしたいクライアントホストのほうなのでお間違いなく。
2. ちゃんとしたローカルリポジトリを構築する
「ちゃんとしたローカルリポジトリ」って表現が変ですね。要するに、インターネットに接続できない環境のために、インターネット上のリポジトリと同じ機能を持つローカルリポジトリを構築する、という意味です。
今回のシナリオは、以下の通りです。1台だけインターネットにアクセスできるサーバがあります。これをローカルリポジトリとして運用します。その他に多数台のホストがありますが、インターネットにはアクセスできません。それ故、ローカルリポジトリとなるサーバからPKG更新等を行います。

ルーティングを設定したり、httpプロキシを設置して、全てのホストがインターネットにアクセスできるようにする方法もありますが、インターネットへのアクセス量が多くなりますし、PKGの更新タイミングをローカルリポジトリでコントロールできるというメリットがありますので、今回はローカルリポジトリを構築することにしています。
(1) リポジトリの作成に必要となるPKGをインストール
ローカルリポジトリとなるサーバで以下のコマンドを実行して、必要なPKGをインストールします。
# dnf -y install createrepo dnf-plugins-core yum-utils
(2) リポジトリのディレクトリを作成
今回のリポジトリディレクトリは、
/var/www/html/repositories/rhel-9-x86_64/BaseOS/
/var/www/html/repositories/rhel-9-x86_64/AppStream/
とします。
さて、リポジトリに格納する初期データは、ISOメディアの内容からコピーするのが良いと思っていましたが、ISOメディア内のデータ構造と、RedHatのリポジトリのデータ構造には、以下の違いがあることが分かりました。
・ISOメディアでは、BaseOS/Packages/, AppStream/Packages/ 直下に *.rpmファイルが置かれている。
・RedHatのリポジトリからDownloadしたデータでは、BaseOS/Packages/<x>/, AppStream/Packages/<x>/ のように先頭の頭文字(<x>は頭文字の英数字)のサブディレクトリの下に *.rpmファイルが置かれている。
ISOメディアとRedHatのリポジトリからDownloadしたデータの両方をローカルリポジトリに格納すると、同じrpmファイルが
/var/www/html/repositories/rhel-9-x86_64/BaseOS/Packages/xxx.rpm
/var/www/html/repositories/rhel-9-x86_64/BaseOS/Packages/x/xxx.rpm
のように重複して存在することになってしまうため、ISOメディアからローカルリポジトリにコピーすることはやめて、
/var/www/html/repositories/rhel-9-x86_64/BaseOS/Packages/
/var/www/html/repositories/rhel-9-x86_64/BaseOS/Packages/
というディレクトリだけ作成しておきます。
(3) RedHatのリポジトリから最新PKGをDownload
(2)までの操作では、RHEL9のローカルリポジトリは空の状態です。
RHELの最新PKGは、RedHatのリポジトリからDownloadして、コピーをします。

RedHatのリポジトリを利用するには、RedHatのサブスクリプション登録が必要です。
ローカルリポジトリとなるホストだけでなく、OSインストール及びPKGを更新する対象のホストすべてのサブスクリプション登録が必要となるので、その点に注意して下さい。
RedHatのリポジトリを参照するための設定 /etc/yum.repos.d/redhat.repo は、ISOメディアからインストールした直後は空です。RedHatのサブスクリプションを登録すると、きちんとした内容が定義されます。以後の操作は、ローカルリポジトリとなるサーバでサブスクリプション登録が済んでいることが前提です。サブスクリプション登録の操作方法は、コチラを参照して下さい。
① PKGのDownloadの前にdnfのキャッシュをクリア
# dnf clean all
② PKGをDownload
以下のようにreposyncコマンドを実行して、RedHatのリポジトリから最新PKGをDownloadします。
# reposync --repoid=rhel-9-for-x86_64-baseos-rpms \
--download-path=/var/www/html/updates/ \
--newest-only
# reposync --repoid=rhel-9-for-x86_64-appstream-rpms \
--download-path=/var/www/html/updates/ \
--newest-only
「–repoid=」に指定するのは、RedHatのBaseOS及びAppStreamのリポジトリのrepo idです。
/etc/yum.repos.d/redhat.repo を参照して該当するrepo idを指定します ([ ]で囲まれた文字列が repo idです)。
「–newest-only」は最新PKGだけをDownloadする指定です。これを指定しないと全てのPKGがDownloadされるので転送サイズが大きくなります。
「–download-path=」に指定するのは、PKGのDownload先です、パスはどこでも良いです。
ここでは、/var/www/html/updatesを指定しているので、このディレクトリ配下に更に repo-idの名前のサブディレクトリが作成されて、その配下にDownloadされます。
# ls -l /var/www/html/updates/
合計 0
drwxr-xr-x 3 root root 22 7月 27 12:01 rhel-9-for-x86_64-appstream-rpms
drwxr-xr-x 3 root root 22 7月 27 11:58 rhel-9-for-x86_64-baseos-rpms
(4) DownloadしたPKGをローカルリポジトリにコピーする
rsyncコマンドを使って、Download先ディレクトリから、ローカルリポジトリのディレクトリにファイルのコピーを行います。
# rsync -av \
/var/www/html/updates/rhel-9-for-x86_64-baseos-rpms/Packages \
/var/www/html/repositories/rhel-9-x86_64/BaseOS
# rsync -av \f
/var/www/html/updates/rhel-9-for-x86_64-appstream-rpms/Packages \
/var/www/html/repositories/rhel-9-x86_64/AppStream
cp -rp でも良いとは思いますが、rsyncは更新したファイルのみ転送するので効率が良いです。
rsyncコマンドの使い方については、コチラを参照して下さい。
(5) createrepoコマンドでリポジトリを作成
createrepoコマンドは、リポジトリのメタデータを作成するコマンドです。
メタデータは、BaseOSとAppStreamのそれぞれに必要なので、それぞれのディレクトリに対してcreaterepoコマンドを実行します。
# createrepo /var/www/html/repositories/rhel-9-x86_64/BaseOS
# createrepo /var/www/html/repositories/rhel-9-x86_64/AppStream
createrepoを上記の通り実行すると、以下のメタデータのディレクトリが作成されます。
/var/www/html/repositories/rhel-9-x86_64/BaseOS/repodata/
/var/www/html/repositories/rhel-9-x86_64/BaseOS/repodata/
以後、RedHatのレポジトリから新しいPKGをDownloadして、ローカルリポジトリにコピーしていくことになりますが、その場合は、以下のように実行してメタデータを更新します。
# createrepo --update /var/www/html/repositories/rhel-9-x86_64/BaseOS
# createrepo --update /var/www/html/repositories/rhel-9-x86_64/AppStream
もし、運用していく中でメタデータとPKGの状態の不整合が発生した場合は、メタデータのディレクトリをまるごと削除して、createrepoでメタデータを再作成することで保全ができます。
# rm -rf /var/www/html/repositories/rhel-9-x86_64/BaseOS/repodata/
# createrepo /var/www/html/repositories/rhel-9-x86_64/BaseOS
# rm -rf /var/www/html/repositories/rhel-9-x86_64/AppStream/repodata/
# createrepo /var/www/html/repositories/rhel-9-x86_64/AppStream
不安があるときは、いつでもこのようにしてメタデータを再作成すれば良いと思います。
(6) groupinstallのための対応
(5)までの操作でPKG単独のインストールはできるようになりますが、groupinstallを行うと以下のようなエラーとなります。
# dnf -y groupinstall "Development Tools"
~
Red Hat Enterprise Linux 9 for x86_64 - BaseOS (local) 51 MB/s | 2.1 MB 00:00
Red Hat Enterprise Linux 9 for x86_64 - AppStream (local) 91 MB/s | 7.6 MB 00:00
メタデータの期限切れの最終確認: 0:00:01 前の 2025年08月10日 11時45分02秒 に実施しました。
モジュールまたはグループ 'Development Tools' は利用不可です。
エラー: 行うべきことはありません。
このエラーの対処方法は、以下の通りです。
① ISOメディアの中から、*comps*.xml を取り出し、ローカルリポジトリのrepodata/配下にコピー
# cp -p \
/media/rhel-9.6-x86_64/BaseOS/repodata/fe6d6d6ff3a082bf1e68272be67c2b23f258f00f9bfcbff0b8fc140f30fd4c21-comps-BaseOS.x86_64.xml \
/var/www/html/repositories/rhel-9-x86_64/BaseOS/repodata/
# cp -p \
/media/rhel-9.6-x86_64/AppStream/repodata/17dca0b52f979aaecf15dc78d31cc4867599779459da000073c5788f50dd7359-comps-AppStream.x86_64.xml \
/var/www/html/repositories/rhel-9-x86_64/AppStream/repodata/
② groupメタデータを作成
# createrepo -g \
/var/www/html/repositories/rhel-9-x86_64/BaseOS/repodata/fe6d6d6ff3a082bf1e68272be67c2b23f258f00f9bfcbff0b8fc140f30fd4c21-comps-BaseOS.x86_64.xml \
/var/www/html/repositories/rhel-9-x86_64/BaseOS
# createrepo -g \
/var/www/html/repositories/rhel-9-x86_64/AppStream/repodata/17dca0b52f979aaecf15dc78d31cc4867599779459da000073c5788f50dd7359-comps-AppStream.x86_64.xml \
/var/www/html/repositories/rhel-9-x86_64/AppStream
③ groupinstall可能なPKGグループを確認
# LANG=C
# dnf group list
Updating Subscription Management repositories.
Last metadata expiration check: 0:01:55 ago on Sun Aug 10 12:06:08 2025.
Available Environment Groups:
Server with GUI
Server
Workstation
Custom Operating System
Installed Environment Groups:
Minimal Install
Virtualization Host
Installed Groups:
Console Internet Tools
Development Tools
RPM Development Tools
Scientific Support
Security Tools
System Tools
Available Groups:
Legacy UNIX Compatibility
Container Management
.NET Development
Graphical Administration Tools
Headless Management
Network Servers
Smart Card Support
クライアントホストで、もしこのようにグループの一覧が表示できない場合は、以下のコマンドを実行してキャッシュをクリアしてから再度試してみてください。
# dnf clean all
広告主へのリンク
おうちでLinuxやるなら、ミニPCがちょうど良いです(私はこの3台を使っています)。
RHEL10をインストールするなら、CPUのISAレベルはx86_64-v3以上でないとならないので、NucBox M7がお勧め、RHEL9までならx86_64-v2のCPUにも対応しているので、GK41とNucBox G3でもOKです。
このブログにおける関連リンク
・RHEL10がインストールできた(GUIインストール)
・Rocky Linux 9.5をインストールする
・犬でも分かるrsync(1): rsyncの基本
・犬でも分かるsquid : httpプロキシ



コメント