createrepo_cとrepodata
一言でいうと
createrepo_cは、rpmディレクトリを走査して、repodata/を作ります。その中のrepomd.xmlが、ほかのメタデータファイルを指す目次です。
なぜ必要なのか
ディレクトリにRPMファイルをコピーするだけでは、dnfのリポジトリにはなりません。dnfは毎回すべてのパッケージを開くのではなく、repodataのバージョン・依存関係・ファイル一覧を照会します。そのため、パッケージを追加してもメタデータを更新しないと、サーバーのファイルとクライアントが見る一覧が食い違います。この違いを知っていれば、キャッシュや権限の問題と、リポジトリの生成漏れを区別できます。
どう動くのか
dnf install -y createrepo_c
createrepo_c /srv/repo/labhub
ls -1 /srv/repo/labhub/repodata/
# repomd.xml
# <checksum>-primary.xml.gz
# <checksum>-filelists.xml.gz
# <checksum>-other.xml.gz
| ファイル | 内容 |
|---|---|
repomd.xml |
目次。各メタデータの場所・チェックサム・時刻 |
primary |
名前、バージョン、依存関係、概要 |
filelists |
パッケージが含むすべてのファイルの一覧 |
other |
changelog |
dnf provides '*/nginx.conf'のようなファイルベースの検索ができる理由が、filelistsです。
ファイル名の前のチェックサムの接頭辞は、--unique-md-filenames(デフォルト)の結果です。途中のプロキシやCDNが古いコピーを返す事故を防ぎます。ファイル名が内容によって変わるので、キャッシュが混乱しません。
主なオプション
| オプション | ドキュメント上の動作 |
|---|---|
--update |
「ファイルサイズとmtimeを基準に、変更されていないrpmの既存のメタデータを再利用」 |
--workers N |
rpmを読むワーカー数 |
-g、--groupfile |
compsグループファイルを含める |
-s、--checksum |
repomdとパッケージのチェックサムの種類。デフォルトはsha256 |
--compress-type |
bz2、gz、zck、zstd、xz |
-i、--pkglist |
含めるパッケージ一覧のファイル |
--retain-old-md N |
古いrepodataの保持数 |
-x、--excludes |
除外パターン |
-d/--database(sqlite生成)はdeprecatedです。古い手順書でこのオプションを見かけたら、削除してかまいません。
--pkglistをマニフェストと連携させるのがよい慣行です。持ち込みマニフェストをそのままpkglistとして使うと、一覧と実際のリポジトリがずれる事故を、構造的に防げます。
更新
パッケージを追加したあとは、必ずメタデータを作り直します。
createrepo_c --update /srv/repo/labhub
dnf clean expire-cache
dnf repolist
--updateを書き忘れるのが、エアギャップ環境で最も多い報告の原因の1位です。ファイルは目に見えるのに、dnfは知りません。
repoファイルと検証
[labhub-local]
name=LabHub local (snapshot 2026-08-20)
baseurl=file:///srv/repo/labhub
enabled=1
gpgcheck=0
metadata_expire=-1
動作確認の3種類です。
dnf repolist -v
dnf repoclosure --repo=labhub-local
dnf install --assumeno <패키지>
dnf repoclosureは、リポジトリ内で解決されない依存関係を持つパッケージを一覧表示します。持ち込み前のゲートとして使うのに、最も適したツールです。
createrepo_c /srv/bundle/rpms
dnf repoclosure --repofrompath=bundle,/srv/bundle/rpms --repo=bundle
--repofrompathは、.repoファイルを作らずに、一時的にリポジトリを指定します。検証スクリプトで便利です。
古いパッケージの整理
dnf repomanage --old --keep 2 /srv/repo/labhub
dnf repomanage --old --keep 2 /srv/repo/labhub | xargs -r rm -v
createrepo_c --update /srv/repo/labhub
何個残すかが、そのままロールバックできる範囲です。持ち込みの周期が月1回で、3個を残すなら、約3か月分のロールバックが可能です。
現場での姿
リポジトリの表示名にスナップショットの日付を入れる。name=... (snapshot 2026-08-20)のように書いておくと、半年後にdnf repolist -vの1行で時点を特定できます。
次のラボですること
rpmを集めてcreaterepo_cでリポジトリを作り、.repoファイルを作成し、そのリポジトリだけを有効にしてインストールし、パッケージを追加したあと--updateで更新します。