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 の仕組みは便利ですね。
コメント