当试图找到veth
位于不同命名空间中的一对的正确对等网络接口时,该端不仅由其iflink
属性指示,而且由link-netnsid
. 这link-netnsid
是一个网络命名空间 ID,仅在当前网络命名空间内有意义。
Linux 内核不提供将 netnsid 映射到网络命名空间 inode 编号,这是唯一的唯一标识。但是,Linux 提供的请求将由 fd ( ) 或 PID ( )RTM_GETNSID
标识的网络名称空间映射到本地 netnsid。NETNSA_FD
NETNSA_PID
如何RTM_GETNSID
在 Python 中提出这样的请求,最好使用pyroute2
库?到目前为止,我无法成功为 PID 标识的命名空间请求 netnsid,而只能使用以下脚本返回无效参数错误 22:
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)