lxc / lxd 中的网络命名空间在哪里?

lxc / lxd 中的网络命名空间在哪里?

我在尝试着理解命名空间lxd在/的上下文中lxc

我有两个容器,它们分别eth0桥接到br1主机br2上。这是通过虚拟以太网接口完成的

root@srv:~# ip link
(...)

5: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
    link/ether fe:f0:ca:e8:c4:ae brd ff:ff:ff:ff:ff:ff
6: br2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
    link/ether fe:45:66:a8:37:a7 brd ff:ff:ff:ff:ff:ff
11: vethHRMPOM@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br1 state UP mode DEFAULT group default qlen 1000
    link/ether fe:f0:ca:e8:c4:ae brd ff:ff:ff:ff:ff:ff link-netnsid 1
27: vethNTG58H@if26: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br2 state UP mode DEFAULT group default qlen 1000
    link/ether fe:45:66:a8:37:a7 brd ff:ff:ff:ff:ff:ff link-netnsid 0

我想知道另一边vethHRMPOM@if10是哪里?

ip netns list是空的。

/var/run/netns不存在(这是 Ubuntu 15.10)

ip netns list-id节目

nsid 0 
nsid 1 

这似乎与上面的最后一个元素相对应。由于所有命令都通过名称(而不是 ID)引用命名空间,ip list我如何才能获取有关这些的更多信息nsid 01

答案1

默认情况下,LXC 不会使用 iproute2 实用程序注册网络命名空间,但您可以手动注册它们:

root@host:~# lxc-info -n testlxc
Name:           testlxc
State:          RUNNING
PID:            8888
<snip>
root@host:~# mkdir -p /var/run/netns/
root@host:~# ln -s /proc/8888/ns/net /var/run/netns/testlxc

在netns注册之后,很容易回答这个问题:

root@host:~# ip netns list
testlxc (id: 0)
root@host:~# ip addr show | grep -A2 -B1 "link-netnsid 0"
15: veth9ICKL6@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br1 state UP group default qlen 1000
    link/ether fe:b2:e0:99:81:53 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::fcb2:e0ff:fe99:8153/64 scope link 
       valid_lft forever preferred_lft forever

答案2

我想知道另一边vethHRMPOM@if10是哪里?

虽然我不知道如何将主机 veth 设备直接映射到 LXC veth 设备,但我知道如何执行相反的操作:

root@server:~# lxc-ls
bugzilla4
root@server:~# lxc-info -n bugzilla4 -p
PID:            7072
root@server:~# mkdir -p /var/run/netns/
root@server:~# ln -sf /proc/7072/ns/net /var/run/netns/bugzilla4
root@server:~# ip netns list
bugzilla4
root@server:~# ip netns exec bugzilla4 ethtool -S eth0
NIC statistics:
     peer_ifindex: 41
root@server:~# ip link show | grep '^41:'
41: vXsomething: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br1 state UP mode DEFAULT group default qlen 1000

如果ethtool在来宾上不可用,我认为您可以获取来宾ifindex并增加一以获取主机ifindex(40 -> 41):

root@server:~# ip netns exec bugzilla4 ip link show eth0
40: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff

回答您最初的问题:您可以编写一个脚本,它将检查每个 LXC,获取主机 veth 设备,如果它是您感兴趣的,则停止(vethHRMPOM@if10)。

我认为一个更好的解决方案是正确命名你的 veth 设备。例如:

lxc.network.veth.pair = vXbugzilla4

vXbugzilla4veth设备在主机上调用:

root@server:~# ip link show vXbugzilla4
41: vXbugzilla4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br1 state UP mode DEFAULT group default qlen 1000
    link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff

相关内容