10月 182015
 

ちょっと前のエントリで「Zeroconf 考察。」というのを書きました。デスクトップで利用する場合には Avahi を、サーバで利用するなら mDNSResponder+howl で。って感じのエントリでした。

さて。サーバ側で利用している mDNSResponder (正確には mdnsd のこと) ですが、こいつは非常にお行儀の悪いプログラムですねぇ。さすがは Apple 謹製って感じでしょうか;-P。

どの辺りがお行儀悪いのか?

mdnsd は起動してからのログが随分と出力されます。例えば、サーバの場合は複数のインターフェースを持っていて、アクセスされたくないインターフェースには ipfw などで止めたりします。しかし、 mdnsd はそんなのお構いなしにサーバの全てのポートにマルチキャスト DNS パケットを port:5353 に流しまくりなんですね。

挙句の果てには『bge1 にパケット投げたら Permission denied だった。』とかログを出しまくりで、ヘタしたら /var/log/messages は mDNSResponder のログで溢れかえっしまいます。

これは非常にウザいので今回はログを一つのファイルに集約するようにして /var/log/messages には出力しないようにしてみましょう。
まずは syslog の設定から。あ。ターゲットは当然 FreeBSD です;-)。

 
o. syslog の設定
今回は mdnsd のログは今回は LOCAL4 に出力するようにします。なので、LOCAL4 に飛んできた syslog の扱いについて設定します。

まずは /etc/syslog.conf の設定変更です。

        :
*.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err;local4.none       /var/log/messages
        :
#
local4.*        /var/log/mdns.log
#
        :

 
/var/log/messages に出力されたくないので local4.none を追加します。そして LOCAL4 ファシリティ用のログファイルを設定してあげます。

次に /etc/newsyslog.conf も編集しましょうかね。

        :
/var/log/mdns.log                       644  7     100  *     JC
        :

 
まぁ、こんな感じで登録します。あとは syslod と newsyslog を restart すると準備は完了です。

 
o. mDNSResponder のソース改修
mDNSResponder は ports 的には net/mDNSResponder/ になります。ここでまず make patch とか打ってソースを展開したうえでソースコードを覗いてみます。今回は syslog に関わる部分ですね。

と、いうか mDNSResponder (バイナリ自体は ports の net/howl/ でインストールされる) と、いうか mdnsd (こちらが ports の net/mDNSResponder/ がインストールする) は syslog プライオリティなどを変更するオプションが無いんですね。なのでソースコードを眺めんですけども。

それで、ソースコードを眺めいたらありましたね。 syslog の openlog は mDNSShared/PlatformCommon.c でやっているようですね。

以下はパッチです。

--- mDNSShared/PlatformCommon.c.orig    2012-06-30 13:52:35.000000000 +0900
+++ mDNSShared/PlatformCommon.c 2015-10-16 10:57:01.595162000 +0900
@@ -184,7 +184,7 @@
             fflush(stderr);
         }

-        if (!log_inited) { openlog(ident, LOG_CONS, LOG_DAEMON); log_inited++; }
+        if (!log_inited) { openlog(ident, LOG_CONS, LOG_LOCAL4); log_inited++; }

 #if APPLE_OSX_mDNSResponder && LogTimeStamps
         if (ident && ident[0] && mDNSPlatformClockDivisor)

 
openlog() のオプションで LOG_DAEMON と書かれているので syslog.conf では daemon.none を設定すれば良いような気がしないでも無いですが LOG_DAEMON なプライオリティは他のアプリケーションもドカドカと利用しているような気がするので、今回は LOG_LOCAL4 に変更してみます。

上記パッチは net/mDNSResponder/files/ の中に patch-mDNSShared-PlatformCommon.c としてほーり込むと ports の make 時に毎回有効になるかと思われます。自分の好みでどうにかしてください。

また、僕は LOG_LOCAL4 にしましたが、自分の都合のようプライオリティに変更しても良いのではないかと思われます。

あとは make して deinstall して reinstall 、そしてデーモンを再起動すると全ては完了です。 /etc/syslog.conf に指定した情報の通り、 /var/log/messages 以外のファイルに蓄積されるようになるかと思われます。

 
mDNSResponder と mdnsd は非常に良いのですが、出力されるログが非常に気になるのですが、これで問題解決;-)。

ports の Makefile 自体を改修して make config でログのプライオリティを変更するようにもできるなぁ;-)。
機会があれば書いてみよう;-)。

10月 162015
 

FreebSD の ports-CURRENT を追いかけていると、時々はまります。今回は graphics/dri のコンパイルが通らないので、その回避策について書いておきます。

まぁ、こーいうネタは時間が経つと解決するので、エントリを書いてもあまり意味は無いとは思うのですけどね。

今どきですと /usr/ports/ 辺りで svn update を実行すると dri 周りは 10.6.9 になります。 libGL 周りなど mesa-10.6.9 を利用する ports は全部で六個くらいでしょうかね。

