FreeBSD 11.0 Releaseが出ている。 元々は、8月くらいにShipされるはずだったのだが、OpenSSLを始めとする様々な脆弱性が公開されたことから、その対応を待って公開することになったものだ。 そのせいもあって、Release時点で11.0-RELEASEではなく11.0-RELEASE-p1として公開された。
# 実際には、11.0 は少し前に公開されたのだが、脆弱性問題があるので使うな!ということになっていた。
さて、というわけで、手元のFreeBSD 10.3で動いているServerを11.0にupgradeしようとしたメモを。
FreeBSDはOSのUpgradeが原則としてとても簡単なOSである。
のような手順でいいのだが、今回は少しハマったので愚痴を兼ねて。
まだ、SLB系とDNS系しかupgradeしていないのでこのくらいだが、もしかしたらもっと出るかもしれない…出たら追記する。
11.0-RELEASE-p1 のlibcに含まれているrecvmmsgにはBUGがあり、ある条件下のUDPパケットに関してmsg_lenが設定されない。 これによって、(少なくとも)knotDNS 2.3.0及び2.3.1においてDNS ServerへのUDP Queryを受け付けてくれない問題が発生する。
つまり、DNS Serverとして動作しなくなるわけでとても困る。
この問題は https://github.com/freebsd/freebsd/commit/3fa64907439c00965fb0cbb222a6bf073c452630 で解決したみたいだが、これいつになったら取り込まれて配布されるのだろうか…
とりあえず、knotを利用する場合は、10.3で凌ぐしかあるまいと思われる。
# もちろん、libcを作り直して頑張る手はある。 # しかし、試験環境ならともかく、公開サーバーでそういう運用やったら、更新時に死ぬのは目に見えている。忘れるから。
あとこの問題はUDPで割に発生しそうな問題だから、AsteriskとかUDPで通信するアプリに影響が出る可能性があるんじゃないかと。
# もちろん、recvmmsg 使ってなければ問題はでないはずなので、出ない可能性もある
どうしても納得がいかなかったのでもう少し調べたら、以下の事実が判明した。
recvmsgは存在している。recvmmsgは、11.0になって追加された。というわけで、とりあえず、以下のようにして対処
# cd /usr/ports/dns
# cp -rp knot2 knot23
# cd knot23
=== 以下 diff file ===
# diff -cr knot2 knot23
diff -cr knot2/Makefile knot23/Makefile
*** knot2/Makefile Mon Oct 17 16:53:48 2016
--- knot23/Makefile Tue Oct 18 11:22:28 2016
***************
*** 2,8 ****
# $FreeBSD: head/dns/knot2/Makefile 421635 2016-09-09 19:42:46Z amdmi3 $
PORTNAME= knot
! PORTVERSION= 2.3.0
CATEGORIES= dns ipv6
MASTER_SITES= https://secure.nic.cz/files/knot-dns/ \
http://dns-lab.com/downloads/knot-dns/
--- 2,8 ----
# $FreeBSD: head/dns/knot2/Makefile 421635 2016-09-09 19:42:46Z amdmi3 $
PORTNAME= knot
! PORTVERSION= 2.3.1
CATEGORIES= dns ipv6
MASTER_SITES= https://secure.nic.cz/files/knot-dns/ \
http://dns-lab.com/downloads/knot-dns/
***************
*** 28,33 ****
--- 28,34 ----
GNU_CONFIGURE= yes
CONFIGURE_ARGS= --with-rundir=/var/run/knot \
--with-storage=/var/db/knot \
+ --enable-recvmmsg=no \
--with-pkgconfigdir=${PREFIX}/libdata/pkgconfig
INSTALL_TARGET= install-strip
diff -cr knot2/distinfo knot23/distinfo
*** knot2/distinfo Mon Oct 17 16:53:47 2016
--- knot23/distinfo Tue Oct 18 01:38:43 2016
***************
*** 1,3 ****
--- 1,5 ----
TIMESTAMP = 1470789106
SHA256 (knot-2.3.0.tar.xz) = 8abf9a6562ecf2f7f4222d16ca6c75463399870db360eda7caa40530b469533c
+ SHA256 (knot-2.3.1.tar.xz) = 42e4ec64dc8f017329d1753eb074a5759d6bb380e1f2a272101adccc0552f9b4
SIZE (knot-2.3.0.tar.xz) = 1066852
+ SIZE (knot-2.3.1.tar.xz) = 1072808
diff -cr knot2/pkg-plist knot23/pkg-plist
*** knot2/pkg-plist Mon Oct 17 16:53:48 2016
--- knot23/pkg-plist Tue Oct 18 01:54:20 2016
***************
*** 72,79 ****
lib/libdnssec.so.2.0.0
lib/libknot.a
lib/libknot.so
! lib/libknot.so.3
! lib/libknot.so.3.0.0
lib/libzscanner.a
lib/libzscanner.so
lib/libzscanner.so.1
--- 72,79 ----
lib/libdnssec.so.2.0.0
lib/libknot.a
lib/libknot.so
! lib/libknot.so.4
! lib/libknot.so.4.0.0
lib/libzscanner.a
lib/libzscanner.so
lib/libzscanner.so.1
***************
*** 87,93 ****
man/man1/knot1to2.1.gz
man/man1/knsec3hash.1.gz
man/man1/knsupdate.1.gz
- man/man1/kzonecheck.1.gz
man/man5/knot.conf.5.gz
man/man8/keymgr.8.gz
man/man8/knotc.8.gz
--- 87,92 ----
***************
*** 95,98 ****
sbin/keymgr
sbin/knotc
sbin/knotd
- sbin/kzonecheck
--- 94,96 ----
勢い余って2.3.1にしてしまったが、2.3.0で行くなら、Makefileで
CONFIGURE_ARGS= --with-rundir=/var/run/knot \
--with-storage=/var/db/knot \
+ --enable-recvmmsg=no \
--with-pkgconfigdir=${PREFIX}/libdata/pkgconfig
だけ対処すれば良いはず。(試してない)
recvmmsgは、systemcallの一つであって、recvmsgの拡張である。
このシステムコールを使うことで、recvmsgと比較して以下のメリットがある。
確かに、DNS Server、特にQueryが多いDNSサーバーには大きな意味がありそうな気がする。
recvmmsgシステムコールは Linux kernel 2.6.33 で追加されている。glibc 2.12 以降で利用可能できる。 FreeBSDの場合、11.0からこれが利用できるようになっている。
FreeBSD 11.0 で Redmine を NGINX 環境で動かしている際に、rbenv で ruby が作れなくなるという症状が発生。
この原因は、pkg(ports)から NGINX を導入する際に OpenSSL を pkg としてインストールしているからという事が判明。 さらに、libreadlineも見つけてくれなかった。
詳しいことは OpenSSL問題はこのthread、readline問題はこのthreadを参照。
というわけで、対処としては、
export RUBY_CONFIGURE_OPTS="--with-openssl-dir=/usr/local --with-readline-dir=/usr/local" rbenv install 2.3.1
などとし、opensslの関連がInstallされているディレクトリを明示的に渡すこと。
# 正直、こんなのわからないよ…orz