我有一台Linux服务器,其中定义了多个network namespaces:
# 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 :(得分:1)
如果我正确理解Neutron(这是一个很大的问题 - 我唯一的经验是使用Kilo / 2015.1.2相当有限的玩具装置),你应该能够通过neutron的数据库来找出你的净值寻找
我相信您的tap接口将使用与其关联的端口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接口(可能会显示在默认网络中的网桥上),但在这种情况下,它是拥有端口的device_id,它为您提供了qrouter- 你想要的device_id netns。
答案 1 :(得分:0)
根据此手册页http://man7.org/linux/man-pages/man8/ip-netns.8.html,您可以在所有命名空间上运行exec命令,但我在ubuntu可信任服务器上测试它并且它不会接受“ -all < / strong>“作为一个论点。因此,我知道获取此类信息的唯一方法是通过一个小的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
如果您不提供参数,它将给您一个错误。
答案 2 :(得分: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