FreeBSD/amd64 ではコンパイルの途中で止まってしまいます。 FreeBSD/arm ではとあるライブラリがねーぜ。とか言われて configure 辺りで止まってしまいます。今回は両方のアーキテクチャの回避策について書いてみたいと思います。

 
o. FreeBSD/amd64
mesa-10.6.9 からなる dri 系の ports は llvm36+clan36 が必要になりました。関連性で devel/llvm36 と lang/clang36 がインストールされるのですが、こいつらのインストールがちゃんとできていても失敗しているような感じでコンパイルが途中で止まるようです。

以下のエントリで話し合われていて、既にクローズになっているようですね。

https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=203192

手順としては

# pkg delete -f llvm36-3.6.2_2
# pkg delete -f clang36-3.6.2
# rm -r /usr/local/llvm36/

 
してから再度インストールして、それから graphics/dri をコンパイルすると無事に通るようです。

どーしてこうなるんだろうなぁ? と、思うのですが、思い当たる点としては llvm35 既にインストールされている状態で llvm36 がインストールされて、『二個もいらねーじゃん。』とか思い llvm36 は残して llvm35 だけ削除したのですが、もしかしたらそれが原因かもしれません。

と、いうことで llvm* の痕跡を全て削除してから再インストールすると mesa-10.6.9 系の ports 一式がインストールされるようになります。

めでたしめでたしですね。

 
o. FreeBSD/arm
こちらのほうは、まず、上記の問題を解決し、llvm36+clang36 をサラな状態でインストールしてあっても、 make が通りません。

以下は graphics/dri を make したときのログですが、

# cd /usr/ports/graphics/dri/
# make
        :
checking for RADEON... no
configure: error: Package requirements (libdrm_radeon >= 2.4.56) were not met:

Package libdrm_radeon was not found in the pkg-config search path.
Perhaps you should add the directory containing `libdrm_radeon.pc'
to the PKG_CONFIG_PATH environment variable
Package 'libdrm_radeon', required by 'world', not found
        :

 
こちらについても以下の URL で既に問題提起されているのでその内に解決されるかと思いますが、どーしても最新版を使ってみたい方はコンパイルを通した packages を作ったのでダウンロードしてみてください。

https://www.mail-archive.com/freebsd-pkg-fallout@freebsd.org/msg247413.html

この件の問題点としては FreeBSD/arm においては lib/libdrm_radeon.so がインストールされない点にあります。
では、そもそも lib/libdrm_radeon.so はどの ports がインストールするのだ? と、うことになるのですが、 graphics/libdrm でインストールされます。 Makefile を見てみると以下の部分になります。

.if ${ARCH} == amd64 || ${ARCH} == i386
PLIST_SUB+=     INTEL_DRIVER=""
PLIST_SUB+=     RADEON_DRIVERS=""
.elif ${ARCH} == ia64 || ${ARCH} == powerpc || ${ARCH} == powerpc64
PLIST_SUB+=     INTEL_DRIVER="@comment "
PLIST_SUB+=     RADEON_DRIVERS=""
.else
PLIST_SUB+=     INTEL_DRIVER="@comment "
PLIST_SUB+=     RADEON_DRIVERS="@comment "
.endif

 
FreeBSD/arm のアーキテクチャは armv6 なので .else のロジックを走り pkg-pllist を見ると INTEL 系と RADEON 系がインストールされないんですね。たけど、 FreeBSD/arm 上で graphics/dri をコンパイルしようとすると libdrm_radeon.pc がねーよ。って言われます。

なので上記の Makefile の部分を変更してあげる必要があります。雰囲気的には ia64 や powerpc などと同じ処理をして上げる必要があります。

.elif ${ARCH} == ia64 || ${ARCH} == powerpc || ${ARCH} == powerpc64 || ${ARCH} == armv6

 
この一行だけ直してあげると libdrm_radeon 絡みのファイルが一式インストールされるようになります。

http://distfiles.icmpv6.org/distfiles/packages/All.armv6/libdrm-2.4.60,1_add_radeon.tbz

に上記の改修を入れて libdrm_radeon* がインストールされる packages を用意しておきました。最新版を利用してみたい方はご利用ください。

 
とわ言いつ、 FreeBSD/arm に radeon は必要ないので ports のメンテナは libdrm の ports を直すのか mesa-10.6.9 系の ports 一式を直すのか、わかりませんね。 mesa 系 ports を直すのは大変そうなので、多分 libdrm 系を直して libdrm_radeon 周りをドドドとインストールするようにするかもしれませんが。

実際に OpenCL とか利用できない Raspberry Pi 2 の FreeBSD/arm なのに、なんか冗長ぎみなインストールのような気がしないでもありませんが・・。

 
以上、今回は FreeBSD の ports-CURRENT で dri 周りの ports のコンパイルが通らない人用のてっぷすでした;-)。