问题标签 [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.
linux - Linux网络命名空间:杀死容器后进程仍然存在
我将网络命名空间创建为ip netns add myns
,然后在容器内启动一个进程作为 daemon ip netns exec myns process -D
。但是,在我使用 删除命名空间后ip netns del myns
,该进程仍保留在主机上。
是预期的吗?在删除 Linux 容器时清理进程的正确方法是什么?
谢谢。
docker - 如何使用用户命名空间在 Docker 容器中切换用户
我正在运行 dockerd 19.03.1,构建 74b1e89,并在专用 ID 范围上启用了用户命名空间
我需要将容器从 root 切换到专用用户,我将其创建为
但是,我无法在容器上下文中切换到用户。su以及gosu的替换失败类似于
根据有关用户命名空间映射的文档,这可能是一个警告,并且会影响所有依赖setuid或/和su检查实际二进制所有者的二进制文件。
是否可以在容器上下文中的另一个用户下的 Docker 容器中运行命令/二进制文件,并为 dockerd 启用用户命名空间?
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 和命名空间的新手。也许我误解了什么。我应该如何解决这个错误?非常感谢!
centos - 为什么 Podman 使用不同的 UID 报告“命名空间中可用的 ID 不足”?
事实:
- 无根 podman 非常适合 uid
1480
- 无根 podman 无法获取 uid
2088
- CentOS 7
- 核心
3.10.0-1062.1.2.el7.x86_64
- 播客版
1.4.4
- 两者之间几乎整个环境都被移除了
- 的文件系统
/tmp
是xfs
- 两个用户的
capsh
输出是相同的,但对于 uid / username - 两个 UID 在
/etc/sub{u,g}id
文件中具有相同的条目 - 这
$HOME/.config/containers/storage.conf
是默认值,除了 uid 之外,两者之间是相同的。以下storage.conf
供参考。
我编写了以下 shell 脚本来演示两者的运行环境有多相似:
这是脚本的输出:
这是storage.conf
uid的1480
。它是相同的,除了s/1480/2088/
:
podman info
您可以看到用户的两个输出之间基本上没有区别:
我拒绝相信if (2088 == uid) { abort(); }
podman 的源代码中存在或类似的废话。我错过了什么?
linux - 如何在 go 中正确实现挂载命名空间
我有以下代码mnt.go
我想运行上面的代码来生成一个 bash shell,然后运行以下命令:
现在,当我启动另一个 shell 并运行命令时
我应该看不到文件1.txt
,2.txt
并且3.txt
. 由于临时文件系统已挂载在挂载命名空间内,因此不应从外部看到它。
但这对我来说不是这样。为什么syscall.CLONE_NEWNS
没有按预期工作?我应该怎么做?
其中一条评论提到这段代码对他们来说很好。FWIW,我正在运行一个安装了 golang 并且没有其他自定义的“bento/centos-7”Vagrant 盒子。
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) 的示例部分似乎表明有效和允许的功能集将被完全启用,而继承的功能则全部被丢弃。但是,没有明确的迹象表明这是实际实施的行为。此外,没有迹象表明环境上限是否受到影响;我假设边界帽不受影响,尤其是因为边界帽上只有帽下降是可能的。
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 命名空间的信息。因此,一个开始的路径是创建一个命名空间,从而隔离主机文件系统。我试过这个来创建一个命名空间文件系统:
然后进入命名空间:
在此之后,可以安装新的软件包。但它仍然会覆盖现有的库。在隔离的命名空间中可以采取哪些进一步的步骤来解决这个问题?
还有哪些更清洁的解决方案?
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 会产生巨大的内存开销,尤其是对于小型容器。
链接集合:
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 子系统有何不同?与默认命名空间与多个命名空间有关吗?
docker - 如何使用用户命名空间配置启动容器?
在下面的 docker 文件中,base image( )在容器中jenkins/jenkins
为用户jenkins
提供 UID1000
和 GID 。1000
在 docker 主机(EC2 实例)上,我们也创建了类似的 UID 和 GID,
确保容器可以将文件写入/abc/home_folder_for_jenkins
EC2 实例。
在同一个 EC2 实例中我们需要注意的另一个方面是运行容器(除了上述容器)以在非特权模式下运行。
因此,在 docker 主机(EC2)上执行以下配置:
这个 dockerremap 配置不允许 jenkins 启动并且 docker 容器进入Exited
状态:
删除 docker remap 配置后,一切正常。
为什么dockerremap配置不允许jenkins容器以jenkins
用户身份运行?