createrepo_cでリポジトリを作る
目標
rpmを集めてcreaterepo_cでリポジトリを作り、.repoファイルで登録して、そのリポジトリだけでインストールします。
なぜ重要なのか
エアギャップ環境で最も多い報告である「リポジトリに入れたのに見えない」の原因の1位が、createrepo_c --updateの漏れです。ファイルは目に見えるのに、dnfは知りません。2番目がクライアントのキャッシュです。この2つの順序を身につければ、その報告の90%は数分で片付きます。
そしてrepomd.xmlの構造を知っていると、何がリポジトリにあって何がないかを判断できます。たとえば、updateinfoがないと、dnf update --securityが静かに何もしません。
ステップ
/root/repo/poolディレクトリを作成し、treeパッケージとその依存関係をインストールせずに、そのディレクトリへダウンロードしてください。.rpmが1つ以上ある必要があります。createrepo_cで/root/repo/poolにメタデータを作成してください。repodata/repomd.xmlができている必要があります。/etc/yum.repos.d/labhub-local.repoを作成してください。リポジトリIDはlabhub-localで、nameにはスナップショットの日付(snapshotという文字列とYYYY-MM-DD)が入っている必要があり、baseurl=file:///root/repo/pool、enabled=1、gpgcheck=0、metadata_expire=-1を含める必要があります。- キャッシュを更新し、リポジトリ一覧を
/root/repo/repolist.txtに保存してください。labhub-localが表示されている必要があります。 - ほかのリポジトリをすべて無効にして
labhub-localだけを有効にした状態で、treeを再インストールし、そのコマンドの出力を/root/repo/install.txtに保存してください。 nanoパッケージをpoolに追加でダウンロードしたあと、メタデータを増分更新し、更新後のlabhub-localリポジトリのパッケージ数を、数字1行で/root/repo/pkgcount.txtに書いてください。repomd.xmlからメタデータの種類名だけを取り出して、1行に1つずつ/root/repo/mdtypes.txtに書いてください。primary、filelists、otherがすべてある必要があります。/root/repo/report.txtを次の4行で作成してください。REPO_ID=labhub-local/PACKAGES=<6번 값>/MDTYPES=<7번 파일의 줄 수>/HAS_UPDATEINFO=<yes|no>(プレースホルダーは順に、ステップ6の値、ステップ7のファイルの行数、yesかnoのどちらかです)
参考
- ダウンロードは
dnf download --resolve --destdir=/root/repo/pool treeです。 - 1つのリポジトリだけを使うには、
dnf --disablerepo='*' --enablerepo=labhub-local install -y treeの形です。すでに入っていて、もう一度取得したいときは、install --reinstallではなく、reinstallサブコマンドを使ってください。このdnf(4.14)では、install --reinstallはunrecognized argumentsで失敗します。 - 増分更新は
createrepo_c --update /root/repo/poolです。 - リポジトリごとのパッケージ数は、
dnf --disablerepo='*' --enablerepo=labhub-local list available --all | wc -lなどで数えられます。repoqueryも使えます。 - よくある間違い1: ステップ6で、再インデックスのあとに
dnf clean expire-cacheを実行せず、古い情報を見てしまう場合です。 - よくある間違い2: ステップ3で、
baseurlのスラッシュの数を間違える場合です。ローカルパスはfile://のあとに絶対パスが来るので、スラッシュは3つです。
rpmを集める
/root/repo/poolディレクトリを作成し、treeパッケージとその依存関係をインストールせずに、そのディレクトリへダウンロードしてください。.rpmが1つ以上ある必要があります。
dnfには、インストールせずにrpmだけをダウンロードするコマンドがあります。依存関係まで取得するオプションも一緒に使ってください。
メタデータの生成
createrepo_cで/root/repo/poolにメタデータを作成してください。repodata/repomd.xmlができている必要があります。
createrepo_cにディレクトリを渡すと、その下にrepodataが作られます。
リポジトリ定義の作成
/etc/yum.repos.d/labhub-local.repoを作成してください。リポジトリIDはlabhub-localで、nameにはスナップショットの日付(snapshotという文字列とYYYY-MM-DD)が入っている必要があり、baseurl=file:///root/repo/pool、enabled=1、gpgcheck=0、metadata_expire=-1を含める必要があります。
yum.repos.dの下の.repoファイルです。角括弧の中がリポジトリIDで、name、baseurl、enabledが必須です。
キャッシュの更新と確認
キャッシュを更新し、リポジトリ一覧を/root/repo/repolist.txtに保存してください。labhub-localが表示されている必要があります。
メタデータキャッシュに期限切れの印を付けたあと、リポジトリ一覧を見ます。新しいリポジトリが表示されている必要があります。
そのリポジトリだけでインストール
ほかのリポジトリをすべて無効にしてlabhub-localだけを有効にした状態で、treeを再インストールし、そのコマンドの出力を/root/repo/install.txtに保存してください。
すべてのリポジトリを無効にして、1つだけを有効にするオプションの組み合わせがあります。
パッケージ追加後の更新
nanoパッケージをpoolに追加でダウンロードしたあと、メタデータを増分更新し、更新後のlabhub-localリポジトリのパッケージ数を、数字1行で/root/repo/pkgcount.txtに書いてください。
rpmを入れて再インデックスして初めて、dnfに見えます。増分更新のオプションがあります。
repomd.xmlの構造の確認
repomd.xmlからメタデータの種類名だけを取り出して、1行に1つずつ/root/repo/mdtypes.txtに書いてください。primary、filelists、otherがすべてある必要があります。
各メタデータの種類は、type属性で示されます。種類名だけを取り出してみてください。
リポジトリのレポート
/root/repo/report.txtを次の4行で作成してください。
REPO_ID=labhub-local / PACKAGES=<6번 값> / MDTYPES=<7번 파일의 줄 수> / HAS_UPDATEINFO=<yes|no>(プレースホルダーは順に、ステップ6の値、ステップ7のファイルの行数、yesかnoのどちらかです)
パッケージ数とメタデータの種類をまとめてください。値は実際の確認結果である必要があります。