问题标签 [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 投票
1 回答
1683 浏览

linux - 在特定的用户命名空间配置中运行每个 Docker 容器

问题:

我正在尝试以这样的方式将目录挂载为 Docker 卷,即在容器内创建的用户可以写入该卷中的文件。同时,该文件至少应该lape对容器外的用户可读。

本质上,我需要将用户 UID 从容器用户命名空间重新映射到主机用户命名空间上的特定 UID。

我怎样才能做到这一点?

我更喜欢以下答案:

  • 不涉及更改 Docker 守护程序的运行方式;
  • 并允许为每个容器分别配置容器用户命名空间;
  • 不需要重建镜像;
  • 我也会接受显示使用访问控制列表的不错解决方案的答案;

设置:

这就是可以复制这种情况的方式。

我有我的 Linux 用户lape,分配到docker组,所以我可以运行 Docker 容器而不是 root。

Dockerfile:

入口点.sh:

一旦构建了:

我运行容器:

输出如下所示:

所以该文件似乎是作为 user 创建的insider

在我的主机上,权限如下所示:

这表明该文件属于 uid=800 (即insider在 Docker 命名空间之外甚至不存在的用户)。

我已经尝试过的事情:

  1. 我尝试将--user参数指定为docker run,但它似乎只能将主机上的哪个用户映射到docker命名空间内的uid = 0(root),在我的情况下insider不是root。所以在这种情况下它并没有真正起作用。

  2. 我如何insider从容器内实现 (uid=800) 的唯一方法,从主机被视为 lape(uid=1000),是添加--userns-remap="default"dockerd启动脚本,并添加dockremap:200:100000到文件中/etc/subuid,并/etc/subgid按照--userns- 文档中的建议重新映射。巧合的是,这对我有用,但这还不够,因为:

    • 它需要重新配置 Docker 守护进程的运行方式;
    • 需要对用户 ID 进行一些运算:'200 = 1000 - 800',其中 1000 是我在主机上的用户的 UID,而 800 是insider用户的 UID;
    • 如果内部用户需要比我的主机用户更高的 UID,这甚至都行不通;
    • 它只能配置如何全局映射用户命名空间,而无法为每个容器进行唯一配置;
    • 这种解决方案很有效,但对于实际使用来说有点太丑了。
0 投票
1 回答
6391 浏览

linux - 取消共享用户命名空间并使用 newuidmap 设置 uid 映射

我试图通过试验unshareandnewuidmap命令来更好地理解用户命名空间。

这些是我运行的命令:

/etc/subuid:

知道为什么这会失败吗?

然后我尝试newuidmap在父命名空间的同一个 PID 上运行该命令,它似乎可以工作:

但是当我从新命名空间中运行一个进程时,它似乎仍然以 root 而不是 UID 5000 运行:

从另一个外壳:

我错过了什么?

0 投票
0 回答
572 浏览

linux - 创建没有 root 权限的非特权 cgroup

我想在新的命名空间中创建 cgroups 以控制进程的资源使用情况,如下所示:

但我无法修改 cpuset 文件夹,因为文件夹的所有者显示nobody。有什么方法可以在我有权访问的新命名空间中设置 cgroups 吗?

0 投票
1 回答
1514 浏览

linux - 如何在基于内核 2.6.38 和 initd 的系统中启用 Linux 命名空间?

我想在 linux 内核 2.6.38 和 init.d 上运行 LXC 2.0,无论内核版本和 initd 是否都是必需的。

我已经重新编译了具有命名空间支持的内核,如下所示。

一切都运行成功,直到我在lxc-start -n ts1 --logfile=ts1.log.

LXC/start.c:138 说我的父进程没有/proc/<PID>/ns文件夹,当我检查它时,即使系统中的所有进程(包括 initd)也是如此。

我假设 initd 没有将命名空间作为初始过程考虑在内。

我需要做什么才能使 initd 附加命名空间?

0 投票
1 回答
236 浏览

linux - 创建非共享命名空间

当运行unshare命令 ( man 1 unshare) 时,它允许在与 shell 不同的命名空间中执行命令,为什么我仍然可以看到来自主机的所有进程?PID 命名空间不是设计不共享的吗?

谢谢。

0 投票
1 回答
1195 浏览

linux - 无法打开 uid_map 以从具有 cap_setuid 功能集的应用程序写入

在玩弄user_namespaces(7)中的示例时,我遇到了一种奇怪的行为。

应用程序的作用

应用程序user-ns-ex使用 CLONE_NEWUSER 调用 clone(2),从而在新的用户命名空间中创建一个新进程。父进程将映射 ( 0 1000 1) 写入 /proc//uid_map 文件并(通过管道)告诉子进程它可以继续。然后子进程 execs bash

我在这里复制了源代码。

问题

如果我将其设置为无功能或全部设置,应用程序将打开 /proc//uid_map 进行写入。

当我仅设置 set_capuid、set_capgid 和可选 cap_sys_admin 时,对 open(2) 的调用失败:

设置上限:

尝试运行:

现在一个成功的案例:

没有能力:

运行正常:

我一直试图在手册页中找到原因并尝试使用不同的功能,但到目前为止还没有运气。最让我困惑的是,应用程序以更少的功能运行而没有更多的功能。

有人可以帮助我并澄清问题吗?

0 投票
1 回答
880 浏览

c - 将挂载从子命名空间传播到父命名空间?

如何将在子命名空间中创建的挂载传播到父命名空间?

细节

我正在尝试创建一个工具来overlayfs允许写入只读目录。棘手的一点是,我希望任何用户都能够在没有 root 权限的情况下使用它。因此,我希望这可以通过挂载命名空间来实现,前提是管理员已经挂载了一个共享目录,那么任何用户都应该能够在该树下创建从父命名空间可见的覆盖(因此任何用户登录贝壳可以看到覆盖安装)。

这是我尝试过的,但不起作用:

假设用户想要创建一个覆盖/some/readonly/dir,他们应该创建/overlays/user/{upper,work,mnt}。我希望他们能够在/overlays使用以下代码传播的目录下安装覆盖。

执行gcc user_overlay.c -o user_overlay && ./user_overlay确实会在该子进程中安装覆盖,但/overlays/user/mnt不会传播到父进程。/overlays/user/upper但是,对父子节点的修改都是可见的。

0 投票
1 回答
264 浏览

python - 如何在其他网络命名空间中的子进程与父进程之间正确通信?

我正在使用Popenfromsubprocess在网络命名空间中生成一个新进程。我需要在父进程和新生成的子进程之间交换数据。

目前,我通过简单地解析 from 来做到这一点stdout,这意味着在我的子进程中,我只需打印我需要传输到父进程的所有内容,然后从父进程解析它。虽然这种方法有效,但它看起来非常h​​acky,而且不支持双向数据交换(子 -> 父和父 -> 子)。

我认为创建一个套接字来在两个进程之间进行通信在我的情况下不起作用,因为父进程位于不同的网络命名空间中。

如何在两个独立的网络命名空间之间实现 IPC?

0 投票
1 回答
1763 浏览

kvm - kvm/libvirt 和 linux-namespaces 的问题

我的 Ubuntu 16.04 LTS 上的 kvm/libvirt 虚拟化和网络命名空间存在问题。我想要做的是以下围栏设置:

  • 一个网络命名空间(栅栏)
  • 命名空间中的两个 Linux 网桥。
  • 每个网桥都有自己的 ip 网络。
  • 允许在这两个网桥之间进行 ip 转发。
  • 两个虚拟机。VM1 连接到bridge1,VM2 连接到bridge2。
  • ping VM1 到 VM2。

目的是在我的笔记本电脑上建立一个小实验室,它完全独立于主机剩余的与外界通信的网络设置,在我看来,网络命名空间是实现这一目标的方法,但我遇到了一些障碍。

到目前为止,我已经设置了以下内容:

ping 命名空间内的 ip 是成功的。IP 转发已启用。在命名空间之外,桥不可见/不存在。现在是时候让 libvirt 中的桥梁为人所知了。但它不起作用。我用这个xml试过了

以及适当的 virsh net-define 和 net-start 命令。我编辑了一个 VM 的 xml 文件并启动了 VM,但结果是这样的:

显然,libvirt 在命名空间 internalSpielwiese 中没有找到 iBr0,经过一番谷歌搜索后,我觉得 libvirt 无法处理网络命名空间。或者有什么办法吗?如何?

0 投票
1 回答
969 浏览

bpf - eBPF:在 Linux 命名空间中运行

所以BPF程序是内核实体,因为它们在内核空间中运行。另一方面,Linux 命名空间又名容器,提供应用程序级别的隔离,在这种情况下,它们都共享主机的内核、内核模块等。

所以我想每个容器加载一个程序是没有意义的bpf,因为它也会在主机上变得可见?

因此,我猜想bpf程序会加载到主机和监视器/mangle/等上。进出命名空间的数据包。鉴于struct sock有关于命名空间 id 的信息,我认为只有某些类型的bpf程序才能做到这一点?