AlmaLinux8というかRHEL8かな。

企業の本番環境って割とネットと遮断されている事が多いので、パッケージのアップデートとかインストールなんかをオフラインでやる必要がある。

その際、一般的(?)にはローカルにRPM持って来てリポジトリ作ってやると思うのですが、RHEL8系だとモジュール管理されてるパッケージのリポジトリって作るの無理だと思うのでその辺の内容を特筆。

いつもは、RPM持ってきた後に createrepo でローカルリポジトリを作るのですが、一部のモジュールが入ってると、下記の様なエラーがでる。

Problem 1: cannot install both perl-libs-4:5.24.4-404.module+el8.1.0+2926+ce7246ad.x86_64 and perl-libs-4:5.26.3-416.el8.x86_64
  - package perl-Digest-1.17-396.module+el8.1.0+2926+ce7246ad.noarch requires perl(:MODULE_COMPAT_5.24.4), but none of the providers can be installed
  - cannot install the best update candidate for package perl-libs-4:5.26.3-416.el8.x86_64
  - cannot install the best update candidate for package perl-Digest-1.17-395.el8.noarch

で、これの原因(?)がcreaterepoだとmodule.ymlが作成されてなくて、モジュールのメタ情報を参照できないってことみたい。

なので、RPMなりを持ってきた際に、該当リポジトリのキャッシュが下記の様な場所に出来るのですが、そこにリポジトリのmodule.ymlが入ってるので、それをコピーしてローカルリポジトリでモジュールのメタ情報を作るって流れが一番手っ取り早そう。

参考: https://bugzilla.redhat.com/show_bug.cgi?id=1795936

具体的には例えば、

# とりあえずパッケージの依存関係全て含んだDLしてローカルリポジトリを更新
sudo dnf download --alldeps --resolve --disablerepo=myhogealma git
sudo cp -f /var/tmp/repowork/* /usr/local/myhogerepo/Packages/
sudo createrepo --update /usr/local/myhogerepo

# 下記の場所にキャッシュが出来てるので、そこからmodules.yaml.gzをコピってくる
gunzip -c /var/cache/dnf/appstream-..../repodata/.....-modules.yaml.gz > /tmp/appstream-modules.yaml

# そしたらローカルリポジトリにyamlを格納して
sudo mv /tmp/appstream-modules.yaml /usr/local/myhogerepo/
cd /usr/local/myhogerepo/
sudo mv appstream-modules.yaml modules.yaml

# モジュールメタ情報の更新する
sudo modifyrepo_c --mdtype=modules modules.yaml repodata/
sudo createrepo --update /usr/local/myhogerepo
sudo dnf clean all

これでmoduleのメタ情報がないよエラーは解消できた。

絶対まともなやりかたじゃない(笑

でもこれしか楽なやり方が思いつかなかった。

まー、問答無用でリモートリポジトリのミラーサイトをローカルに作っちゃえばよいのですが、

とんでもないサイズになるので、資源持ち込んだりを考えるとやりにくいんですよね。

なので必要なパッケージだけに絞りたいわけで。。。


RHEL9系からはcreaterepoだけで上手くいくんですけどね。。。