Ubuntuでの "ip address"コマンド(または "ip link"コマンド)の出力のインターフェース名でのアットマーク(@)の意味、たとえば次の出力のインターフェース名 "eth0 @ if44":
root@aafa1fc24a0b:/# ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope Host lo
valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1
link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1
link/tunnel6 :: brd ::
43: eth0@if44: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
追加の関連情報:
セットアップは次のように作成されました。
docker network create my-bridge
docker run --name my-container-1 --network my-bridge --detach --tty ubuntu:16.04 sleep infinity
docker run --name my-container-2 --network my-bridge --detach --tty ubuntu:16.04 sleep infinity
これは、リンクのピアインターフェイスインデックスを表します。このプロパティはどのインターフェースでも使用できるように見えますが、veth、macvlan、vlan(サブインターフェース)などのいくつかのインターフェースタイプに対してのみ意味があります。他のインターフェースとの関係があるためです。
特定のインターフェースには、たとえばそこに読み取ることができるインデックスがあります。
/sys/class/net/<interface>/ifindex
そのピアリンクインターフェイスはそこで読むことができます:
/sys/class/net/<interface>/iflink
どうやら、それが意味をなさない場合でも、パラメーターは存在しますが、ifindexと同じです。これは通常の通常または単純なインターフェース(実際のハードウェアeth0、wlan0、dummy0など)の場合です。
ip link
コマンドは、iflink値を解釈するだけです。
@NONE
が出力されます@ifXX
とXX
はifindexです。一致するifindexがないことは、それが他のネット名前空間に関連していることを知るのに十分です。後で参照してください。@
は表示されません。これは実際のインターフェース(eth0 ...)で発生するはずですが、バグである可能性もあります(後述)。一致するifindexはいつ見つかりませんか?そのインターフェースがその他のネットワーク名前空間にある場合。これは、結果の最後にlink-netnsid
が追加されたために判明しています。この値はip link
外では簡単に利用できません(このQ/Aを参照してください: vethピアのifindexのネットワーク名前空間を見つける方法は? )。これは、対応するピアネットワーク名前空間のローカルに割り当てられたnsidを表します。コンテナーの場合、最初の(そしておそらく唯一の)値0は、ほとんど常にホストのネット名前空間を表します。ホストの場合、おそらくコンテナごとに1つのlink-netnsid値があり、最初のコンテナのlink-netnsidは0です。この値は絶対名前ではなく、ネット名前空間に対してローカルであるため、直接比較することはできません。 2つのネット名前空間間( 前のリンク を参照)。
したがって、ifindexが見つからないことは、それが他の名前空間にあることを意味します。 link-netnsid
プロパティの存在によって確認されます。
iflink、つまりpeerインターフェースのインデックス値、他のネット名前空間にあるとき、たまたまローカルインターフェースと同じIDを持っている(現在のネット名前空間にある)。この場合、ip link
は@
を表示しません。これは、それが一般的なインターフェースであるというロジックですが、この場合は間違っています。
# ip -o link show dev veth1
3: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000\ link/ether 7e:d9:ca:77:87:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0
# cat /sys/class/net/veth1/{ifindex,iflink}
3
3
(link-netnsid 0
の存在に注意してください。これは、リンクが他のネット名前空間にあることを意味します。)
その他の場合(再現できなかったため修正された可能性があります)、他のネット名前空間インデックスを使用してローカルインターフェース名を表示することもありました。
たとえば、(コンテナではなく)ホストで実行する場合:ip -o link |grep ^44:
。おそらく、ピアのvethリンクであるインデックス44のインターフェイスが見つかります。 (中間の見えないネット名前空間がない限り)。