TT Lab
はじめる
学ぶ 学習パス コース

RHEL系の管理

createrepo_cとrepodata

TT Labで続きを見る

一言でいうと

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で更新します。