0

I have a Linux server with multiple network namespaces defined:

# 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
... ...

Each namespace contains one or more virtual network adapters - in this case, it's a TAP device:

# 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

Now let's say I know the name of the adapter - tapda4018ab-b7 - but I don't know the namespace it belongs to. Is there a way to look it up without checking namespaces one by one? Is there a generic Linux command to do this? Or at least OpenStack Neutron-specific command?

4

3 回答 3

1

根据此手册页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

然后,您可以使用您的 tap 设备作为唯一参数来启动脚本,如下例所示:

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

如果你不提供参数,它会给你一个错误。

于 2015-04-04T12:53:08.133 回答
1

如果我正确理解 Neutron(这是一个很大的假设 - 我唯一的经验是 Kilo/2015.1.2 的玩具安装相当有限),你应该能够通过 neutron 的数据库来跟踪你正在寻找的 netns

我相信您的分路接口将使用与其关联的端口 uuid 的前 5 个八位字节(10 个字符)命名,并且 qdhcp netns 使用其网络的 uuid,因此您应该能够使用 neutron 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

port-show 结果中的 network_id应该让您找出包含 tapda4018ab-b7的 netns (qdhcp- network_id )。

您应该能够使用类似的逻辑来跟踪 qg 接口(这可能会显示在默认 netns 中的网桥上),但在这种情况下,拥有端口的 device_id 会为您提供所需的 qrouter- device_id netns。

于 2016-04-15T13:36:13.367 回答
0

您可以使用此脚本。将此保存为 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"

使用作为参数提供的 tap 接口运行它。不要忘记获取 keystonerc/openstackrc/credentials 文件的来源。

ubuntu@ubuntu$ ./get_dhcp_namespace.sh tapda4018ab-b7
qdhcp-bd39f45d-b45c-4e08-ab74-85c0b1180aea
于 2016-04-18T04:36:28.350 回答