问题标签 [linux-namespaces]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2332 浏览

c - 'unshare' 在 C api 中无法按预期工作

这一系列命令有效:

但是,相应的 C 程序没有按预期工作(似乎它没有卸载以前的 /proc,并且它还提供 EBUSY 试图卸载 devpts):

我在这里省略了错误检查以提高可读性

我认为 unshare 或 unmount 不能按预期工作:即使它返回零,似乎也不会卸载 /proc (如果我尝试在此system("mount")之后执行 a ,它会打印已安装的文件系统)。

0 投票
1 回答
5640 浏览

linux - 网络命名空间和桥接

大家好,我是偶尔的 linux 用户,但我有一个项目要做,我需要一些关于桥接的帮助 :)
我已经尝试过 google,但没有解决问题。

我的任务是创建网络命名空间,因此它可以用来执行其他一些任务。

Debian 8.2 用于 Windows 7 上的 VMWare 虚拟机。我也在 Raspberry Pi 2 上尝试过同样的事情,但出现了同样的问题。

首先,我按照教程https://lwn.net/Articles/580893/创建了一对虚拟以太网接口。所以现在我在全局命名空间中有 veth0,IP 地址为 10.1.1.2/24,在 netns1 命名空间中有 veth1,IP 地址为 10.1.1.1/24。

接下来,我按照教程http://www.linuxfoundation.org/collaborate/workgroups/networking/bridge来桥接 eth0 和 veth0,所以我可以从 netns1 命名空间访问互联网。

  • 首先,我删除了 eth0 和 veth0 接口的 IP 地址,并将它们设置为 DOWN 状态。

  • 创建新的网桥 (br0) 并添加两个接口(eth0 和 veth0)。

  • 然后两个接口都设置为 UP 状态,我运行“dhclient br0”将 ip 地址分配给 br0。

现在可以从全局命名空间运行“ping google.com”,但从 netns1 命名空间我收到错误“网络无法访问”。(我想路由有问题,我尝试向 netns1 命名空间添加一些默认路由,但没有运气。我的网络知识很少,所以我正在寻求帮助。)

$ ip地址显示

$路线

$ ip netns exec netns1 ip addr show

$ ip netns exec netns1 路由

$ brctl 显示

提前感谢您的帮助:)

0 投票
1 回答
846 浏览

c - 在不同网络命名空间中的进程之间共享状态

使用更多信息更新问题:

我在 Linux Ubuntu 14.04 机器上有 32 个网络命名空间,每个命名空间中运行一个 C 程序。我希望程序能够与其他命名空间(不是线程,单独的进程)中的兄弟姐妹共享一些数据。如何才能做到这一点?我无法进行 UDP 多播,因为每个命名空间都有自己的网络堆栈,并且发送到多播域的数据包对其他命名空间不可见。我也无法考虑通过 mmap 内存干净地做到这一点。

使用 mmap(),每个进程可能会尝试同时写入地图。此外,当一个进程写入时,其他进程应该能够弄清楚这一点,并用这个新内容更新他们的数据结构。一旦每个进程都知道这个先前的更新,他们就被允许写。这就是为什么我首先想到使用 UDP Multicast 套接字进行通信的原因,它对 32 个进程非常有效,但它们必须在同一个命名空间中。

此外,据我所知,Unix 域套接字不允许多个读取器/写入器工作。

感谢任何帮助!

0 投票
0 回答
309 浏览

c - netlink_register_notifier 不适用于网络命名空间支持?

我找不到函数“ netlink_register_notifier ”或“ netlink_unregister_notifier”,它们用于在当前支持使用 netlink_kernel_create( net , ...) 函数的 Unix 内核中的“ NETLINK_URELEASE ”等事件期间处理通知

那么Netlink通知的处理方式是什么呢?喜欢 NETLINK_URELEASE?

当用户空间进程关闭或终止时,内核中的 netlink 通知器将被调用,我们可以在其中处理清除关闭;现在如何在当前支持网络命名空间的 Linux 内核中处理这个问题。

例如:

现在,如果我通过运行启动 lxc

