Armadilloフォーラム

bint-interfaces設定時にdnsmasqがクラッシュする

tkhrosm

2024年4月11日 17時50分

Armadillo-IoT G4を使用して開発を行っています。よろしくお願いいたします。
特定の条件の下で、dnsmasqがクラッシュするケースがありました。

開発の前提として、コンテナ内でdnsmasqを起動しています。
abos側でもdnsmasqが起動していますので、双方にbind-interfacesを設定しています。
この設定を保存した状態でデバイスを再起動したところ、数回に一回程度の頻度でabos側のdnsmasqがクラッシュしました。
その時のログとして、/var/log/messagesのdnsmasqに関する部分から抜き取ったものを以下に記載します。

Apr 11 16:04:45 armadillo daemon.warn dnsmasq[1654]: no servers found in /run/NetworkManager/no-stub-resolv.conf, will retry
Apr 11 16:04:45 armadillo daemon.info dnsmasq[1654]: reading /run/NetworkManager/no-stub-resolv.conf
Apr 11 16:04:45 armadillo daemon.info dnsmasq[1654]: using nameserver <IPアドレス>#53
Apr 11 16:04:45 armadillo daemon.info dnsmasq[1654]: using nameserver <IPアドレス>#53
Apr 11 16:05:34 armadillo user.debug : Will stop /usr/sbin/dnsmasq
Apr 11 16:05:34 armadillo daemon.info dnsmasq[1654]: exiting on receipt of SIGTERM
Apr 11 16:05:44 armadillo daemon.crit dnsmasq[1367]: unknown interface lo
Apr 11 16:05:44 armadillo daemon.crit dnsmasq[1367]: FAILED to start up
Apr 11 16:05:44 armadillo daemon.crit dnsmasq[1411]: unknown interface lo
Apr 11 16:05:44 armadillo daemon.crit dnsmasq[1411]: FAILED to start up
Apr 11 16:06:24 armadillo daemon.err /etc/init.d/dnsmasq[3640]: status: crashed
Apr 11 16:06:52 armadillo daemon.err /etc/init.d/dnsmasq[3657]: status: crashed

ログによると"unknown interface lo"がクラッシュの原因となっています。
そのため、デバイス起動時にネットワークの初期化を待ってからdnsmasqを起動すべきではないかと考えています。

そこで質問なのですが、ネットワークの初期化の後にdnsmasqを起動するよう設定する方法を教えていただけますでしょうか。
よろしくお願いいたします。

コメント

at_dominique.m…

2024年4月11日 18時08分

tkhrosmさん

マルティネです。

> abos側でもdnsmasqが起動していますので、双方にbind-interfacesを設定しています。
> [...]
> ログによると"unknown interface lo"がクラッシュの原因となっています。

そのとおりです。
こちらの開発にも似たような問題を発見して、bind-interfaces ではなく bind-dynamic の設定で解決できました。
bind-dynamic でも、dnsmasq は指定されたインターフェースの IP 以外に bind してません(lo だけの場合):

# ss -nplu | grep dnsmasq
UNCONN 0      0          127.0.0.1:53         0.0.0.0:*    users:(("dnsmasq",pid=3165,fd=4))      
UNCONN 0      0              [::1]:53            [::]:*    users:(("dnsmasq",pid=3165,fd=6))    

また、全く違う方向になりますが、コンテナの dnsmasq を別のポートに bind させて iptables 等で外部のリクエストをそちらに転送することも可能ですが、少しややっこしいですね。

> そこで質問なのですが、ネットワークの初期化の後にdnsmasqを起動するよう設定する方法を教えていただけますでしょうか。

dnsmasq を networkmanager の後に起動しても、networkmanager が lo インターフェースを生成する時間があるかどうかの保証がないので順番を設定するだけでは足りません。
どうしても待ちたい場合は逆に /etc/conf.d/dnsmasq の様に ip link 等で lo インターフェースをあらかじめ作っておいた方が確実だと思いますが、少し汚いのであまりおすすめできません。bind-dynamic を使用できない理由があればもう少し考えさせてください。

よろしくお願いします。

マルティネさん

お世話になっております。

> そのとおりです。
> こちらの開発にも似たような問題を発見して、bind-interfaces ではなく bind-dynamic の設定で解決できました。

ご教示ありがとうございます。abos側とコンテナ側の双方をbind-interfacesにしたことで当問題が解決していることが確認できました。使用目的の動作にも問題なかったため、bind-dynamic の設定を採用したいと思います。

> dnsmasq を networkmanager の後に起動しても、networkmanager が lo インターフェースを生成する時間があるかどうかの保証がないので順番を設定するだけでは足りません。

教えていただきありがとうございます。起動順の修正だけでは不十分なこと把握いたしました。

> どうしても待ちたい場合は逆に /etc/conf.d/dnsmasq の様に ip link 等で lo インターフェースをあらかじめ作っておいた方が確実だと思いますが、少し汚いのであまりおすすめできません。bind-dynamic を使用できない理由があればもう少し考えさせてください。

参考にさせていただきます。今回はbind-dynamicの使用で問題ございません。

お早いご対応、ありがとうございました。