web-dev-qa-db-ja.com

組み込みデバイスにネットワーク上の何かにpingを送信させることができません

私は、busyboxを実行しているbuildroot、カーネルバージョン3.6.11を使用して構築された組み込みデバイスを持っています。カーネルは完全にデフォルトのオプションで構築されています。ネットワーク担当者がIP、ゲートウェイ、ネットマスクなどに指定した内容に従ってデバイスを構成し、これらの値を/ etc/network/interfacesファイルに配置しました。システムが起動すると、ifconfigを呼び出すと、すべてのネットワーク設定が想定どおりであることがわかります。ただし、デバイスと同じサブネット上の他のマシンにpingを実行できません。直接イーサネットケーブル接続でホストマシンと通信できるので、ネットワークアダプターは問題ないと思います。ホストにsshでき、ホストはvsftpdからターゲットを正しく表示できます。デバイスにインストールしました。基本的に、問題の診断をどのように進めるかは非常にわかりません。私はインターネットフォーラムのLinuxネットワークセットアップガイドに溺れていて、どこにも行きません。また、心配して、私がタイプするとき

# ip addr show dev eth0

LibuClibc-0.9.33.2.soでセグメンテーション違反のレポートを受け取ります。私はこれをすべてbuildrootを使用して構築しましたが、すべてが成功したと報告されました。カーネルが壊れている可能性はありますか?どうすればいいのかわからないので、アドバイスをいただければ幸いです。

[〜#〜] edit [〜#〜]ip addr show dev eth0からの出力は

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen
    1000 link/ether 00:18:7d:19:a0:d8 brd ff:ff:ff:ff:ff:ff
    inet 172.18.255.212/24 brd 172.18.255.255 scope global eth0
[  331.700545] ip[951]: segfault at 0 ip b76e1f26 sp bfbd29b0 error 4 in 
libuClibc-0.9.33.2.so[b76b5000+4d000]
Segmentation fault

他のアダプターeth1で同じコマンドを呼び出すと、セグメンテーション違反が発生しないため、何が起こっているのか本当にわかりません。

EDIT2デバッグ情報とstraceを使用して再構築した後、segfaultのstrace出力を取得できました-これが何を意味するのかはわかりませんが、書き込もうとしているように見えます。おそらくすべきではない場所に(私はそれをすべて含めたわけではなく、最後の数行だけを含めました)。

socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 4
ioctl(4, SIOCGIFTXQLEN, {ifr_name="eth1", ifr_qlen=1000}) = 0
close(4)                                = 0
write(1, "3: eth1: <BROADCAST,MULTICAST,UP"..., 793: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
) = 79
write(1, "    link/ether 00:18:7d:19:a0:d7"..., 55    link/ether 00:18:7d:19:a0:d7 brd ff:ff:ff:ff:ff:ff
) = 55
open("/etc/iproute2/rt_scopes", O_RDONLY) = 4
ioctl(4, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0xbfc91b30) = -1 ENOTTY (Inappropriate ioctl for device)
read(4, "#\n# reserved values\n#\n0\tglobal\n2"..., 4096) = 92
read(4, "", 4096)                       = 0
close(4)                                = 0
write(1, "    inet 192.168.12.198/16 brd 1"..., 65    inet 192.168.12.198/16 brd 192.168.255.255 scope global eth1
) = 65
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0} ---
+++ killed by SIGSEGV +++
Segmentation fault
1

将来誰かが同様の問題を抱えている場合に備えて、ここで文書化するセグメンテーション違反の問題をなんとか解決しました。私が次のように電話したときに気づいた

 ip -f inet addr show dev eth0

の代わりに

 ip inet addr show dev eth0

その後、セグメンテーション違反は発生しませんが、それでも発生します

 ip -f inet6 addr show dev eth0

これにより、ツールチェーンまたはbusyboxのどこかでIPv6サポートとの非互換性が必要であるという結論に至りました。ターゲット、ツールチェーン、カーネル、uClibc全体をbuildroot構成ファイルを使用して最初から再構築します。今回は、クロスツールがIPV6サポートで作成されていることを確認します。このオプションを設定すると、報告されたセグメンテーション違反は発生しなくなります。

1