FreeBSD 11.0 Release
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である。
- freebsd-update -r 11.0 upgrade
- freebsd-update install
- reboot
- freebsd-update install
- (場合によってpkg-static upgrade -f pkgを先に実行)
- pkg update
- pkg upgrade
- portsnap fetch
- portsnap update
- (場合によってfreebsd-update installを実行)
- reboot
のような手順でいいのだが、今回は少しハマったので愚痴を兼ねて。
まだ、SLB系とDNS系しかupgradeしていないのでこのくらいだが、もしかしたらもっと出るかもしれない…出たら追記する。
knot DNS 2.3.0
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 使ってなければ問題はでないはずなので、出ない可能性もある
追記
どうしても納得がいかなかったのでもう少し調べたら、以下の事実が判明した。
- FreeBSD 10.0までは、そもそもrecvmmsgは存在していない
- もともと
recvmsg
は存在している。recvmmsg
は、11.0になって追加された。 - glibcには存在していることから、おそらくはportされたのだろうと思うけど、そこまで見てない
- knotDNS 2.3.0は、recvmmsgが壊れている場合に備えて、recvmmsgを利用しないようにするconfigure optionが存在する。
というわけで、とりあえず、以下のようにして対処
# 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について)
recvmmsgは、systemcallの一つであって、recvmsgの拡張である。
このシステムコールを使うことで、recvmsgと比較して以下のメリットがある。
- 一回のsyscall呼び出しでソケットから複数のメッセージを受信できる
- 受信操作においてタイムアウトがサポートされる
確かに、DNS Server、特にQueryが多いDNSサーバーには大きな意味がありそうな気がする。
recvmmsgシステムコールは Linux kernel 2.6.33 で追加されている。glibc 2.12 以降で利用可能できる。 FreeBSDの場合、11.0からこれが利用できるようになっている。
rbenv+ruby
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