问题标签 [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.
go - Linux 网络命名空间意外行为
所以我最近一直在玩网络命名空间。我整理了一个简单的代码,构建它并注意到发生了一些非常奇怪的事情。
代码如下:
现在,当您在 Trusty 14.04 上运行此代码时,您会看到一些奇怪的事情发生。当您连续多次运行二进制文件时会发生这种情况。
有时它会打印出所有主机的接口,有时它只是打印出一个环回接口,这意味着程序末尾的范围循环似乎在命名空间仍然附加时执行一次,有时当它已经被分离时。
我完全困惑为什么会发生这种情况,但我认为这要么是我的代码,要么我只是在程序执行或一些内核内容方面遗漏了一些东西。
任何帮助将不胜感激。
谢谢
更新 1: 所以看起来“奇怪”的行为与 golang 如何跨 OS 线程调度 goroutines 有关。所以你需要确保你处理好运行时。我的意思是,如果您将代码执行锁定到一个 OS 线程,您将获得一致的结果。您可以通过添加以下运行时包语句来做到这一点:
然而这仍然不能解决我的问题,但现在我认为这一切都归结为对命名空间的理解。我需要对此进行更多研究。
更新2: 为了让您了解为什么在运行一堆系统调用时应该使用上述操作系统线程锁并体验到正确行为的类似“奇怪”,请阅读这篇博文。它描述了运行时和 go 调度程序。它是为 go 1.1 编写的,但它仍然提供了很好的概述。
linux-kernel - `task_struct` 和 `pid_namespace` 之间有什么关系?
我正在研究一些内核代码并试图了解数据结构是如何链接在一起的。我知道调度程序如何工作的基本概念,以及 PID 是什么。但是我不知道在这种情况下命名空间是什么,也无法弄清楚所有这些是如何协同工作的。
我已经阅读了一些解释(包括 O'Reilly “Understanding the Linux Kernel”的部分内容)并理解可能是同一个 PID 进入了两个进程,因为一个进程已经终止并且 ID 被重新分配。但我无法弄清楚这一切是如何完成的。
所以:
- 在这种情况下,什么是命名空间?
task_struct
和之间有什么关系pid_namespace
?(我已经认为它与pid_t
,但不知道如何)
一些参考资料:
- 的定义
pid_namespace
- 的定义
task_struct
- 的定义
upid
(另见pid
下方)
linux - Docker 安全性最佳实践
您可以在 Internet 上找到的大多数 Dockerfile 都以 root 身份构建和运行软件!这一定吓到大家了吧?……但好像不是这样的……
所以 pb 就是以 root 身份运行服务器,即使在容器中也是危险的,因为容器内的 root 与容器外的 root 完全相同。
解决方案之一是通过使用“USER”指令正确构建 Dockerfile,例如 Tor 中继。
另一种解决方案是使用“linux 用户命名空间”将容器内的 UID/GID“映射”到容器外的 UID/GID。例如,容器内的 root (uid=0) 可以映射到您在主机内的个人用户帐户,因此在共享卷中创建的文件具有良好的权限。
所以我的问题是:关于 Docker 的安全性,最佳实践是什么?以非 root 身份运行代码(即 Dockerfile 中的 USER 指令)?或者通过使用“用户命名空间”?或者最终(或另外)使用 selinux 和/或 AppArmor ?
谢谢 :)
linux - How to find a Linux namespace by network adapter?
I have a Linux server with multiple network namespaces defined:
Each namespace contains one or more virtual network adapters - in this case, it's a TAP device:
Now let's say I know the name of the adapter - tapda4018ab-b7
- but I don't know the namespace it belongs to. Is there a way to look it up without checking namespaces one by one? Is there a generic Linux command to do this? Or at least OpenStack Neutron-specific command?
linux - 分离父进程的终端
我正在 Linux 下试验命名空间,所以我正在编写一个小型 C 程序来隔离使用 debootstrap 创建的 Debian Wheezy 环境。
我可以成功启动 sysv-init 并获得登录提示,但是当我关闭隔离环境时,无论是关闭系统还是杀死 -9 init,终端都处于似乎没有控制终端连接到 shell 的状态。具体来说,如果我启动 sudo 它会抱怨没有终端存在。
我将 sudo 中的故障点缩小到以下语句:
带有错误 ENXIO(即“没有这样的设备或地址”)。
我试图理解为什么会发生这种情况,我感觉这与 init 中的 setsid() 系统调用有关,但我无法重现确切的场景,因此我无法提供适当的测试用例。
对我来说真正奇怪的是,不仅 init (一个分叉的进程,因此是 shell 的子进程)从当前终端分离,而且直到 GUI 终端的所有进程层次结构也从 tty 分离,我似乎无法弄清楚它是如何发生的。
另外,不同的命令之间也存在一些不一致的地方:
非常感谢有关这种情况的任何线索。
编辑:查看“/dev/tty”的内核源代码,我认为问题与内核端 char 设备的引用计数有关。实际上,为了将“/dev/{console|tty0|tty1}”输出重定向到当前 pty,我将 shell 的控制终端绑定到容器的已安装 dev 中的那些设备文件。
编辑:似乎在Linux内核中,在“tty_open_current_tty()”函数的这一步中报告了错误:
编辑:似乎问题与“窃取”控制 tty 的概念有关。这可以在CAP_SYS_ADMIN
能力下完成,并使用 TIOCSCTTY 作为命令和 1 作为参数调用ioctl()
tty 文件描述符(参见tty_ioctl(4))。我将尝试编写一个测试用例来确认这一点并报告回来。
linux - lxc 在容器之间共享网络命名空间
我正在尝试启动一个 lxc 容器 deb1 并用于--share-net
启动另一个容器 deb2 以共享网络命名空间。但是在 Fedora 和 Ubuntu i 中都出现以下错误:
有人用过--share-net
选项吗?
linux - Linux VXLAN 驱动程序和网络命名空间
我正在尝试了解 linux 内核中的 vxlan 驱动程序代码。内核版本为:3.16.0-29-generic
看起来vxlan.c
似乎每个 VNI 创建了一个 vxlan dev,它与 netdevice 所属的 netns 相关联,并且每个 dev 创建了一个 udp 套接字。
我对此有点困惑,因为除了全局 netns 之外,您不能真正将 vxlan 设备附加到物理设备 ( ethx
),因为物理设备必须与 vxlan 设备属于相同的 netns。
例如:如果我在全局 netns 中创建一个 vxlan 链接,它会按预期工作:
如果我尝试在网络命名空间中做同样的事情,它将不起作用:
这里的问题是它不喜欢“dev eth0”,因为代码会检查 eth0 是否与正在添加的链接在同一个 netns 中。
如果我在没有 eth0 的情况下创建相同的设备,它可以正常工作:
如果您无法将运营商连接到 vxlan 设备,您如何才能真正向/从主机外部发送/接收数据包?
这是否意味着实际上您只能将 vxlan 驱动程序与全局 netns 一起使用,或者您“必须”将其与网桥一起使用?
vxlan 数据包有一个与之关联的 VNI。您应该能够使用它直接将数据包发送到非全局 netns 中的开发人员,这与 macvlans 的实际情况类似。
我错过了什么吗?
linux - LXC 如何实现网络命名空间?
我想知道 LXC 如何实现网络命名空间。一个特定方面是它如何将命名空间中的虚拟接口连接到物理接口。假设一个命名空间中的网络连接到一个veth,而根命名空间使用eth0,那么LXC如何将veth连接到eth0?它使用 Linux 桥接器还是 OpenVswitch?
c - 如何识别linux系统调用unshare中的性能瓶颈(CLONE_NEWNET)
我有一个不断创建和删除网络命名空间的 linux 应用程序(用 C 编写)。通常一个创建/删除周期大约需要 300 毫秒。
在性能调查期间,我对程序运行了 strace 以找出哪个系统调用花费的时间最多。从 strace 输出来看,似乎第一次调用 unshare 在我的系统上只需要 4 毫秒,但随后的调用需要接近 200 毫秒。
该程序的结构使得在循环(内部控制循环)开始时,它创建一个网络命名空间并在循环结束时删除命名空间。
只是为了试验,我修改了我的应用程序,使其在控制周期结束时不删除网络命名空间——只创建新的网络命名空间,但从不删除它们。这显着提高了性能,并且我在随后的 unshare 系统调用调用中没有任何延迟。每个 unshare 系统调用需要 2-3 毫秒。
显然,删除网络命名空间会以某种方式影响/延迟随后的网络命名空间创建。
这里会发生什么?我该如何进一步调试呢?
我正在使用 linux 内核 3.12.9-301.fc20.x86_64。
linux-kernel - 监控网络命名空间
有没有办法监控内核中的 netns 创建/删除?
iproute2 提供了对此进行监控的方法,但它通过使用 inotify 来查找 netns fd in 的创建/删除/var/run/netns
。很多时候 netns 是在没有条目的情况下创建的/var/run/netns
。
理想情况下,netns 创建/删除通知应该可以通过来自内核的 netlink 消息获得,但似乎并非如此。
观察/proc/<pid>
创建然后 stat(ing) /proc/<pid>
/ns/net 似乎不是一个可行的选择。