【问题标题】:How to enter network namespace by name?如何按名称输入网络命名空间?
【发布时间】:2022-01-28 13:47:27
【问题描述】:

我的程序需要连接到两个 TAP 接口,每个接口都位于各自的网络命名空间中。因为setns() 在 pthread 级别工作,所以我计划为每个接口设置一个专用的 pthread。 (我的程序本身在“根”命名空间中运行。)

但是,setns() 函数要求我将文件描述符传递给我要进入的网络命名空间。获取此描述符需要该名称空间中已存在的进程的 pid。一旦我有了那个 PID,我就可以调用 open() 来获取网络命名空间的文件描述符:

int fd = open("/proc/<pid>/ns/net");

但是我如何获得那个 PID?

一种方法是在所需的命名空间中创建一个“虚拟”进程:

ip netns exec tap101-ns sleep 100 & 
[1] 30645

然后在我的程序中使用该 PID:int fd = open("/proc/30645/ns/net")

不过,这种工作方式似乎有点傻……

当我只有想要输入的命名空间的名称时,是否有更简洁的方法来输入网络命名空间?

【问题讨论】:

    标签: c++ c linux


    【解决方案1】:

    我在发布我的问题后不久偶然发现了一个解决方案。

    路径/var/run/netns/也可以用来获取文件描述符。根据ip-netns documentation

    打开 /var/run/netns/NAME 产生的文件描述符引用指定的网络命名空间。保持该文件描述符打开可以使网络命名空间保持活动状态。文件描述符可以与 setns(2) 系统调用一起使用,以更改与任务关联的网络命名空间。

    所以我可以使用这段代码切换到我的 pthread 中的命名空间:

    int namespace_fd = open("/var/run/netns/tap101-ns");
    setns(namespace_fd, CLONE_NEWNET);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-23
      • 2015-04-17
      • 2016-12-19
      • 2012-06-30
      • 2011-07-05
      • 2018-10-11
      • 2012-03-13
      • 2016-05-03
      相关资源
      最近更新 更多