【问题标题】:How to find a Linux namespace by network adapter?如何通过网络适配器找到 Linux 命名空间?
【发布时间】:2014-12-03 10:05:28
【问题描述】:

我有一个定义了多个 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 特定的命令?

【问题讨论】:

    标签: linux networking openstack openstack-neutron linux-namespaces


    【解决方案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
    

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

    【讨论】:

      【解决方案2】:

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

      我相信您的 Tap 接口将使用与其关联的端口 uuid 的前 5 个八位字节(10 个字符)命名,并且 qdhcp netns 使用其网络的 uuid,因此您应该能够使用 neutron CLI追踪正确的命名空间。

      您应该能够通过以下方式找到您的 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
      

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-04-17
          • 1970-01-01
          • 2017-05-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多