【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 でエラー
- /usr/bin/python が python2.7 になっていても
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
のようなエラーがでる場合がありました(パラメータを調整すれば出ないようにすることもできました)。