[ARM][Docker][DNS] Knot DNSをAlpine Linux (AArch64)でbuildしたらセグフォする

AIX、UNIX、LinuxARM
Screenshot-2018-5-20 musl libc

AArch64環境でDocker使ってbuildするおじさんです。

はじめに

今度は実験場にknot DNSを追加するために、alpineベースでKnot DNS用のDockerfileを書いておりました。
まぁbuildはうまくいくんですよ・・・

Knot DNSのbuild自体はドキュメントに沿ったつもりですが、一部公式のDockerfileを参考にしているところがあります。

Welcome to Knot DNS’s documentation! — Knot DNS 2.6.9 documentation
GitHub - CZ-NIC/knot: A mirrored repository
A mirrored repository. Contribute to CZ-NIC/knot development by creating an account on GitHub.

ちなみに前置きしておきますと、公式のDockerイメージはUbuntu/Debian、それにFedora/CentOSみたいです。

問題のエラー

buildしていざ実行すると以下のようなエラーが。

# knotd -v -c /usr/local/etc/knot/knot.sample.conf
Assertion failed: URCU_TLS(rcu_reader).registered (urcu.c: rcu_unregister_thread_memb: 530)
Segmentation fault (core dumped)

そもそもURCUとは

URCUってなんぞやって思って調べてみると、以下のWebサイトがあります。

とりあえず概要は別として、エラーメッセージから、RCUのTLSってあるので、暗号化周りのエラーってことになるんでしょうか。必須なパッケージとして書いて無さそうなんですが、公式のDockerイメージには必ず入っているので、外すのは難しい感じです。

ちなみにその後、外してconfigureしてみたところ、以下のようなエラーが出たので、必須コンポーネントみたいです。

checking for liburcu... no
checking for library containing rcu_set_pointer_sym... no
checking for library containing rcu_set_pointer_sym... no
checking for library containing rcu_set_pointer_sym... no
configure: error: liburcu is required

出来たCorefileを解析するとこんな感じ。

(gdb) info threads
Id Target Id Frame
* 1 LWP 9110 0x0000ffff8eb5053c in abort () from /lib/ld-musl-aarch64.so.1
2 LWP 9108 0x0000ffff8eb879b8 in __clone () from /lib/ld-musl-aarch64.so.1
3 LWP 9111 0x0000ffff8eb88414 in ?? () from /lib/ld-musl-aarch64.so.1
4 LWP 9117 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1
5 LWP 9114 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1
6 LWP 9109 0x0000ffff8eb879b8 in __clone () from /lib/ld-musl-aarch64.so.1
7 LWP 9112 0x0000ffff8eb88414 in ?? () from /lib/ld-musl-aarch64.so.1
8 LWP 9121 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1
9 LWP 9116 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1
10 LWP 9122 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1
11 LWP 9118 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1
12 LWP 9125 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1
13 LWP 9119 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1
14 LWP 9127 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1
15 LWP 9120 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1
16 LWP 9115 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1
17 LWP 9126 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1
18 LWP 9123 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1
19 LWP 9124 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1
(gdb) where
#0 0x0000ffff8eb5053c in abort () from /lib/ld-musl-aarch64.so.1
#1 0x0000ffff8eb50580 in __assert_fail () from /lib/ld-musl-aarch64.so.1
#2 0x0000ffff8e98cc90 in rcu_unregister_thread_memb () from /usr/lib/liburcu.so.6
#3 0x0000aaaac8dc22d4 in thread_ep ()
#4 0x0000ffff8eb88f20 in ?? () from /lib/ld-musl-aarch64.so.1
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) info share
From To Syms Read Shared Object Library
0x0000ffff8eb12c10 0x0000ffff8eb1d458 Yes (*) /usr/lib/liblmdb.so
0x0000ffff8ea11300 0x0000ffff8eacfd94 Yes (*) /usr/lib/libgnutls.so.30
0x0000ffff8e9aa520 0x0000ffff8e9c5530 Yes (*) /usr/lib/libnettle.so.6
0x0000ffff8e98bc20 0x0000ffff8e98e8bc Yes (*) /usr/lib/liburcu.so.6
0x0000ffff8e9765c0 0x0000ffff8e97807c Yes (*) /usr/lib/libcap-ng.so.0
0x0000ffff8eb48798 0x0000ffff8eb963f0 Yes (*) /lib/ld-musl-aarch64.so.1
0x0000ffff8e9208b0 0x0000ffff8e94d1e8 Yes (*) /usr/lib/libp11-kit.so.0
0x0000ffff8e7aa7b0 0x0000ffff8e7da000 Yes (*) /usr/lib/libunistring.so.2
0x0000ffff8e77cad0 0x0000ffff8e785cac Yes (*) /usr/lib/libtasn1.so.6
0x0000ffff8e7407a0 0x0000ffff8e74de98 Yes (*) /usr/lib/libhogweed.so.4
0x0000ffff8e6d9a60 0x0000ffff8e719858 Yes (*) /usr/lib/libgmp.so.10
0x0000ffff8e6b78f0 0x0000ffff8e6bbb00 Yes (*) /usr/lib/libffi.so.6
(*): Shared library is missing debugging information.

musl libcとは

そもそも、/lib/ld-musl-aarch64.so.1が「Program terminated with signal SIGSEGV, Segmentation fault.」してる時点でおかしいんですよね・・・
んで、このld-muslは以下のようなものらしいです。

musl libc

標準Cライブラリ(libc)互換のCライブラリらしいです。軽量、高速、シンプルな実装を目指して開発されているライブラリで、GNU C library(glibc)との互換性もあるとのことですが、Alpine Linuxはglibc周りはこれに置き換えているんですね・・・
このあたり解決できないかなぁとか思って、alpineでglibc使えないのかなと思って調べてみたら意外に難しい問題のようです。

Alpineでハマりそうな点(glibc) · syuilog

仕方がないんでUbuntu/Debianでbuildしてみたところ、こちらは問題なく動作しました。ということで、このglibcに周りにまつわる問題みたいですね。この問題、muslの開発に聞いてみるのが良いんでしょうか・・・

ちなみにAlpineのパッケージでKnot DNSが用意されているんですが、こちらも私の環境ではsegmentation faultしました。buildしている人は問題が出なかったんだろうか・・・

この記事を書いた人

kometchtech

うつ病を患いながら、IT業界の末席にいるおっさんエンジニア。科学計算をしたことがないのに、HPC分野にお邪魔している。興味のある分野で学習したことをblogにまとめつつ、うつ病の経過症状のメモも置いておく日々。じつはRouterboard User Group JPの中の人でもある。 Amazon欲しいものリスト / Arm板を恵んでくれる人募集中

いつか、そのとき、あの場所で。rev.2
タイトルとURLをコピーしました