私はDebian(Linux 3.8.13)を実行する組み込みx86 Linuxデバイスを開発しています。デバイスには2つのイーサネットポート(eth0とeth1)があります。
スイッチに接続されているeth0のみを使用してこのデバイスを起動し、デバイスでsshを実行して「ifconfig」を実行すると、次の結果が表示されます。
root@msli-DCP-11234772:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:1c:ab:00:0a:60
inet6 addr: fe80::21c:abff:fe00:a60/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5659 errors:0 dropped:4102 overruns:0 frame:0
TX packets:1071 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1313254 (1.2 MiB) TX bytes:224889 (219.6 KiB)
Interrupt:16 Memory:fc500000-fc520000
eth1 Link encap:Ethernet HWaddr 00:1c:ab:00:0a:61
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:17 Memory:fc520000-fc540000
eth0 には「inet6 addr」が割り当てられていますが、eth1 には割り当てられていません。
eth1をネットワークスイッチに接続すると、この時点でifconfigの出力に「inet6 addr」行が表示されます(eth1からイーサネットケーブルを抜き戻しても、この行はまだ残ります)。
したがって、Linuxは、イーサネットデバイスが実際に何かに最初に接続されるまで、イーサネットデバイスをIPv6アドレスに接続することを気にしないようです。
このアプローチは機能しますが、常に両方のポートでIPv6マルチキャストパケットを送信する必要があるいくつかのプログラムがありますが、IPv6アドレスが割り当てられていないポートではこれを行うことはできません。
だから私が望むのは、Linuxが起動中にデバイスの自己割り当てIPv6アドレス(fe80 ::blah、ここでblahはイーサネットチップのMACアドレスから派生)を接続する方法を見つけることです。イーサネットポートが実際に接続されました。これを行う方法はありますか?
(利点は、私のプログラムが起動中にネットワークデバイスのリストをスキャンして使用できることです。現在のネットワーク設定の変更を通知するためにAF_NETLINKソケットを設定する必要があります。これは機能しますが、必要なものよりも複雑です。速度も少し遅い)
答え1
ifconfig
ここでは情報が足りません。通常、コアは次のとおりです。協会起こった。iproute2
はip addr
、該当する場合、下位レベルの状態とアドレスの寿命を表示します。
リンクローカルアドレスは、リンク自体が機能している場合にのみ存在する必要があります。リンクもなくアドレスもありません。バインディングセットのサブインターフェイス(使用したい単語の選択に応じてグループ/チーム/マスターなど)など、これが発生しない他の多くの場合があります。
ケーブルを取り外してもリンクローカルアドレスが削除されない現象が観察された。間違っているようです。他のエントリを使用せずにライフカウンタが期限切れになったら削除する必要があり、最新のカーネルでは修正されたと考えられます。今はテストしないでください)。
それに加えて、カーネルまたはユーザースペースがアドレスをfe80::
生成したかどうかに興味がありますか?重要でない場合は、ユーザースペースで作成でき、カーネルはそれを削除しません。
答え2
インターフェースはどのように構成されていますか/etc/network/interfaces
?allow-hotplug
リンクが検出されたときにインターフェイスを有効にするように設定されているとします。設定を次のように変更してみてくださいauto
。
auto eth0
iface eth0 ....
....
auto eth1
iface eth1 ....
....