FreeBSD11.2: ラジコ録音で、rtmpdump が core dump

年末、年始の長期休暇を利用した、大規模サーバーメンテナンスで、またまたトラブルに遭遇。

FreeBSD10系は、昨年末で正式サポートが終了したことから FreeBSD11系へのアップデートを行おうとしています。今使用しているFreeBSD 10サーバーはCPUがAthlon XP の32bit OSなのですが、11系は64bit OSを考えていて、ATOM330 のIntel D945GCLF2を使おうと検討中。
メインメモリが今の3GBから2GBへ減量となりますが、CPUコア数は、1から2または4(Hyper Thred使用の場合)へ増やせます。主記憶とCPUコア数、どちららパフォーマンスに有利なのか?
またOSが32bitから64bit(i386→amd64)となることで、良いことが起きるか?

こういう点を体感しながらホストを新調しようと、年末から新マシンへ FreeBSD11.2(amd64) を入れて、データをコピーして、cron で動かしているスクリプトが正常動作するかどうかを確認しようとして、トラブル発生。Radiko録音スクリプトが動かな〜い!

rtmpdump がラジコサーバーへアクセスしようとして、core dump する!

FreeBSD 11.2

> radiko.sh TBS 1:25
authtoken: SFnaElvBKkBpwuLOasm8Sg \noffset: 45726 length: 16 \npartialkey: MenX/OKakKwjkDG1cnIBzw==
authentication success
areaid: JP13
RTMPDump v2.4
(c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL
Connecting ...
Segmentation fault (core dumped)

Webページを検索してみたところ、同様の事例があることを発見。この方も、Radikoサーバーへのアクセスが core dumpするようです。

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

スクリプトもベースが同じものを使っておられるようですが、まだ原因にはたどり着いていないようです。

64bit OSのせい?

OSを FreeBSD11.2(amd64)からFreeBSD11.2(i386) へ入れ直してみましたが、状況は同じでやっぱりcore dumpします。32bit/64bit とは無関係のようです。

デバッガーで、core ファイルを開いてみると、/lib/libcrypto.so.8 か /usr/local/lib/librtmp.so.1 が原因のようです。

/tmp> gdb /usr/local/bin/rtmpdump rtmpdump.core 
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-marcel-freebsd"...(no debugging symbols found)...
Core was generated by `rtmpdump -v -r rtmpe://f-radiko.smartstream.ne.jp/ --playpath simul-stream.strea'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /usr/local/lib/librtmp.so.1...(no debugging symbols found)...done.
Loaded symbols for /usr/local/lib/librtmp.so.1
Reading symbols from /usr/lib/libssl.so.8...(no debugging symbols found)...done.
Loaded symbols for /usr/lib/libssl.so.8
Reading symbols from /lib/libcrypto.so.8...(no debugging symbols found)...done.
Loaded symbols for /lib/libcrypto.so.8
Reading symbols from /lib/libz.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libz.so.6
Reading symbols from /lib/libc.so.7...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.7
Reading symbols from /libexec/ld-elf.so.1...(no debugging symbols found)...done.
Loaded symbols for /libexec/ld-elf.so.1
#0  0x281b9146 in EVP_MD_CTX_init () from /lib/libcrypto.so.8
(gdb) bt
#0  0x281b9146 in EVP_MD_CTX_init () from /lib/libcrypto.so.8
#1  0x281ae4cd in HMAC_CTX_init () from /lib/libcrypto.so.8
#2  0x280820de in RTMP_Write () from /usr/local/lib/librtmp.so.1
#3  0x280789db in RTMP_Connect1 () from /usr/local/lib/librtmp.so.1
#4  0x2807a1a8 in RTMP_Connect () from /usr/local/lib/librtmp.so.1
#5  0x0804b60d in ?? ()
#6  0xbfbfa848 in ?? ()
#7  0x00000000 in ?? ()

今のサーバーと、新サーバーで /usr/libcrypto.so を比較してみると、バージョンが違う。

 FreeBSD11.2
> ll /lib/libcrypt*
-r--r--r--  1 root  wheel    52732  6月 22  2018 /lib/libcrypt.so.5
-r--r--r--  1 root  wheel  1632972  6月 22  2018 /lib/libcrypto.so.8
FreeBSD 10.3
# ll /lib/libcrypt*
-r--r--r--  1 root  wheel    73972  2月  8  2017 /lib/libcrypt.so.5
-r--r--r--  1 root  wheel  1630920  1月 15  2018 /lib/libcrypto.so.7

rtmpdump コマンドは、2015/12/23 という日付情報が入ったパッケージで、当分更新はされていないようです。lib の方が rtmpdumpコマンドより新しい。

> pkg info|grep rtmpdump
rtmpdump-2.4.20151223          RTMP streams download utility

バージョンアップすると、動いていて多プログラムが動かなくなることはよくあることですが、原因がどこにあるかもっと切り分ける必要があります。

まずは、一番 FreeBSD 10に近い、FreeBSD 11.0で試すことにしたところ、より深刻な現象に遭遇。wget が動かない!ライブラリのバージョンは、11.2 と同じ。

FreeBSD 11.0
ll /lib/libcrypt*
-r--r--r--  1 root  wheel    53416 Sep 23  2016 /lib/libcrypt.so.5
-r--r--r--  1 root  wheel  1769060 Dec 16  2016 /lib/libcrypto.so.8

wget が動かないのは rtmpdump より深刻じゃん。

>wget -h
Shared object "libdl.so.1" not found, required by "wget"

rtmpdump にたどり着く前に、wget でライブラリのエラーが発生。そういえばこのエラー、前に見たことがあります。FreeBSD 11.1のバグ。11.0 でも同様のようです。11.2 で解決していますが、11.2だとrtmpdump が動かない!rtmpdump は現時点ではラジコのみへの影響ですが、wgetが動かないというのは影響範囲が広過ぎ。

FreeBSD 11.x 、つかえねぇ〜。総崩れですよ。
ライブラリが足りないだけなので、頑張ればソースから生成できるかも知れませんが、現在のサーバー運用は、メンテナンス性重視で行っているので、サポートバージョンとはいえ、標準状態でこれだけひどいバージョンを使う必要があるかどうか?これなら、サポート終了バージョンを使い続ける方がよくない?

サポートが終了しているものの、最近までメンテナンスされ続けていた FreeBSD10.4 i386/amd64 両方とも試してみることにしました。

さすがに、実ハードウェアにOSをインストールするのは面倒なので、FreeBSDがサーバーに準備してくれているVMイメージを使って試してみたところ、FreeBSD 10.4 は32bit/64bitとも rtmpdump/wget とも問題なし。

念のために、FreeBSD 12の動作もVMで確認してみました。
wget の問題はなかったものの、rtmpdump は core dump。

% ll /lib/libcrypt*
-r--r--r--  1 root  wheel    65456 Dec  7 05:22 /lib/libcrypt.so.5
-r--r--r--  1 root  wheel  3055864 Dec  7 05:24 /lib/libcrypto.so.111

ライブラリはバージョンが大幅に変更となっていて、rtmpdump が動くか?と思ったら、やっぱり core dump。

% radiko.sh TBS 16:05
authtoken: uEpkRwtp3bmyVz4weLWR2Q \noffset: 82910 length: 16 \npartialkey: EBfelI2MXPJx2OOe3WkVCw==
authentication success
areaid: JP13
RTMPDump v2.4
(c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL
Segmentation fault (core dumped)

同様に gdbを起動しようとすると gdbが入っていない!
なんでよ。pkg install gdb でパッケージを入れて、デバッガーを起動してみたところ、ちょっと違う現象になってましたが、結局 openSSL の暗号化通信のところがうまく処理できていなくて core dumped になっている模様。librtmp.so.1 は前のバージョンと同じ。

% gdb /usr/local/bin/rtmpdump rtmpdump.core
GNU gdb (GDB) 8.2 [GDB v8.2 for FreeBSD]
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-portbld-freebsd12.0".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /usr/local/bin/rtmpdump...(no debugging symbols found)...done.
[New LWP 100089]
Core was generated by `rtmpdump -v -r rtmpe://f-radiko.smartstream.ne.jp/ --playpath simul-stream.strea'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  hmac_ctx_cleanup (ctx=0x0) at /usr/src/crypto/openssl/crypto/hmac/hmac.c:141
141	/usr/src/crypto/openssl/crypto/hmac/hmac.c: No such file or directory.
(gdb) bt
#0  hmac_ctx_cleanup (ctx=0x0) at /usr/src/crypto/openssl/crypto/hmac/hmac.c:141
#1  HMAC_CTX_reset (ctx=0x0) at /usr/src/crypto/openssl/crypto/hmac/hmac.c:179
#2  0x000000080026798a in RTMP_HashSWF () from /usr/local/lib/librtmp.so.1
#3  0x0000000000206641 in ?? ()
#4  0x000000000020411b in ?? ()
#5  0x000000080022f000 in ?? ()
#6  0x0000000000000000 in ?? ()

11.x をすっ飛ばして、FreeBSD 12 へジャンプするというのも駄目みたいです。なんなのよ、これは!Windows Update と同じレベルか。

10.4に上げるのが良さそうですが、10.3→10.4 への更新に、わざわざサーバー交換する必要ある?という気もします。この間のバージョンアップは、freebsd-update コマンドでできますからね。

2018年の年末から作業を始めて、一週間、サーバーアップデートの準備して、2019/1/3時点でな〜んも進んでいないというのは、せっかくの休暇をどぶに捨てたようでとっても悲しい。

2019/02/07 追記

rtmpdump で radiko.jp を録音しようとして core dump するのは、librtmp のバージョンと関係することがわかりました。

コメントを残す