当尝试查找位于不同命名空间的link-netnsid
对的正确对等网络接口时,该端不仅由其link-netnsid
属性指示,还由{{1}指示}。此RTM_GETNSID
是网络命名空间ID,仅在当前网络命名空间内有意义。
Linux内核不提供将netnsid映射到网络命名空间inode编号,这是唯一的唯一标识。但是,Linux提供NETNSA_FD
请求,该请求将由fd(NETNSA_PID
)或PID(RTM_GETNSID
)标识的网络命名空间映射到本地netnsid。
如何在Python中创建这样的pyroute2
请求,最好使用from pyroute2 import IPRoute
from pyroute2.netlink import NLM_F_REQUEST
import pyroute2.netlink.rtnl as rtnl
import pyroute2.netlink.rtnl.nsidmsg as nsidmsg
netstack = IPRoute()
req = nsidmsg.nsidmsg()
req['rtgen_family'] = 0
# 12345 is PID of a process inside another network namespace
req['attrs'] = [('NETNSA_PID', 12345)]
ret = netstack.nlm_request(req, rtnl.RTM_GETNSID, NLM_F_REQUEST)
库?到目前为止,我无法成功地为PID标识的命名空间请求netnsid,但只使用以下脚本返回无效参数错误22:
public long? PatientFileId {get; set;}
答案 0 :(得分:0)
事实证明我的代码实际上是正确的,但pyroute2
中存在一个错误,导致RTNETLINK消息太短几个八位字节(在strace
中可见)。作为这个库错误的临时黑客,设置两个属性就足够了,这样内核就会接受RTNETLINK数据包并对其进行处理,即使它不完全正确。
from pyroute2 import IPRoute
from pyroute2.netlink import NLM_F_REQUEST
import pyroute2.netlink.rtnl as rtnl
import pyroute2.netlink.rtnl.nsidmsg as nsidmsg
netstack = IPRoute()
req = nsidmsg.nsidmsg()
req['rtgen_family'] = 0
# 12345 is PID of a process inside another network namespace
req['attrs'] = [('NETNSA_PID', 12345), ('NETNSA_PID', 0] # hack around pyroute 0.5.0 bug
ret = netstack.nlm_request(req, rtnl.RTM_GETNSID, NLM_F_REQUEST)