午前2時の帯域の悪夢
午前2時にシステムを保守している場面を想像してみてください。急ぎでKubernetesクラスターをデプロイするか、20台のFedoraサーバーにセキュリティパッチを適用する必要があります。しかし、ちょうどその時、国際回線の調子が悪くなりました。数十台のサーバーでdnf updateのプログレスバーが数KB/sずつしか進まないのを眺めるのは、まさに忍耐力の試練です。
Fedoraをメインマシンとして2年間使用してきましたが、このエコシステムには非常に満足しています。しかし、各サーバーが個別にインターネットから数GBのデータをダウンロードするのは、リソースの大きな無駄です。ローカルDNFミラーはこの問題を根本から解決します。内部ネットワークの帯域を最大限に活用し、ネットワークインフラに応じて1Gbps、あるいは10Gbpsの速度を実現できます。
インフラの準備:途中でディスク容量不足にならないために
コマンドを入力する前に、十分なストレージ容量を持つサーバー(物理または仮想)を用意しましょう。Fedoraリポジトリはかなり容量が大きく、時間の経過とともに肥大化します。
- OS: Fedora Server 40(または最新バージョン)。
- 容量: ReleaseおよびUpdates用として最低200GB。EverythingやDebuginfoリポジトリもミラーリングする場合は、数TB必要になります。
- ツール:
dnf-utilsおよびcreaterepo_c。
まず、同期用パッケージとWebサーバーをインストールします。
sudo dnf install dnf-utils createrepo_c nginx -y
ステップ1:ストレージディレクトリの計画
私は通常、専用のハードディスクを/repoにマウントします。これにより、リポジトリデータをシステムパーティションから分離し、ディスクがいっぱいになったときにシステムがハングアップするリスクを避けることができます。
sudo mkdir -p /repo/fedora/releases/40/Everything/x86_64/os/
sudo mkdir -p /repo/fedora/updates/40/Everything/x86_64/
ヒント:40の部分は、実際にデプロイしているFedoraのバージョンに置き換えてください。
ステップ2:Reposyncによるデータの同期
これは、最初のセットアップで最も時間がかかる工程です。reposyncを使用して、公式ミラーからすべてのパッケージをローカルマシンにプルします。通常のdnfとは異なり、reposyncはローカルリポジトリを構築するためにオリジナルのコピーをダウンロードします。
fedoraリポジトリ(オリジナルリリース版)の同期:
sudo reposync --repoid=fedora --download-metadata --p=/repo/fedora/releases/40/Everything/x86_64/os/
updatesリポジトリ(最新のパッチ)の同期:
sudo reposync --repoid=updates --download-metadata --p=/repo/fedora/updates/40/Everything/x86_64/
重要な注意点: 数十GBのデータをダウンロードするプロセスは中断されやすいです。SSH接続が切断された場合に備えて、tmuxやscreen内でコマンドを実行し、セッションを維持することをお勧めします。
ステップ3:Createrepoによるメタデータの初期化
.rpmファイルのダウンロードが完了しても、メタデータがなければクライアントマシンは利用できません。インデックスファイルを作成するためにcreaterepo_cを使用する必要があります。このツールはC言語で書かれているため、古いPython版よりも処理速度が格段に速いです。
sudo createrepo_c /repo/fedora/releases/40/Everything/x86_64/os/
sudo createrepo_c /repo/fedora/updates/40/Everything/x86_64/
ステップ4:Nginxを「配信ステーション」として設定する
クライアントマシンがHTTP経由でリポジトリにアクセスできるように、軽量なNginxを使用するのが最適です。
/etc/nginx/conf.d/repo.confに新しい設定ファイルを作成します:
server {
listen 80;
server_name repo.lab.local;
root /repo;
location / {
autoindex on;
allow all;
}
}
Nginxがデータを読み取れるように権限を設定し、SELinuxでWebサービスの動作を許可することを忘れないでください:
sudo chown -R nginx:nginx /repo
sudo chmod -R 755 /repo
sudo setsebool -P httpd_enable_homedirs on
sudo chcon -Rt httpd_sys_content_t /repo
サービスを有効化し、ファイアウォールを開放します:
sudo systemctl enable --now nginx
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
ステップ5:クライアントマシンをローカルミラーに向ける
いよいよ成果を確認する時です。LAN内のFedoraマシンで、デフォルトのリポジトリを一時的にバックアップし、内部サーバーを参照するように設定します。
古いファイルを整理します:
sudo mkdir /etc/yum.repos.d/backup
sudo mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/
以下の内容で/etc/yum.repos.d/local-fedora.repoファイルを作成します:
[local-fedora]
name=Fedora $releasever - Local
baseurl=http://repo.lab.local/fedora/releases/$releasever/Everything/$basearch/os/
enabled=1
gpgcheck=0
[local-updates]
name=Fedora $releasever - Updates - Local
baseurl=http://repo.lab.local/fedora/updates/$releasever/Everything/$basearch/
enabled=1
gpgcheck=0
次のコマンドで速度を確認します:
sudo dnf clean all && sudo dnf makecache
sudo dnf update
パッケージのダウンロード速度が、ローカルネットワークカードの制限のみに依存するようになったことがわかります。
日次の更新の自動化
リポジトリのデータは、頻繁に更新しないとすぐに古くなってしまいます。午前3時に実行され、最新のパッチを自動的に同期する小さなスクリプトを作成しましょう。
スクリプト /usr/local/bin/sync-repo.sh を作成します:
#!/bin/bash
# 容量を節約するため、最新のパッケージのみをダウンロードする
reposync --repoid=updates --download-metadata --p=/repo/fedora/updates/40/Everything/x86_64/ --newest-only
createrepo_c --update /repo/fedora/updates/40/Everything/x86_64/
スクリプトが自動実行されるようにCronjobを設定します:
0 3 * * * /usr/local/bin/sync-repo.sh > /var/log/repo-sync.log 2>&1
最後に
ローカルDNFミラーの構築は、最初は時間がかかるように思えるかもしれませんが、複数のサーバーを管理するシステム管理者にとっては価値のある投資です。光ファイバーのトラブルを心配したり、サーバークラスターの更新に何時間も待機したりする必要はもうありません。5台以上のFedoraマシンを管理している場合は、ぜひ今日から導入を検討してみてください。

