Назад | Перейти на главную страницу

Где сетевые пространства имен в lxc / lxd?

я пытаюсь понимать пространства имен в контексте lxd / lxc.

У меня есть два контейнера, соответствующие eth0 соединяется с br1 и br2 на хосте. Это делается через интерфейсы виртуального Ethernet.

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 

которые, кажется, соответствуют последнему элементу в ip list выше. Как я могу получить дополнительную информацию об этих nsid 0 ан 1 поскольку все команды ссылаются на пространство имен по имени (а не по идентификатору)?

Интересно, где другая сторона, скажем, 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

Устройство veth называется vXbugzilla4 на хосте:

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

По умолчанию LXC не регистрирует сетевые пространства имен с помощью iproute2 utils, но вы можете зарегистрировать их вручную:

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