【发布时间】:2016-08-15 12:37:09
【问题描述】:
我编写了一个 linux 内核模块和一个用户空间应用程序。他们通过 netlink 进行了很好的沟通。但是当我尝试在 CORE(通用开放研究模拟器)中的模拟节点上运行用户空间应用程序时,我得到了 errno 111(连接被拒绝)。你能帮我找出原因吗(根据CORE,模拟节点是一个虚拟机,它使用与本地主机相同的内核)?
非常感谢!
【问题讨论】:
标签: virtual-machine emulation netlink
我编写了一个 linux 内核模块和一个用户空间应用程序。他们通过 netlink 进行了很好的沟通。但是当我尝试在 CORE(通用开放研究模拟器)中的模拟节点上运行用户空间应用程序时,我得到了 errno 111(连接被拒绝)。你能帮我找出原因吗(根据CORE,模拟节点是一个虚拟机,它使用与本地主机相同的内核)?
非常感谢!
【问题讨论】:
标签: virtual-machine emulation netlink
我的猜测是因为缺乏 linux 功能 (CAP_NET_ADMIN)。你检查过你的用户空间进程和你的虚拟机进程的能力吗?
【讨论】:
我收到“连接被拒绝”错误的原因是用户级和内核级进程不在同一个网络空间中。内核态进程在“根”空间监听,而用户态进程在另一个空间发送。
CORE 使用 Linux 虚拟化。它为每个模拟节点创建单独的进程和网络空间。如果应用程序在 CORE 节点上运行,则其用户级进程有自己的进程 ID 空间和网络堆栈空间。应用程序发送的消息被限制在 CORE 节点自己的空间内。
为了在使用 CORE 时启用内核态和用户态通信,我们应该先让应用程序切换到内核的网络空间,然后创建一个 netlink 套接字并通过套接字发送消息。
要切换到内核的网络空间,我们需要先将/proc挂载到/proc_root。然后,在应用程序中,在使用 Netlink 向内核级进程发送消息之前添加{fd = open("/proc_root/1/ns/net", O_RDONLY); setns(fd, 0);}。
【讨论】: