Redhat系Linuxで、レポジトリーに無いプログラムやperlモジュールのRPMを作成する

【環境】

RockyLinux 9.0

【開発機を準備】

最近は、仮想OSがPCでも使える(VirtualBoxとか)ので便利。
RPMをリビルドする際は、かなり多くのRPMを入れる。RPM化が済むとRPM化する為にインストールしたRPMは、通常稼働中は使われないので、
リビルドマシンを準備したほうが、色々とメリットが大きい。

【リビルド時に必要なRPMをインストール】

準備として
・ リビルドする為のディレクトリツリーの作成 (rpmdev-setuptreeコマンドを利用)
・ ソースやソースRPMからRPMを作成するコマンド (rpmbuild)
・ perlモジュールからRPMを作成するコマンド (cpanflute2)

# dnf install rpmdevtools yum-utils gcc perl-CPAN

cpanflute2 (RPM-Specfile)は、RPMが無いのでCPANからインストール

# cpan
cpan[1]> make RPM::Specfile
/usr/bin/make -- OK OKが表示されたので、
cpan[2]> install RPM::Specfile
cpan[3]> exit

【リビルドする】

同じディストリビューションのLinux。今回で言えば、Redhat系のソースRPMであれば、SPECファイルをいじる必要は、ほとんどありません。
※ パッケージ情報(rpm -qip xxxxx.rpm で出てくる情報)を書き換える必要がある場合などは、SPECファイルからRPMを作成します。
※  この記事では一撃Buildを行っていますが、"Release" 番号とか、"Source RPM" の情報は変更したほうが良いかも・・・とは思いますが。

今回の例では、CentOS7の「logcheck-1.3.15-2.el7.src.rpm」ソースRPMを持ってきてリビルドします。
※ 著者が利用しているサイト
RPMfind https://www.rpmfind.net/
RockyLinux pkgs.org https://rockylinux.pkgs.org/
meta::cpan https://metacpan.org/
を利用しています。

(1) ビルドツリーを作成する

一般ユーザで、
[開発機] $ cd ~
[開発機] $ rpmdev-setuptree
これで、rebuildディレクトリ (ビルドツリー)が出来上がる
→ 以前は、このmkdirでディレクリーを作ったり、変数を設定したり面倒だったが、rpmdev-setuptreeで完結

(2) リビルド

[ソースRPMから]
[開発機] $ cd ~/rpmbuild/SRPMS
[開発機] $ wget "https://download.fedoraproject.org/pub/epel/7/SRPMS/Packages/l/logcheck-1.3.15-2.el7.src.rpm"
[開発機] $ cd ~
[開発機] $ rpmbuild --rebuild --clean rpmbuild/SRPMS/logcheck-1.3.15-2.el7.src.rpm
             error: Failed build dependencies:
             docbook-utils is needed by logcheck-1.3.15-2.el9.noarch

はい。後はひたすら依存関係に必要なパッケージを追い求める。レポジトリーにあれば、ラッキーである。
一般ユーザとrootユーザーにスイッチするので、コマンド行の # と $ の違いでユーザーが違う事を留意頂きたい。

[開発機] # dnf --enablerepo=crb install docbook-utils
[開発機] $ rpmbuild --rebuild --clean rpmbuild/SRPMS/logcheck-1.3.15-2.el7.src.rpm

画面に実行ログが出てきて、リビルド成功すれば、rpmbuild/RPMS配下にRPMが出来上がっている。

検証機に作成したRPMをファイル転送して、
[検証機] # dnf install logcheck-1.3.15-2.el9.noarch.rpm
           エラー:
             問題: 競合するリクエスト
             - lockfile-progs が提供されません logcheck-1.3.15-2.el9.noarch に必要です
             - perl-mime-construct が提供されません logcheck-1.3.15-2.el9.noarch に必要です
               (インストール不可のパッケージをスキップするには、'--skip-broken' を追加してみてください または、'--nobest' を追加して、最適候補のパッケージのみを使用しないでください)

リビルド中には依存関係のエラーが出なくても、実際にRPMインストール時にエラーが出た。
やはり、レポジトリーに見つからないので、lockfile-progs と perl-mime-construct も作ることになる。

[開発機] $ cd ~/rpmbuild/SRPMS
[開発機] $ wget "https://download-ib01.fedoraproject.org/pub/epel/8/Everything/SRPMS/Packages/l/lockfile-progs-0.1.17-13.el8.src.rpm"
[開発機] $ cd ~
[開発機] $ rpmbuild --rebuild --clean rpmbuild/SRPMS/logcheck-1.3.15-2.el7.src.rpm
             error: Failed build dependencies:
                     liblockfile-devel is needed by lockfile-progs-0.1.17-13.el9.x86_64
[開発機] # dnf install --enablerepo=crb liblockfile-devel.x86_64
[開発機] $ rpmbuild --rebuild --clean rpmbuild/SRPMS/lockfile-progs-0.1.17-13.el8.src.rpm

[perlモジュールのRPM化]

[開発機] $ cd ~/rpmbuild/SOURCES
[開発機] $ wget "https://cpan.metacpan.org/authors/id/R/RO/ROSCH/mime-construct-1.11.tar.gz"
[開発機] $ cpanflute2 --buildall rpmbuild/SOURCES/mime-construct-1.11.tar.gz
             Can't locate YAML.pm in @INC (you may need to install the YAML module) (@INC contains: /usr/local/lib64/perl5/5.32 /usr/local/share/perl5/5.32 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5) at /usr/local/bin/cpanflute2 line 17.
             BEGIN failed--compilation aborted at /usr/local/bin/cpanflute2 line 17.
[開発機] # dnf install perl-YAML
[開発機] $ cpanflute2 --buildall rpmbuild/SOURCES/mime-construct-1.11.tar.gz

検証機に作成したRPMをファイル転送して、
[検証機] # dnf install logcheck-1.3.15-2.el9.noarch.rpm perl-mime-construct-1.11-8.noarch.rpm lockfile-progs-0.1.17-13.el9.x86_64.rpm

ようやく検証機で、作成した logcheck RPMがインストールできた。

【本番機へインストール】

検証機でインストール出来たので、本番機へもインストール。
※ コマンドは検証機にインストールした手順と同じなので割愛

【最後に】

PerlモジュールもソースRPMからRPMを作成する方法もあるが、私が試した際には依存関係の問題で上手くRPM化出来なかった。
※ SPECファイルを見ても、依存するPerlモジュールはインストールされているのに、rpmbuildを実行すると、依存するPerlモジュールが無いと表示され解決出来なかった。

logcheckをソースファイルからRPM化すれば、こんなに手間では無かったかもしれない。
ただ、CentOS7の際に使っていた logcheck RPM内にはフィルター設定のレシピファイルが多数収録されているので、今回 logcheckをソースRPMからリビルドしたかった。
(ソースからビルドすると、レシピファイルは入っていなかった)

タグ

関連エントリー