然后内核崩溃但是如果我删除了整个通知程序 netlink_register_notifier 和 netlink_unregister_notifier 事情都很好,但现在我无法处理用户应用程序终止:(

0 投票
1 回答
590 浏览

linux - 与不同命名空间中的套接字对应的文件描述符是否分配了相同的数值?

我需要打开多个 TCP 套接字,对应于在 linux 中编程的每个命名空间。
我想知道分配给这些套接字的fd是否相同或者它们总是系统范围内唯一的?

0 投票
0 回答
76 浏览

c - 确定通过 NetLink 发送 skb_buff 的正确容器

目前我正在使用 lxc 运行多个容器,每个容器都绑定到物理接口;比如说 eth1-c1、eth2-c2、eth3-c3,其中 ethX 是物理接口,cX 是容器;

每个容器都运行一个用户空间应用程序,该应用程序使用 NetLink 注册到 Linux 内核;现在,当一些数据包进入接口说 eth2 时,我需要通过 NetLink 将该数据包发送到在 c2 中运行的用户空间应用程序,因为 eth2 现在已绑定到 c2。

如果 eth4 绑定到 c3,那么内核在 eth4 上接收到的数据包应该通过 netlink 将数据包发送到在 c3 上运行的用户空间应用程序。

我们怎样才能做到这一点?我知道 skb_buff 包含开发名称(skb_buff->dev->name),这将帮助我获取接口名称(比如 eth2 或 eth3),但是如何将其重定向到在容器中运行的注册用户应用程序,因为我没有其他详细信息pid 号以外的用户应用程序。

0 投票
1 回答
3171 浏览

linux - 如何让 dhclient 知道命名空间?

我正在使用命名空间来分隔服务器上的几个物理接口。路由工作完美。此外,我在 /etc/netns/ 中为每个命名空间都有一个文件夹,例如 /etc/netns/namespaceA/resolv.conf,这样 DNS 也可以正常工作。

将 DHCP 与 dhclient 一起使用时会出现问题。我正在从命名空间内运行 dhclient 并收到此错误。

我发现 /etc/resolvconf/update.d/libc 中的 mv 包含一个可能导致问题的 mv。

如何让 dhclient 知道命名空间?

0 投票
0 回答
1749 浏览

linux - 为什么我在 linux 网络命名空间中的 vlan 接口无法 ping 父接口?

所以我正在编写一个用命名空间隔离自身的程序,但我坚持让网络按我的意愿工作。我计划通过 Tor 路由我的应用程序,这是一个 Socks5 代理,它在网络接口上公开一个 SocksPort。

当我的应用程序已经与虚拟机和仅主机路由隔离时,我的应用程序需要工作,主机上的 Tor 绑定说 vboxnet1 (192.168.56.1:9051),VM 内部的 eth0 是 (192.168.56.101),然后我有一个网络命名空间。因此,我不能简单地使用 veth 对并将 Tor 绑定到父命名空间上的 veth,因为 Tor 甚至不在虚拟机中。所以最终,我需要通过父命名空间中的 eth0 (192.168.56.101) 从命名空间连接到 192.168.56.1:9051 上的 SocksPort。但是,当我不在虚拟机中并且 Tor 在父命名空间中时(与具有父命名空间的 VM 的主机相反),我使用的解决方案也应该可以工作。

这只是关于为什么 veth 对等对我不起作用的一些背景,总的来说,我想要做的是,我的问题更具体;

我按照以下链接中的指南进行操作:http: //blog.scottlowe.org/2014/03/21/a-follow-up-on-linux-network-namespaces/

在 Linux 3.16 上

我将立即执行并显示我正在输入的确切命令:

ip netns 添加蓝色

ip 链接添加链接 eth0 名称 eth0.100 类型 vlan id 100

此时“ip -d link”,显示如下(MAC 已编辑);

ip 链接设置 eth0.100 netns 蓝色

我注意到蓝色命名空间中的 ip -d 链接具有以下输出

ip netns exec 蓝色 ip -d 链接

请注意,现在是 eth0.100@if2 而不是 @eth0,我不确定这是否相关。

我提出了环回,这实际上不在我提到的指南中,但我认为这是必需的:

ip netns exec blue ip link set dev lo up

ip netns exec blue ip addr add 192.168.56.102/24 dev eth0.100

ip netns exec blue ip link set eth0.100 up

ip netns exec blue ifconfig 现在显示这个(稍微编辑了)

从父命名空间 ifconfig 显示

但是当我按照指南尝试从命名空间ping通时;

ip netns exec blue ping -c 4 192.168.56.101

PING 192.168.56.101 (192.168.56.101) 56(84) 个字节的数据。

从 192.168.56.102 icmp_seq=1 目标主机不可达

它总是无法访问,如果我尝试 192.168.56.1 也是如此,这最终是我想要连接的(它是主机上的 vboxnet,可以从 vm 中的 eth0 路由到,但我什至不能从命名空间路由到 eth0,即使将 vlan 接口添加到命名空间)。

感谢您提供的任何帮助,我已经尝试了几个小时,并且几乎用尽了所有资源。

0 投票
2 回答
1921 浏览

linux - 从内核中按名称列出所有 Linux 网络名称空间

我需要一些很好的例子来说明如何从内核内部获取网络命名空间的名称。获取设备名称很简单,但对于网络名称空间来说并不那么明显。有谁知道从内核内部获取网络名称空间名称的简单方法。

以下代码确实打印出所有网络命名空间中的所有设备,我如何从内核内部获取要打印的命名空间的名称。struct net 结构并没有像我所知的那样指向名称。

0 投票
3 回答
8370 浏览

linux - 如何检查当前操作系统内核是否支持 Linux 用户命名空间

经过一番阅读,我发现 Linux 用户命名空间一般在 Linux 版本 >= 3.8 中都支持。但是,有可能在给定的操作系统上禁用了用户命名空间,从而使内核版本的检查变得不可靠。是否有一种可靠的方法来检查我正在使用的当前操作系统是否支持用户命名空间并可以使用它?