RPMのコンパイルオプションを変更してインストールする方法

Linux
Linux
スポンサーリンク

RPM は、CentOSなどRedHat系のOSで使われている、パッケージ管理システムです。実際には RPM の依存関係を考慮して、インストールなどをしてくれる yumコマンド を使って、RPM パッケージを扱うことが多いかと思います。

RPM パッケージに含まれる、ソフトやライブラリはコンパイル済なので、ソースファイルからコンパイル(ビルド)する手間を軽減できます。便利な仕組みなのですが、稀にコンパイルオプションを変更して、インストールしたくなる時があります。そこで今回は、RPM パッケージのコンパイルオプションを変更して、インストールする方法ご紹介いたします。

今回は、SSL/TLSライブラリ「GnuTLS」のコンパイルオプションを変更して、インストールしてみました。

下準備

rpmbuild と yum-utils のインストール

RPMの作成に必要な rpmbuild コマンドと、SRPMのダウンロードに使う yumdownloader (yum-utils) をインストールします。

yum -y install rpm-build
yum -y install yum-utils

rpmbuild 実行用の「mockbuild」ユーザを作成

useradd mockbuild

rpmbuild コマンドを root ユーザで実行すると、システムを破損する可能性があるそうです。くわばらくわばら(^^;)

Building RPMs should NEVER be done with the root user. It should ALWAYS be done with an unprivileged user. Building RPMs as root might damage your system. You have been warned.

HowTos/SetupRpmBuildEnvironment - CentOS Wiki より引用

RPM ソースパッケージ(SRPM)のダウンロード

RPM パッケージの元となる、ソースパッケージ(SRPM)をダウンロードします。

rpmbuild 実行用の「mockbuild」ユーザに切換えます。

su mockbuild 
cd /home/mockbuild/ 

CentOS-Sourceリポジトリを有効にして、GnuTLS の RPMソースパッケージをダウンロードします。

yumdownloader --enablerepo=base-source --source gnutls

拡張子「.src.rpm」の SRPMファイルがダウンロードされます。

gnutls-3.3.8-12.el7.src.rpm

SPECファイルを修正して、コンパイルオプションを変更

ソースパッケージを rpm コマンドでインストールします。(通常のインストールとは違い、ソースファイルなどが展開されるのみです)

rpm -ivh gnutls-3.3.8-12.el7.src.rpm

同じ場所に「rpmbuild」というディレクトリが作成され、この中にソースファイルや、SPECファイルが入っています。

$ ls rpmbuild/* 

rpmbuild/SOURCES: 
gnutls-3.1.11-nosrp.patch            gnutls-3.3.8-fips140-rsa.patch        gnutls-3.3.8-padlock-disable.patch 
(略) 

rpmbuild/SPECS: 
gnutls.spec ←SPECファイル

SPECファイルの「%build」セクションに、コンパイルオプションの指定があります。
今回はオプションに「--without-tpm」を加えます。

vi rpmbuild/SPECS/gnutls.spec

%configure --with-libtasn1-prefix=%{_prefix} \
         ↓ 
%configure --without-tpm --with-libtasn1-prefix=%{_prefix} \

上記オプションにより、RPMパッケージを作成するのに tpmtool が不要になりますので、下記をコメントにしておきます。

%{_bindir}/tpmtool
 ↓ 
#%{_bindir}/tpmtool

RPM パッケージの作成

修正した SPECファイルを元に、バイナリパッケージを作成します。

rpmbuild -bb rpmbuild/SPECS/gnutls.spec

依存するライブラリが不足している場合は、以下のようなエラーが表示されます。

エラー: ビルド依存性の失敗: 
        p11-kit-devel >= 0.20.7 は gnutls-3.3.8-12.el7.centos.x86_64 に必要とされています 
        readline-devel は gnutls-3.3.8-12.el7.centos.x86_64 に必要とされています 
        libtasn1-devel >= 3.8 は gnutls-3.3.8-12.el7.centos.x86_64 に必要とされています 
        texinfo は gnutls-3.3.8-12.el7.centos.x86_64 に必要とされています 
        autogen-libopts-devel >= 5.18 は gnutls-3.3.8-12.el7.centos.x86_64 に必要とされています 
        autogen は gnutls-3.3.8-12.el7.centos.x86_64 に必要とされています 
        nettle-devel >= 2.7.1 は gnutls-3.3.8-12.el7.centos.x86_64 に必要とされています 
        trousers-devel >= 0.3.11.2 は gnutls-3.3.8-12.el7.centos.x86_64 に必要とされています 
        libidn-devel は gnutls-3.3.8-12.el7.centos.x86_64 に必要とされています 
        gperf は gnutls-3.3.8-12.el7.centos.x86_64 に必要とされています 
        unbound-devel は gnutls-3.3.8-12.el7.centos.x86_64 に必要とされています 

root ユーザに切換えて、不足しているライブラリをインストールしましょう。

exit
yum -y install nettle-devel
yum -y install p11-kit-devel
yum -y install readline-devel
yum -y install libtasn1-devel
yum -y install texinfo
yum -y install autogen-libopts-devel
yum -y install trousers-devel
yum -y install libidn-devel
yum -y install gperf
yum -y install unbound-devel

再度 mockbuild ユーザに切換えて、バイナリパッケージを作成します。(時間がかかります)

su mockbuild
cd /home/mockbuild/
rpmbuild -bb rpmbuild/SPECS/gnutls.spec

rpmbuild/RPMS/ 以下に、バイナリパッケージが作成されます。

ls -1 rpmbuild/RPMS/x86_64/

gnutls-3.3.8-12.el7.centos.x86_64.rpm
gnutls-c++-3.3.8-12.el7.centos.x86_64.rpm
gnutls-dane-3.3.8-12.el7.centos.x86_64.rpm
gnutls-debuginfo-3.3.8-12.el7.centos.x86_64.rpm
gnutls-devel-3.3.8-12.el7.centos.x86_64.rpm
gnutls-utils-3.3.8-12.el7.centos.x86_64.rpm

作成した RPM パッケージのインストール

普段通り、root ユーザに切換え rpm コマンドで、作成した RPMパッケージをインストールすればOKです。

今回作成した GnuTLS の RPM は、既にインストールされているため「 --force」オプションを付けて強制インストールしました。

rpm -ivh --force /home/mockbuild/rpmbuild/RPMS/x86_64/gnutls-3.3.8-12.el7.centos.x86_64.rpm

終わりに

今回は、CentOS7.1.1503 + Zabbix2.4 で発生する不具合に対応するため、GnuTLS のコンパイルオプションを変更する必要がありました。こういった時にも rpmbuild の仕組みは便利ですね。

コメント

タイトルとURLをコピーしました