首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将“匿名”网络命名空间内的veth设备连接到外部设备?

如何将“匿名”网络命名空间内的veth设备连接到外部设备?
EN

Unix & Linux用户
提问于 2017-10-05 00:59:47
回答 1查看 5.7K关注 0票数 8

我有一个名为unshare的进程,用于创建一个新的网络命名空间,其本身就在里面。当它调用execve来启动bash时,ip命令显示我只有一个lo设备。如果我还创建了一个用户名称空间,并将我的进程安排在名称空间中,我可以使用ip命令来启动该设备并使其工作。

我还可以使用ip命令在这个命名空间中创建一个veth设备。但是它不会出现在ip netns list中,新的veth设备也不会出现在根级命名空间中(正如我所期望的)。如何将根级命名空间中的veth设备连接到流程命名空间中的新veth设备?ip命令似乎要求名称空间有一个由ip命令分配的名称,而我的命令不需要,因为我没有使用ip netns add来创建它。

也许我可以通过编写我自己的程序,使用netlink设备并设置一些东西来完成这个任务。但我真的不想。有什么方法可以通过命令行这样做吗?

必须有一种方法来做到这一点,因为docker容器也有自己的网络命名空间,而且该名称空间也是未命名的。然而,它里面有一个veth设备,它连接到它外面的一个veth设备。

我的目标是动态创建流程隔离上下文,理想情况下不需要成为容器之外的根。为此,我将创建一个PID命名空间、一个UID命名空间、一个网络名称空间、一个IPC名称空间和一个挂载命名空间。我还可以创建一个cgroup名称空间,但这些名称空间是新的,我需要能够在当前支持的SLES、RHEL和Ubuntu版本上运行。

我一直在一次访问这个名称空间,目前用户、PID和挂载名称空间都能令人满意地工作。

如果必须的话,我可以挂载/proc/pid/ns/net,但我更愿意在用户名称空间中安装,因此(同样)我不必在名称空间之外成为根用户。大多数情况下,只要名称空间中的所有进程都消失了,我就希望一切都消失。当我完成任务时,拥有一堆状态来清理文件系统并不理想。虽然在容器第一次分配时临时创建它,然后立即删除它,但它要比容器退出时清理它要好得多。

不,我不能使用docker、lxc、rkt或任何其他现有的解决方案,除了bog标准的系统实用程序(如ip)、系统库(如glibc )和Linux系统调用之外。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2017-10-05 07:16:32

ip link有一个命名空间选项,该选项除了网络名称空间名称外,还可以使用PID引用进程的命名空间。如果进程之间共享PID名称空间,则可以任意移动设备;当您认为PID 1是“外部”时,从内部看可能是最简单的。使用单独的PID名称空间,您需要从外部(PID)命名空间移动到内部命名空间。

例如,从网络命名空间内部可以创建一个veth设备对到PID 1命名空间:

代码语言:javascript
复制
ip link add veth0 type veth peer name veth0 netns 1

名称空间如何在Linux

中工作

每个进程在/proc/<pid>/ns/中都有各自名称空间的引用文件。此外,ip netns/run/netns/中创建持久引用文件。这些文件与setns系统调用一起使用,以将正在运行的线程的命名空间更改为该文件所指向的命名空间。

从shell中可以使用nsenter程序输入另一个名称空间,在参数中提供命名空间文件(路径)。

运行中的命名空间关于LWN.net的系列文章中给出了Linux名称空间的一个很好的概述。

设置名称空间

当您设置多个名称空间(挂载、pid、用户等)时,请在更改挂载和pid名称空间之前尽早设置网络命名空间。如果没有共享挂载或pid名称空间,则无法指向外部的网络命名空间,因为无法看到外部引用网络命名空间的文件。

如果您需要比命令行实用程序提供更多的灵活性,则需要使用系统调用直接管理程序中的名称空间。有关文档,请参见相关的手册页:man 2 setnsman 2 unshareman 7 namespaces

票数 6
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/396175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档