0

У меня есть сервер Linux с кратному network namespaces определено:Как найти пространство имен 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-специфическая команда?

ответ

0

Согласно этой странице руководства http://man7.org/linux/man-pages/man8/ip-netns.8.html можно запустить EXEC команду на всех пространствах имен, но я проверил это на Ubuntu серверов и испытанных не будет принимать «-all» в качестве аргумента. Поэтому единственный способ получить такую ​​информацию - это небольшой скрипт 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 

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

[email protected]:~# ./list_all_namespace tap8164117b-e3 
5.5.5.0/25 dev tap8164117b-e3 proto kernel scope link src 5.5.5.3 

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

1

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

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

Вы должны быть в состоянии найти порт нейтронную для интерфейса крана с:

$ 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 

идентификатор_сети в результате из порта-шоу должны позволяют выяснить netns (qdhcp- идентификатор_сети), содержащий tapda4018ab-b7.

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

0

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

[email protected]$ 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.

[email protected]$ ./get_dhcp_namespace.sh tapda4018ab-b7 
qdhcp-bd39f45d-b45c-4e08-ab74-85c0b1180aea