Как найти пространство имен Linux по сетевому адаптеру?

У меня есть сервер Linux с несколькими определенными сетевыми пространствами имен:

# ip netns list
qdhcp-7dedbd4e-2265-4aa2-baac-add4e341dd18
qdhcp-851379ba-1d51-4e45-8e50-b756e81c0949
qdhcp-a19927c5-83b4-4bb4-a8b8-f21fdb5e004b
qdhcp-b94605ff-b0e2-4cfe-a95e-3dd10208a5fb
... ...

Каждое пространство имен содержит один или несколько виртуальных сетевых адаптеров — в данном случае это TAP-устройство:

# ip netns exec qdhcp-7dedbd4e-2265-4aa2-baac-add4e341dd18 ip route
192.168.168.0/24 dev tapda4018ab-b7  proto kernel  scope link  src 192.168.168.2
169.254.0.0/16 dev tapda4018ab-b7  proto kernel  scope link  src 169.254.169.254
default via 192.168.168.1 dev tapda4018ab-b7

Теперь предположим, что я знаю имя адаптера — tapda4018ab-b7 — но не знаю, к какому пространству имен он принадлежит. Есть ли способ найти его без проверки пространств имен по одному? Есть ли общая команда Linux для этого? Или, по крайней мере, специфичная для OpenStack Neutron команда?


person Cat Mucius    schedule 03.12.2014    source источник


Ответы (3)


Согласно этой справочной странице http://man7.org/linux/man-pages/man8/ip-netns.8.html вы можете запустить команду exec для всех пространств имен, но я протестировал ее на надежных серверах Ubuntu, и она не примет "-all< /em>" в качестве аргумента. Так что единственный известный мне способ получить такую ​​информацию — это использовать небольшой скрипт bash. Я сделал один, который, безусловно, можно было бы улучшить, поскольку мои навыки написания сценариев довольно просты, но он сделает свою работу:

#!/bin/bash
i=$(ip netns list | wc -l)
counter=1
while [ $counter -le $i ]; do
    ns=$(ip netns | head -$counter | tail -1)
    ip netns exec $ns ip route | grep $1 | grep proto
    let counter=counter+1
done

Затем вы можете запустить скрипт, используя в качестве единственного аргумента ваше устройство касания, как в примере ниже:

root@columbo:~# ./list_all_namespace tap8164117b-e3
5.5.5.0/25 dev tap8164117b-e3  proto kernel  scope link  src 5.5.5.3

Если вы не предоставите аргумент, это даст вам ошибку.

person Carol Domokos    schedule 04.04.2015

Если я правильно понимаю Neutron (что является большим, если - мой единственный опыт связан с довольно ограниченной игрушечной установкой Kilo/2015.1.2), вы сможете отслеживать базу данных Neutron, чтобы выяснить, какие сети вы ищете.

Я полагаю, что ваш интерфейс крана будет назван с использованием первых 5 октетов (10 символов) uuid порта, с которым он связан, а qdhcp netns использует uuid своей сети, поэтому вы должны иметь возможность использовать нейтронный интерфейс командной строки для отслеживания правильное пространство имен.

Вы сможете найти нейтронный порт для вашего интерфейса tap с помощью:

$ neutron port-list | grep "da4018ab-b7"
| da4018ab-b7xx-xxxx-xxxx-xxxxxxxxxxxx |   | fa:16:xx:xx:xx:xx | {"subnet_id": ...

где "da4018ab-b7" вытащили из "tapda4018ab-b7". Затем вы можете использовать полный UUID порта:

$ neutron port-show da4018ab-b7xx-xxxx-xxxx-xxxxxxxxxxxx

Network_id в результате показа портов должен позволить вам определить netns (qdhcp-network_id), содержащий tapda4018ab-b7.

Вы должны иметь возможность использовать аналогичную логику для отслеживания интерфейсов qg (которые, вероятно, будут отображаться на мостах в netns по умолчанию), но в этом случае это device_id, которому принадлежит порт, который дает вам qrouter-device_id netns вы хотите.

person Tim Furlong    schedule 15.04.2016

Вы можете использовать этот скрипт. Сохраните это как get_dhcp_namespace.sh: -

ubuntu@ubuntu$ cat get_dhcp_namespace.sh

#!/bin/bash

interface=$1
id=${interface:3}

port_id=$(neutron port-list | grep $id | awk -F'|' '{print $2}' | tr -d ' ')
net_id=$(neutron port-show $port_id | grep network_id | awk -F'|' '{print $3}' | tr -d ' ')
echo "DHCP namespace is: qdhcp-$net_id"

Запустите это с интерфейсом крана, предоставленным в качестве аргумента. Не забудьте указать источник файла keystonerc/openstackrc/credentials.

ubuntu@ubuntu$ ./get_dhcp_namespace.sh tapda4018ab-b7
qdhcp-bd39f45d-b45c-4e08-ab74-85c0b1180aea
person Rahul    schedule 18.04.2016