问题标签 [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.
docker - 是否可以在启动容器之前为其创建 netns?
我正在使用 docker/go-plugins-helpers 和 docker/libnetwork 为 Docker 开发一个网络插件。
我尝试创建一个 netns 并将其安装在 Join() 请求中收到的沙盒密钥路径中,但在返回请求后,Docker 不使用我的 netns,但它卸载了我的 netns,创建另一个并在 sandoboxkey 中重新安装它。
那么,是否可以在启动容器之前为其创建 netns?
c - 如何使用带有 CLONE_NEWUSER 标志的克隆系统调用来测试用户命名空间
使用 LXC测试来自Containerization 的示例以演示用户命名空间。
它应该打印新用户命名空间中子进程的输出和父进程的输出。
但是,它只显示父输出。
请帮助了解子进程不打印的原因。
代码
环境
参考
更新
根据 thejonny 的回答,它是启用用户命名空间。对于 RHEL/CentOS 7,在 CentOS 7.4 中启用用户命名空间是否安全以及如何操作?
默认情况下,新的 7.4 内核将用户命名空间的数量限制为 0。要解决此问题,请增加用户命名空间限制:
echo 15000 > /proc/sys/user/max_user_namespaces
python - Linux 强制数据包出口(并避免本地/内核流量)
我有一个 20 端口交换机连接到 20 个 NIC 的 PC(1 对 1),并希望通过流量加载它。当然,为所有 NIC 配置不同的 IP 并启动我的客户端/服务器 (Python3) 脚本(或 iperf3)只会生成本地流量,除非我强制流量通过 NIC。
我发现(here)两个主要的“技巧”来实现这一点:
a.) 使用网络命名空间:
[+] 通过将每个 NIC 隔离(类似于 VM/docker)到一个盒子中,它会完全按照我的意愿行事
[+] Python3 似乎支持 netns (Pyroute2)
[-] 不确定如何在 netns/python 线程中打开套接字(10 个线程 x 2(客户端/服务器))
b.) 使用虚拟 IP(iptable:S/D-NAT + pre/post-routing):
[+] 所有网卡都保留在根网络命名空间中(仍然可以通过 psutil 收集数据)并在全局级别进行配置
[+] Python TCP 线程脚本可以在没有特定库/支持 netns 的情况下运行
[-] 如果重新配置我的设置(IP、VLAN、...),必须相应地调整 IPTable 脚本。
我想知道我是否在这里忽略了另一种可能性和/或是否忽略了。)我(全部)弄错了(因为我找不到一个像样的示例,其中在不同 netns 上的单个 Python 脚本中打开了一个套接字。 ..)
c - 如何使用 C 程序进入网络命名空间并读取文件内容
在我的 Linux 机器上,我已经配置了网络命名空间。使用 shell 脚本或命令行或系统命令,我能够获取网络命名空间中存在的文件内容。
输出:
在 C 程序中,我可以使用system("ip netns exec test_namespace cat /var/test_namespace/route.conf")
命令来获取输出。但我不喜欢使用这个选项。
寻找替代方法,我不确定系统调用setns,如何使用它。有任何想法吗?
node.js - 在 netns 中运行的 Node-Red 和 node.js 版本出现问题
我需要在我创建的 netns 中运行 node-red 。我在这个命名空间中有一个专用的调制解调器接口,只有 node-red 才能访问。
我正在使用 Ubuntu 16.04 并安装 npm -> 然后为 node.js 安装 nvm 版本管理器以安装 8.11.3,然后安装 node-red 本身。
我只安装了 nvm 版本 8.11.3 并将其设置为默认值。我希望这是唯一在任何地方运行的版本。
当我从常规 shell 启动 node-red 时,它会以 node.js 版本 8.11.3 启动
当我在 netns 中启动 node-red 时,它也会使用 node.js 版本 8.11.3 启动 [我使用 -u /directory 选项运行与普通用户相同的流程]
问题: 当我从自动 shell 脚本启动 netns 中的 node-red 时,它会使用 node.js 版本 4.9.1 启动 [我使用 -u /directory 选项运行与普通用户相同的流程]
脚本中的启动行是:
ip netns exec sensor node-red -u /home/iotdemo/.node-red
“sensor”是 netns 名称,-u 选项指向与普通用户相同的流目录。
为什么它会以我什至没有安装的 node.js 版本启动,以及如何让它以所需的 v8.11.3 启动?
我怀疑它与 root 与用户(iotdemo)有关,但它似乎在命名空间中启动一个进程,您必须以 root 身份执行。
感谢您考虑这个问题。
python - How to "redirect" filesystem read/write calls without root and performance degradation?
I have non-root access to a server that is shared by many users. I first develop and run some code locally, and then I want to rsync my data to a temporary location on a remote server and run my code on a remote server without changing any file paths.
I want to transparently hijack filesystem reads and writes and redirect them to different folders, like, if I run
and then code tries to read from /home/a/a.txt
, it should get content of /home/remote-home/a/a.txt
, and same with writes.
I am particularly interested in doing this for a python process if that is necessary. I use a lot of third-party libraries that do file IO, so just mocking builtins.open
is not an option. That IO is pretty intensive (reading and writing gigabytes of data), so performance degradation that exceeds something like 200-300% is an issue.
Options that I am aware of are:
- redefining
read
,read64
,write
, etc. calls with aLD_PRELOAD
that would call real functions with different paths under the hood - same with
ptrace
unshare
and remount parts of the filesystem, but userspace namespacse are disabled in my particular case for whatever security reasons
First two options seem not very reliable (and ptrace
must be slow), unless there is some fairly stable piece of code that does exactly that so I could be sure that I did not make any obvious buffer overflow errors there. Containers like docker are not an options because they are not installed on the remote server. Unless, of course, there are some userspace containers that do not rely on linux namespaces under the hood.
UPD: not a full answer, but singularity manages to provide such functionality without giving everyone root privileges.
docker - Docker:将外部映射到内部用户(如何应用'--user',如何执行.bashrc)?
使用命令行运行 docker 映像,例如:
我可以在 docker 容器内作为主机上的当前用户处理我的数据。但是,在容器内询问“whoami”会给出 UID 未知的响应。
因此,shell 是在没有主目录的用户上执行的。如何为该用户完成一些初始化?有没有办法将外部用户的用户 ID 和组 ID 从内部映射到特定的用户名?这可以动态完成,以便它适用于通过'--user'标志指定的任何用户,如上所示?
我的第一种方法是在 Dockerfile 中使用“CMD”,例如
但是,这是行不通的。
docker - 当用户命名空间与 SELinux 一起使用时,Docker 运行会引发错误
我正在尝试让 Docker 用户名称空间与在 Centos 7.5 上启用的 SELinux 一起工作。但是,我每次都会收到此错误:
如果我打开 SELinux,这不会发生。
这是我的 /etc/docker/daemon.json:
uname -a 输出:
cat /proc/cmdline 输出:
任何帮助是极大的赞赏。谢谢。
c - 当我在新用户命名空间中运行“ping”时出现“不允许操作”
我创建了一个新进程和新用户命名空间,如下所示:
并ping
在新进程中运行,但出现错误:不允许操作。
这是我的代码:
结果如下:
这是我的环境:
那么,我应该如何解决这个问题呢?
谢谢。
posix - 来自不同用户命名空间的能力
我正在研究 linux 中的 posix 功能和命名空间,并受这些令人印象深刻的文章的启发编写了一些代码行,以更好地理解如何从不同的命名空间中看到这些功能。部分代码摘自文章的例子,不是我玩的...
我证明了从新命名空间中的子进程只能将父进程的外部命名空间中的有效用户 id 映射到新命名空间中的任何 uid,包括 root,但是如果您尝试从子进程映射不同的外部用户你得到错误。没关系。
我不明白为什么子进程的功能在从父进程打印时显示为全部启用。我本来希望在外部命名空间中看不到任何特权,我错了吗?显然二进制 testcap3 没有特权(文件上既没有设置 setuid/setgid 位也没有设置功能,并且有效用户不是管理员) 功能是如何存储的?数据结构如何与命名空间相关?