【问题标题】:Virtual machine and kernel communication using netlink使用 netlink 进行虚拟机和内核通信
【发布时间】:2016-08-15 12:37:09
【问题描述】:

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

非常感谢!

【问题讨论】:

    标签: virtual-machine emulation netlink


    【解决方案1】:

    我的猜测是因为缺乏 linux 功能 (CAP_NET_ADMIN)。你检查过你的用户空间进程和你的虚拟机进程的能力吗?

    【讨论】:

    • 嗨 Galka,感谢您回答我的问题。我大约一年前发布了它,现在我找到了解决方案。问题是我使用了Netlink,当两个通信进程位于同一个网络和进程空间时,它只支持内核和用户空间通信。因为 CORE 节点使用单独的网络和进程空间,所以出现错误。我试图让 CORE 节点切换到内核空间,然后错误就消失了。 :)
    • 嗨,蒂娜。为什么不提交答案,大家都很好奇:)
    • 好吧,我不知道。下次我会做的:)
    • @Tina 这次也请做!这是一个问答库,如果您能解决问题,请务必发布答案,无论是否是您自己的问题。
    • @BaummitAugen 我已经发布了更详细的答案!
    【解决方案2】:

    我收到“连接被拒绝”错误的原因是用户级和内核级进程不在同一个网络空间中。内核态进程在“根”空间监听,而用户态进程在另一个空间发送。

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 2012-07-15
      • 2011-03-18
      • 2020-05-21
      • 1970-01-01
      相关资源
      最近更新 更多