tkuchikiの日記

新ブログ https://blog.tkuchiki.net

【CentOS 6, Amazon Linux 対応】 unbound と ldns の RPM 作成方法

epel repo から unbound が削除されました。

追記: CentOS6 の extras に unbound が入っているという情報をいただきました。@hfm さんありがとうございます!

無いなら作りましょう、ということで RPM 作成方法です。

検証環境

手順

CentOS 6 は unbound の tarball を取得して、同梱されている spec ファイルを少し書き換えて build すれば良いのですが、Amazon Linux には unbound が依存している ldns-devel がありません。
そのため、まず ldns の RPM を作ります。

yum-builddep と spectool を使うので、以下の package をインストールします。

yum install -y yum-utils rpmdevtools

ldns

まず、ldns の tarball に spec ファイルが同梱されているので取り出します。

curl -sO https://www.nlnetlabs.nl/downloads/ldns/ldns-1.6.17.tar.gz
tar zxf ldns-1.6.17.tar.gz ldns-1.6.17/packaging/fedora/ldns.spec

ldns.spec の改行コードに CR がついているため rpmbuild に失敗するので削除します。

cat ldns-1.6.17/packaging/fedora/ldns.spec | tr -d \\r > ~/rpmbuild/SPECS/ldns.spec
## nkf でも OK
# nkf -Lu --overwrite ldns-1.6.17/packaging/fedora/ldns.spec
# mv ldns-1.6.17/packaging/fedora/ldns.spec ~/rpmbuild/SPECS/ldns.spec

そのまま spec ファイルを使うと Amazon Linux だとエラーがでます。
具体的には、

  • %{__python}python
    • /usr/bin/python が python2.7 になっていても %{__python} が python2.6 となるため、dist-package の path が 2.6 になるので no such file or directory でエラー
  • Source: の URL の typo でエラー

diff は以下のとおりです。

4,5c4,5
< %{!?python_sitelib: %global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
< %{!?python_sitearch: %global python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib(1)")}
---
> %global python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")
> %global python_sitearch %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib(1)")
10c10
< Version: 1.6.13
---
> Version: 1.6.17
14c14
< Source: http://www.nlnetlabs.nl/downloads/%{%name}/%{name}-%{version}.tar.gz
---
> Source: http://www.nlnetlabs.nl/downloads/%{name}/%{name}-%{version}.tar.gz

diff には含めていないですが、%changelog も更新しましょう。

次に、依存パッケージをインストールします。

yum-builddep -y ~/rpmbuild/SPECS/ldns.spec

tarball を ~/rpmbuild/SOURCES 以下に配置します。

spectool -R -g ~/rpmbuild/SPECS/ldns.spec
## mv でも OK
# mv ldns-1.6.17.tar.gz ~/rpmbuild/SOURCES/

準備が整ったので build します。

rpmbuild -ba ~/rpmbuild/SPECS/ldns.spec

これで ldns の RPM ができました。

unbound

まず、unbound の tarball に spec ファイルが同梱されているので取り出します。

curl -sO http://unbound.net/downloads/unbound-1.5.10.tar.gz
tar zxf unbound-1.5.10.tar.gz unbound-1.5.10/contrib/unbound.spec
mv unbound-1.5.10/contrib/unbound.spec ~/rpmbuild/SPECS/

unbound はバージョン以外は修正しなくても build できるので、 Version を書き換えます。 diff は以下のとおりです。

3c3
< Version: 1.4.18
---
> Version: 1.5.10

こちらも diff には含めていないですが、%changelog も更新しましょう。

次に、依存パッケージをインストールします。 自前の yum repo に ldns を追加していない場合は、build した RPM を予めインストールする必要があります。

rpm -ivh ~/rpmbuild/RPMS/x86_64/ldns-1.6.17-1.amzn1.x86_64.rpm ~/rpmbuild/RPMS/x86_64/ldns-devel-1.6.17-1.amzn1.x86_64.rpm
yum-builddep -y ~/rpmbuild/SPECS/unbound.spec

tarball を ~/rpmbuild/SOURCES 以下に配置します。

spectool -R -g ~/rpmbuild/SPECS/unbound.spec
## mv でも OK
# mv unbound-1.5.10.tar.gz ~/rpmbuild/SOURCES/

Docker Container 上で RPM を build する場合に root で作業を行った際、spec ファイルの permission を変更しないと error: Bad owner/group /path/to/unbound.spec というエラーがでました。
その場合は以下のコマンドを実行します。

chown root: ~/rpmbuild/SPECS/unbound.spec

準備が整ったので build します。

rpmbuild -ba ~/rpmbuild/SPECS/unbound.spec

これで unbound の RPM ができました。

まとめ

ldns と unbound は spec ファイルが用意されているので少し書き換えるだけで RPM を作ることができました。
改行コードでエラーになるという問題は初めて遭遇したので勉強になりました。

追記(2017-03-31 17:05)

unbound.spec の useradd-m がついてないため /var/unbound が作成されない問題があるようです。
以下のように修正すればよいです。

- useradd -r -g unbound -d /var/unbound -s /sbin/nologin \
+ useradd -r -g unbound -m -d /var/unbound -s /sbin/nologin \

あと、configure--with-libevent をつけて build して libevent を使うようにしないと、

$ unbound -c /var/unbound/unbound.conf
Mar 31 08:17:33 unbound[9597:0] warning: too many file descriptors requested. The builtinmini-event cannot handle more than 1024. Config for less fds or compile with libevent
Mar 31 08:17:33 unbound[9597:0] warning: continuing with less udp ports: 477

のようなエラーがでる場合がありました(パラメータを調整すれば出ないようにすることもできました)。