什么是 veth

Linux container 中用到一个叫做veth的东西,这是一种新的设备,专门为 container 所建。

veth 从名字上来看是 Virtual ETHernet 的缩写,它的作用很简单,就是要把从一个 network namespace 发出的数据包转发到另一个 namespace。veth 设备是成对的,一个是 container 之中,另一个在 container 之外,即在真实机器上能看到的。

建立 veth 类型的设备可以用下面的命令:

ip link add name n1.0.1 type veth peer name n1.0

这里建立了一对veth设备,名字分别是 n1.0.1 和 n1.0。注意,这两个设备是完全对称的,也就是说,除了名字不一样,它们的作用是完全相同的,从其中一个发出就会从另一个收到。从代码(drivers/net/veth.c::veth_newlink())我们也可以看得出来:

[c]
priv = netdev_priv(dev);
priv->peer = peer;

    priv = netdev_priv(peer);
    priv->peer = dev;

[/c]

然后我们可以用下面的命令设置它们的 namespace:

ip link set n1.0 netns pidof lxc

通常 veth 会和 bridge 搭配使用(我们在lxc的配置文件中也可以看出),这样一来,从外面进来的包(比如 eth0)就可以转发到 container 之中了。