Linux には、OpenVZ由来の Virtual Ethernet Tunnel (veth) というものがある。
名前が示す通り、仮想的な Ethernet Interface の組を作成して、つないでくれる。
これは、VMやContainerを動かす時に便利な機能なのだが、たくさん veth I/F を作っていると、へたをすると、どれが veth なのか?とか、どれとどれが対応するのかわからなくなる。
ip コマンドなどで調べられればいいのだが、ざっと調べた限り発見できなかった。
しかたないので、ソースの
./driver/net/veth.c
を軽く調べてみると、以下をの通り、ethtool で veth 特有の統計情報を出力しているらしい。
39 /*
40 * ethtool interface
41 */
42
43 static struct {
44 const char string[ETH_GSTRING_LEN];
45 } ethtool_stats_keys[] = {
46 { "peer_ifindex" },
47 };
peer_ifindex という統計値を出力しているドライバは、少なくとも現状は他に存在しないようだ。
なお、調査を行ったのは CentOS 6.4 で、バージョンはこんな感じ。
# modinfo veth
filename: /lib/modules/2.6.32-358.el6.x86_64/kernel/drivers/net/veth.ko
alias: rtnl-link-veth
license: GPL v2
description: Virtual Ethernet Tunnel
srcversion: 84BEC28E0EAB8E31E4CACC2
depends:
vermagic: 2.6.32-358.el6.x86_64 SMP mod_unload modversions
それで、実際にやってみた結果が以下。
まず、調査対象のサーバでは以下のようなインタフェースが作成されている。
# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
link/ether 00:0c:29:ba:96:73 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
link/ether 00:0c:29:ba:96:7d brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 00:0c:29:ba:96:87 brd ff:ff:ff:ff:ff:ff
5: br-eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN
link/ether 00:0c:29:ba:96:7d brd ff:ff:ff:ff:ff:ff
6: br-int: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/ether b2:48:56:9c:8f:43 brd ff:ff:ff:ff:ff:ff
10: qbr88886a31-17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
31: phy-br-eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether e6:f1:56:69:fb:f2 brd ff:ff:ff:ff:ff:ff
32: int-br-eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 76:a5:94:6e:ff:f6 brd ff:ff:ff:ff:ff:ff
42: qbr30aed268-b6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 8e:4c:83:bf:36:df brd ff:ff:ff:ff:ff:ff
43: qvo30aed268-b6: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether d2:c1:85:94:31:83 brd ff:ff:ff:ff:ff:ff
44: qvb30aed268-b6: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 8e:4c:83:bf:36:df brd ff:ff:ff:ff:ff:ff
45: tap30aed268-b6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500
link/ether fe:16:3e:b1:6c:03 brd ff:ff:ff:ff:ff:ff
実際は qvo30aed268-b6 と qvb30aed268-b6 が veth で組になっているのだが、この出力ではわからない。
ソース調査の結果からは、ethtool -S でかたっぱしから統計情報を出力してやると、veth だけpeer_ifindex が出力され、相手がわかるはずである。
# ethtool -S qvo30aed268-b6
NIC statistics:
peer_ifindex: 44
# ethtool -S qvb30aed268-b6
NIC statistics:
peer_ifindex: 43
…ということで、少なくとも、上記の2つがペアになっていることはわかった。
他のデバイスについては何も表示されないものと期待できるのだが、代表的なところをやってみると、以下の通り。
Linux Tun/Tap
# ethtool -S tap30aed268-b6
no stats available
OpenvSwitch で作成した bridge
# ethtool -S br-int
no stats available
生の ethernet カード
# ethtool -S eth0
no stats available
brctl で作成した bridge
# ethtool -S qbr88886a31-17
no stats available
ということで、最低限の目的は遂げることができるようだ。