ローカルYum/DNFリポジトリの構築:ネットワーク遅延やオフライン環境での「救世主」 solution

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

ソフトウェアリポジトリと、低速ネットワークに苦しんだ日々

社会人になりたての頃、ある銀行向けに50台のCentOS 7サーバーをデプロイする業務を任されたことがあります。しかし、セキュリティ上の理由でラボ環境はインターネットから完全に隔離されていました。当時は、htopvimといった簡単なツールをインストールするだけでさえ一苦労でした。個別のRPMファイルを一つずつコピーし、依存関係(dependencies)の迷宮を手作業で一日中解き明かさなければなりませんでした。

その「苦い経験」を経て、ローカルリポジトリ(内部ソフトウェアリポジトリ)が不可欠であることを痛感しました。海外のミラーサイトから数MB/sの速度でダウンロードするのを待つ代わりに、1Gbpsや10GbpsのLAN経由でパッケージを取得できれば、インストールは一瞬で終わります。さらに重要なのは、システム内のすべてのサーバーが確実に特定のソフトウェアバージョンを共有できることです。

ここでは、CentOS、Rocky Linux、またはAlmaLinuxでリポジトリを構築するために私が普段行っている手順を紹介します。

クイックスタート:既存フォルダから5分でローカルリポジトリを作成する

手元に.rpmファイルのセットがあり、それをyumやdnfが認識できるリポジトリに変換したい場合は、以下の手順に従ってください。

  1. ツールをインストールする:
sudo yum install createrepo -y
  1. ディレクトリを準備する: ここではパッケージを /opt/my-local-repo に置くと仮定します。
sudo mkdir -p /opt/my-local-repo
# ここに.rpmファイルをコピーします
sudo cp /path/to/your/packages/*.rpm /opt/my-local-repo/
  1. リポジトリのメタデータを作成する:
sudo createrepo /opt/my-local-repo/
  1. システムに登録する: Yumがこのリポジトリを認識できるように、新しい設定ファイルを作成します。
sudo vi /etc/yum.repos.d/local.repo

ファイルに以下の内容を貼り付けます:

[local-repo]
name=My Local Repository
baseurl=file:///opt/my-local-repo/
enabled=1
gpgcheck=0

これで、インターネットなしで自由に yum install を使用できるようになります。

なぜ大規模システムでは常にローカルリポジトリが使われるのか?

上記の方法はそのマシン単体でしか機能しません。実務では、インフラ全体の「倉庫番」となるサーバーを1台構築するのが一般的です。このソリューションは、以下の3つの深刻な問題を解決します。

  • 帯域幅の節約: インターネット経由でアップデートをダウンロードする必要があるのは1台だけです。残りの100台のサーバーは、LAN経由でその倉庫番サーバーから直接データを取得します。
  • バージョン管理: 互換性のない新バージョンに自動更新されてアプリケーションが壊れるという惨事を防ぐことができます。
  • エアギャップ(Air-gapped)環境: 金融系や政府機関など、サーバーを外部ネットワークに一切接続できないシステムでは必須の標準構成です。

CentOS 7からAlmaLinuxへの移行をサポートした際、内部リポジトリを使用することでパッケージの待機時間を70%削減できました。

Nginxを使用したHTTP経由のローカルリポジトリ展開

LAN内の他のクライアントマシンからアクセスできるように、Nginxを使用してリポジトリディレクトリを公開します。

ステップ1:Nginxのインストールと設定

sudo yum install nginx -y
sudo systemctl enable --now nginx

ファイルを配信するためのサーバーブロック設定ファイルを作成します:

sudo vi /etc/nginx/conf.d/repo.conf
server {
    listen       80;
    server_name  repo.local;
    root         /var/www/html/repos;

    location / {
        autoindex on; # ファイル一覧を表示する
        allow all;
    }
}

ステップ2:ディレクトリ構造を整理する

OSやバージョンごとにディレクトリを分けるのが運用のコツです:

sudo mkdir -p /var/www/html/repos/centos/7/os/x86_64/
sudo createrepo /var/www/html/repos/centos/7/os/x86_64/

アクセスエラーを防ぐためにNginxに権限を付与します:

sudo chown -R nginx:nginx /var/www/html/repos
sudo chmod -R 755 /var/www/html/repos

ステップ3:クライアント側の設定

クライアントマシンで、リポジトリ設定ファイルが先ほど構築したサーバーのIPアドレスを指すように設定します:

[internal-repo]
name=Internal Central Repo
baseurl=http://192.168.1.100/centos/7/os/x86_64/
enabled=1
gpgcheck=0
priority=1

公式ミラーからのデータ同期(Sync)

各RPMファイルを手動でダウンロードするのは非常に手間がかかります。完全なミラーを作成するには、yum-utils パッケージに含まれる reposync ツールを使用します。

例えば、CentOS 7の base リポジトリ全体をローカルに取得するには:

sudo yum install yum-utils -y
sudo reposync -r base -p /var/www/html/repos/centos/7/os/x86_64/ --download-metadata

注意:完全なリポジトリは10GBから50GB以上の容量になることがあります。コマンドを実行する前にディスク容量を確認してください。

スムーズに運用するためのTips

運用中に気づいた、トラブルを避けるための注意点をまとめます:

  • メタデータの更新: 新しい .rpm ファイルを追加するたびに、必ず createrepo --update /path/to/repo を実行してください。この手順を忘れると、ディレクトリにファイルがあってもクライアント側から新しいパッケージが見えません。
  • キャッシュのクリア: クライアント側でパッケージが見つからない場合は、yum clean all && yum makecache を試してください。
  • SELinux: Nginxが403エラーを返す場合、SELinuxによってブロックされている可能性があります。次のコマンドでディレクトリに権限を付与してください:chcon -Rt httpd_sys_content_t /var/www/html/repos
  • ファイアウォール: ポート80を開放するのを忘れないでください:firewall-cmd --permanent --add-service=http && firewall-cmd --reload

内部リポジトリの構築は難しくありませんが、それに見合う価値は十分にあります。5台以上のサーバーを管理しているなら、すぐにローカルリポジトリを構築することをお勧めします。国際回線にトラブルが発生した際や、深夜にソフトウェアをロールバックする必要がある際、迅速な対応を可能にしてくれます。

Share: