0

我有多個network namespaces 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特定的命令?

回答

0

根據這名男子頁http://man7.org/linux/man-pages/man8/ip-netns.8.html你可以運行在所有的命名空間exec命令,但我測試了一個Ubuntu值得信賴的服務器上,它不會接受「- 所有」作爲參數。所以我知道得到這樣的信息的唯一方法是通過一個小的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

如果我正確理解Neutron(如果我的唯一經驗是Kilo/2015.1.2的玩具安裝非常有限),那麼您應該能夠通過中子數據庫來跟蹤您的網絡,重新尋找

我相信你的抽頭接口將使用它所關聯的端口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 

從口出現結果的NETWORK_ID應該讓你找出netns(qdhcp- NETWORK_ID)含tapda4018ab-B7。

你應該能夠使用類似的邏輯來追蹤qg接口(它可能會在默認netns中的橋接器上顯示),但在這種情況下,它是擁有端口的device_id,它爲您提供qrouter- device_id你想要的淨額。

0

您可以使用此腳本。與作爲參數提供的TAP接口

[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" 

運行此 - :保存爲get_dhcp_namespace.sh。不要忘記獲取keystonerc/openstackrc/credentials文件。

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