使用netlink的虚拟机和内核通信

时间:2016-08-15 12:37:10

标签: virtual-machine emulation netlink

我写了一个linux内核模块和一个用户空间应用程序。他们通过netlink进行了很好的沟通。但是当我尝试在CORE(Common Open Research Emulator)中的模拟节点上运行用户空间应用程序时,我得到了错误111(连接被拒绝)。你能帮我找到原因吗(根据CORE,模拟节点是一个虚拟机,它使用与本地主机相同的内核)?

非常感谢!

2 个答案:

答案 0 :(得分:0)

我的猜测是因为缺乏Linux功能(CAP_NET_ADMIN)。您是否检查了用户空间进程和VM进程的功能?

答案 1 :(得分:0)

我得到"连接被拒绝的原因"错误是因为用户域和内核域进程没有驻留在同一网络空间中。内核 - 陆地进程正在" root"空间,而用户土地过程正在另一个空间发送。

CORE使用Linux虚拟化。它为每个模拟节点创建单独的进程和网络空间。如果应用程序在CORE节点上运行,则其用户域进程具有自己的进程ID空间和网络堆栈空间。应用程序发送的消息被限制在CORE节点自己的空间内。

要在使用CORE时启用内核域和用户域通信,我们应该首先让应用程序切换到内核的网络空间,然后创建一个netlink套接字并通过套接字发送消息。

要切换到内核网络空间,我们需要先将/proc挂载到/proc_root。然后,在应用程序中,在使用Netlink将消息发送到kernel-land进程之前添加{fd = open("/proc_root/1/ns/net", O_RDONLY); setns(fd, 0);}