転載・引用について

ユーザ用ツール

サイト用ツール


tweet:2016:1018_01

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である。

  1. freebsd-update -r 11.0 upgrade
  2. freebsd-update install
  3. reboot
  4. freebsd-update install
  5. (場合によってpkg-static upgrade -f pkgを先に実行)
  6. pkg update
  7. pkg upgrade
  8. portsnap fetch
  9. portsnap update
  10. (場合によってfreebsd-update installを実行)
  11. 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問題はこのthreadreadline問題はこのthreadを参照。

というわけで、対処としては、

export RUBY_CONFIGURE_OPTS="--with-openssl-dir=/usr/local --with-readline-dir=/usr/local"
rbenv install 2.3.1

などとし、opensslの関連がInstallされているディレクトリを明示的に渡すこと。

# 正直、こんなのわからないよ…orz

このウェブサイトはクッキーを使用しています。 Webサイトを使用することで、あなたはあなたのコンピュータにクッキーを保存することに同意します。 また、あなたはあなたが私たちのプライバシーポリシーを読んで理解したことを認めます。 同意しない場合はウェブサイトを離れてください。クッキーに関する詳細情報
tweet/2016/1018_01.txt · 最終更新: 2016/10/25 16:45 by 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki