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

linux - Linux网络命名空间:杀死容器后进程仍然存在

我将网络命名空间创建为ip netns add myns,然后在容器内启动一个进程作为 daemon ip netns exec myns process -D。但是,在我使用 删除命名空间后ip netns del myns,该进程仍保留在主机上。

是预期的吗?在删除 Linux 容器时清理进程的正确方法是什么?

谢谢。

0 投票
1 回答
511 浏览

docker - 如何使用用户命名空间在 Docker 容器中切换用户

我正在运行 dockerd 19.03.1,构建 74b1e89,并在专用 ID 范围上启用了用户命名空间

我需要将容器从 root 切换到专用用户,我将其创建为

但是,我无法在容器上下文中切换到用户。su以及gosu的替换失败类似于

根据有关用户命名空间映射的文档,这可能是一个警告,并且会影响所有依赖setuid或/和su检查实际二进制所有者的二进制文件。

是否可以在容器上下文中的另一个用户下的 Docker 容器中运行命令/二进制文件,并为 dockerd 启用用户命名空间?

0 投票
1 回答
1174 浏览

linux - 新用户命名空间中带有凭据的 exec.Command 出现错误:“不允许操作”

我想使用 Linux 命名空间和 Go 来执行命令来实现一个简单的沙箱。为了防止命令写入磁盘,命令以另一个用户的身份使用Credential: &syscall.Credential{Uid: uint32(1), Gid: uint32(1)}.

但是,我收到了这个错误:“fork/exec /Main: operation not allowed”。

即使我将代码更改为Credential: &syscall.Credential{Uid: uint32(0), Gid: uint32(0)},也会发生相同的错误。

container.go 如下:

当我运行sudo ./container -command='/Main' -username='nobody'时,出现错误“fork/exec /Main: operation not allowed”。

的用户命名空间中的用户justiceInit应该是root,但不能设置uid和gid using Credential

我是 linux 和命名空间的新手。也许我误解了什么。我应该如何解决这个错误?非常感谢!

0 投票
3 回答
10545 浏览

centos - 为什么 Podman 使用不同的 UID 报告“命名空间中可用的 ID 不足”?

事实:

  1. 无根 podman 非常适合 uid1480
  2. 无根 podman 无法获取 uid2088
  3. CentOS 7
  4. 核心3.10.0-1062.1.2.el7.x86_64
  5. 播客版1.4.4
  6. 两者之间几乎整个环境都被移除了
  7. 的文件系统/tmpxfs
  8. 两个用户的capsh输出是相同的,但对于 uid / username
  9. 两个 UID 在/etc/sub{u,g}id文件中具有相同的条目
  10. $HOME/.config/containers/storage.conf是默认值,除了 uid 之外,两者之间是相同的。以下storage.conf供参考。

我编写了以下 shell 脚本来演示两者的运行环境有多相似:

这是脚本的输出:

这是storage.confuid的1480。它是相同的,除了s/1480/2088/

podman info您可以看到用户的两个输出之间基本上没有区别:

我拒绝相信if (2088 == uid) { abort(); }podman 的源代码中存在或类似的废话。我错过了什么?

0 投票
1 回答
258 浏览

linux - 如何在 go 中正确实现挂载命名空间

我有以下代码mnt.go

我想运行上面的代码来生成一个 bash shell,然后运行以下命令:

现在,当我启动另一个 shell 并运行命令时

我应该看不到文件1.txt2.txt并且3.txt. 由于临时文件系统已挂载在挂载命名空间内,因此不应从外部看到它。

但这对我来说不是这样。为什么syscall.CLONE_NEWNS没有按预期工作?我应该怎么做?

其中一条评论提到这段代码对他们来说很好。FWIW,我正在运行一个安装了 golang 并且没有其他自定义的“bento/centos-7”Vagrant 盒子。

0 投票
1 回答
238 浏览

linux-capabilities - 在 clone(2)、unshare(2) 和 setns(2) 期间将更改哪些进程/线程功能集?

user_namespaces(7)的手册页说:

由 clone(2) 创建的带有 CLONE_NEWUSER 标志的子进程以新用户命名空间中的一组完整功能开始。同样,使用 unshare(2) 创建新用户命名空间或使用 setns(2) 加入现有用户命名空间的进程在该命名空间中获得了完整的功能集。

不幸的是,手册页没有说明哪些功能集(或多个集)会受到影响:一个或多个有效上限集、允许的上限集、可继承的上限集等。所以我的问题是:哪些功能集会会受到 clone(2)、unshare(2) 和 setns(2) 的影响吗?

注意:user_namespaces(7) 的示例部分似乎表明有效和允许的功能集将被完全启用,而继承的功能则全部被丢弃。但是,没有明确的迹象表明这是实际实施的行为。此外,没有迹象表明环境上限是否受到影响;我假设边界帽不受影响,尤其是因为边界帽上只有帽下降是可能的。

0 投票
1 回答
325 浏览

bash - 如何运行为不同的基础库版本构建的程序?

busybox 系统在 glibc-2.24 上带有 rpm 命令。Fedora Core (FC) 和/或更高版本的程序如何在这个系统上运行?

我发现 FC25 带有相同的 glibc 版本。如果我下载 FC25 rpm 软件包并安装它们,有时它们会运行。其他一些会失败。我也想运行 FC30 或其他版本。

问题在于 FC 包会覆盖同一目录中的现有库。我已经想出运行一个bash,你只需要安装bash, glibc, glibc-common, ncurses-base, ncurses-libs, libgcc. 安装这些软件包后,Bash 将运行。由于这些是少数库,因此使用 FC 版本安装它们应该会带来不影响 bash 的细微差异。但是微小的差异可能会影响其他程序,或者安装更多的包可能会带来更多的差异,从而影响更多的程序。

如何解决?

我已经阅读了有关 linux 命名空间的信息。因此,一个开始的路径是创建一个命名空间,从而隔离主机文件系统。我试过这个来创建一个命名空间文件系统:

然后进入命名空间:

在此之后,可以安装新的软件包。但它仍然会覆盖现有的库。在隔离的命名空间中可以采取哪些进一步的步骤来解决这个问题?

还有哪些更清洁的解决方案?

0 投票
3 回答
3080 浏览

docker - docker 容器中的防病毒软件 - fanotify 在主机和容器之间工作吗?

我需要使用开源软件对 docker 容器内的文件实施防病毒访问扫描解决方案。Clamav On-Access工作正常,但有一些要求和限制:

  • 需要 CAP_SYS_ADMIN 能力才能在容器内工作
  • 需要按容器运行,而不是按主机运行
  • 每个正在运行的容器中的签名需要 850Mb 常驻内存,即使是很小的容器

这个限制 - “从主机观看时,fanotify 不适用于容器事件”,真的存在还是我只是错误配置了 ClamAV?我对 fanotify 如何与命名空间一起工作没有深入的了解,但对我来说它看起来像是内核限制。

更新:此限制是否有任何解决方法?添加/var/lib/docker/overlay2/container_id/merged是一种选择,因为动态容器性质clamd.conf需要在每个容器事件上更新。但即使添加了路径,ClamAV 也不会检测到容器中的恶意文件。

每个容器运行 ClamAV 会产生巨大的内存开销,尤其是对于小型容器。

链接集合:

0 投票
1 回答
489 浏览

linux - Linux 内核 - CPU 子系统(CGROUPS)与 CPU 调度程序有何不同?

这里的Linux 内核代码提供了CPU 调度器,它具有多种调度算法来调度进程(包括 docker 容器进程)。


控制组是一种内核结构,它允许限制一组进程对主机系统物理资源的访问和计算。

控制组最初于 2007 年在 Linux 内核中实现。

此版本 1 实现已被 Linux 内核 4.5 中的版本 2 实现所取代。版本 2 修复了与版本 1 实施相关的一些限制。

Linux 内核中的六个 CGROUP 子系统中的两个是cpu 子系统cpuset 子系统

cpu 子系统通过调度程序控制对系统 CPU 的访问

cpuset 子系统将属于 CGROUPS 的进程固定到特定的 CPU 内核或内存节点。


CPU 调度程序与( CGROUPS的) cpu 子系统有何不同?与默认命名空间多个命名空间有关吗?

0 投票
2 回答
907 浏览

docker - 如何使用用户命名空间配置启动容器?

在下面的 docker 文件中,base image( )在容器中jenkins/jenkins为用户jenkins提供 UID1000和 GID 。1000


在 docker 主机(EC2 实例)上,我们也创建了类似的 UID 和 GID,

确保容器可以将文件写入/abc/home_folder_for_jenkinsEC2 实例。


在同一个 EC2 实例中我们需要注意的另一个方面是运行容器(除了上述容器)以在非特权模式下运行。

因此,在 docker 主机(EC2)上执行以下配置:


这个 dockerremap 配置不允许 jenkins 启动并且 docker 容器进入Exited状态:

删除 docker remap 配置后,一切正常。


为什么dockerremap配置不允许jenkins容器以jenkins用户身份运行?