我正在尝试使用Linux命名空间创建沙盒环境.我在https://github.com/swetland/mkbox上找到了一个很好的例子,大致可以做我想要的,但我希望在沙盒中出现一个可靠的/ proc.我怎样才能做到这一点?
我尝试将proc FS挂载到"proc"上,但是在EINVAL中失败了.当我尝试正常安装"proc"时,它会产生EPERM.
想法?
我正在研究一些内核代码并试图理解数据结构是如何链接在一起的.我知道调度程序如何工作的基本思路,以及PID是什么.但我不知道命名空间在这个上下文中是什么,并且无法弄清楚所有这些是如何协同工作的.
我已经阅读了一些解释(包括O'Reilly"理解Linux内核"的部分内容)并理解可能是同一个PID到达两个进程,因为一个已终止并且ID被重新分配.但我无法弄清楚这一切是如何完成的.
所以:
task_struct和之间有什么关系pid_namespace?(我已经认为它与它有关pid_t,但不知道如何)一些参考:
pid_namespacetask_structupid(也见pid下面)大家好,我是偶尔的 linux 用户,但我有一个项目要做,我需要一些桥接方面的帮助:)
我尝试过使用 google,但没有解决问题。
我的任务是创建网络命名空间,因此它可以用来执行其他一些任务。
Debian 8.2 在 Windows 7 上的 VMWare 虚拟机中使用。我也在 Raspberry Pi 2 上尝试过同样的事情,但出现了同样的问题。
首先,我按照教程https://lwn.net/Articles/580893/创建了一对虚拟以太网接口。所以现在我在全局命名空间中有 veth0,ip 地址为 10.1.1.2/24,在 netns1 命名空间中有 veth1,ip 地址为 10.1.1.1/24。
接下来,我按照教程http://www.linuxfoundation.org/collaborate/workgroups/networking/bridge来桥接 eth0 和 veth0,这样我就可以从 netns1 命名空间访问互联网。
首先,我删除了 eth0 和 veth0 接口的 IP 地址,并将它们设置为 DOWN 状态。
新网桥被创建 (br0) 并且两个接口(eth0 和 veth0)都被添加到其中。
然后两个接口都设置为UP状态,我运行“dhclient br0”将ip地址分配给br0。
从全局命名空间现在可以运行“ping google.com”,但是从 netns1 命名空间我得到错误“网络无法访问”。(我想路由有问题,我尝试向 netns1 命名空间添加一些默认路由,但没有运气。我的网络知识有限,所以我寻求帮助。)
$ ip地址显示
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host …Run Code Online (Sandbox Code Playgroud) 问题:
我试图以这样的方式将目录挂载为 Docker 卷,以便在容器内创建的用户可以写入该卷中的文件。同时,该文件至少应该对我的用户lape在容器外可读。
本质上,我需要将容器用户命名空间中的用户 UID 重新映射到主机用户命名空间上的特定 UID。
我怎样才能做到这一点?
我更喜欢以下答案:
设置:
这就是可以复制这种情况的方式。
我有我的 Linux 用户lape,分配到docker组,所以我可以运行 Docker 容器,而无需成为 root。
lape@localhost ~ $ id
uid=1000(lape) gid=1000(lape) groups=1000(lape),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),121(lpadmin),131(sambashare),999(docker)
Run Code Online (Sandbox Code Playgroud)
Dockerfile:
FROM alpine
RUN apk add --update su-exec && rm -rf /var/cache/apk/*
# I create a user inside the image which i want to be mapped to my `lape`
RUN adduser -D -u 800 -g 801 insider
VOLUME /data
COPY ./entrypoint.sh …Run Code Online (Sandbox Code Playgroud) 要对程序的开发版本运行测试,我需要将其与网络隔离。不过,构建仍然需要访问loopback(127.0.0.1)。
我尝试使用unshare -c -n <program>但环回接口默认情况下处于关闭状态。usingunshare -r -n bash允许我通过 using 启用接口,但随后ip link set lo up需要在该shell 中手动调用该程序。 bash
我尝试创建一个持久的网络命名空间(ip netns add vnet1),但这只适用于sudo我需要避免的情况。
因此可以使用lodown 创建一个非共享的网络命名空间,而不使用 sudo.
我需要lo在启动构建之前启动界面。理想情况下,我会将设置集成到 bash 脚本中,而不使用权限升级。我读到 Fedora 默认提供了一个启用的环回接口,所以我可以用sysctl等等来调整这个行为吗?(我在 archlinux 上)
我正在尝试实现以下场景:
clone()带CLONE_NEWNS标志的主进程(这意味着新的挂载命名空间)mount() 子进程中的新文件系统但它并没有像我预期的那样工作,我仍然在主进程中看到挂载的文件系统。我究竟做错了什么?
来源在这里https://github.com/dmitrievanthony/sprat/blob/master/src/container.c#L47
系统默认为 AWS Ubuntu,
ubuntu@ip-172-31-31-112:~/sprat$ uname -a
Linux ip-172-31-31-112 4.4.0-53-generic #74-Ubuntu SMP Fri Dec 2 15:59:10 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud) 我正在尝试通过使用unshareand newuidmap命令来更好地理解用户名称空间。
这些是我运行的命令:
[root@host ~]$ ls -l /usr/bin/newuidmap
-rwsr-xr-x 1 root root 32944 May 16 19:37 /usr/bin/newuidmap
[root@host ~]$ unshare -U bash namespace
[nobody@host ~]$ echo $$
7134
[nobody@host ~]$ newuidmap 7134 65534 5000 1
newuidmap: write to uid_map failed: Operation not permitted
Run Code Online (Sandbox Code Playgroud)
/ etc / subuid:
nobody:5000:1
root:5000:1
Run Code Online (Sandbox Code Playgroud)
知道为什么这失败了吗?
然后,我尝试newuidmap在父命名空间的同一PID上运行命令,它似乎可以正常工作:
[root@host ~]$ newuidmap 7134 65534 5000 1
[root@host ~]$ cat /proc/7134/uid_map
65534 5000 1
Run Code Online (Sandbox Code Playgroud)
但是,当我从新名称空间中运行进程时,它似乎仍以root身份而不是UID 5000身份运行:
[nobody@host ~]$ exec sleep 20
Run Code Online (Sandbox Code Playgroud)
从另一个shell:
[root@host ~]$ …Run Code Online (Sandbox Code Playgroud) Kubernetes 命名空间究竟是什么,它与 linux 命名空间(mnt、pid、net、ipc、uts、user、cgroup)有何不同?
据我所知,我可以使用"clone"来创建进程和命名空间,但以这种方式创建的命名空间没有名称.例如,我使用参数:CLONE_NEWNS创建网络命名空间,但在命令"ip netns list"中,没有命名空间列表,因为创建的命名空间没有名称.但我可以使用命令"ip netns add xxx"来创建名为"xxx"的命名空间.
我想知道如何使用系统调用"clone"创建名称命名空间.
在玩弄user_namespaces(7)的示例时,我遇到了一种奇怪的行为。
应用程序user-ns-ex使用 CLONE_NEWUSER 调用clone(2),从而在新的用户命名空间中创建一个新进程。父进程将映射 ( 0 1000 1) 写入 /proc//uid_map 文件并告诉(通过管道)子进程可以继续。然后子进程执行bash。
我在这里复制了源代码。
如果我不设置任何功能或设置所有功能,应用程序将打开 /proc//uid_map 进行写入。
当我仅设置 set_capuid、set_capgid 和可选的 cap_sys_admin 时,对 open(2) 的调用失败:
设置上限:
arksnote linux-namespaces # setcap 'cap_setuid,cap_setgid,cap_sys_admin=epi' ./user-ns-ex
arksnote linux-namespaces # getcap ./user-ns-ex
./user-ns-ex = cap_setgid,cap_setuid,cap_sys_admin+eip
Run Code Online (Sandbox Code Playgroud)
尝试运行:
kamyshev@arksnote ~/workspace/personal/linux-kernel/linux-namespaces $ ./user-ns-ex -v -U -M '0 1000 1' bash
./user-ns-ex: PID of child created by clone() is 19666
ERROR: open /proc/19666/uid_map: Permission denied
About to exec bash
Run Code Online (Sandbox Code Playgroud)
无能力:
arksnote …Run Code Online (Sandbox Code Playgroud) 我正在学习 linux 核心,现在正在讨论命名空间主题。我尝试使用“unshare”命令只是为了掌握命名空间及其要点。问题是它没有,或者更有可能的是,我做错了什么。如果您能帮助我理解,我将不胜感激。我尝试在它自己的 PID 命名空间内执行 busybox sh 程序。我就是做这个的:
[ab@a ~]$ sudo unshare --pid busybox sh
/home/ab # ps
PID TTY TIME CMD
6014 pts/1 00:00:00 sudo
6016 pts/1 00:00:00 busybox
6026 pts/1 00:00:00 ps
Run Code Online (Sandbox Code Playgroud)
正如我从 ps 命令的输出中看到的那样,所有进程在新环境中都是可见的。当我检查新创建的进程和当前进程的 pid 命名空间 id 时,这一点得到了确认。见下文
[ab@a ~]$ ps -p 6016,$$
PID TTY TIME CMD
4604 pts/0 00:00:00 bash
6016 pts/1 00:00:00 busybox
[ab@a ~]$ sudo ls -l /proc/4604/ns
total 0
lrwxrwxrwx. 1 ab ab 0 Aug 8 23:49 ipc -> ipc:[4026531839]
lrwxrwxrwx. 1 ab …Run Code Online (Sandbox Code Playgroud) 我想在一个步骤中在网络命名空间中运行一系列连接的bash命令,但似乎ip netns exec mynetns只需要一个bash命令作为参数.例如:
ip netns exec mynetns ip a
Run Code Online (Sandbox Code Playgroud)
......按预期工作.
ip netns exec mynetns "ip a ; ip a"
Run Code Online (Sandbox Code Playgroud)
...回报exec of "ip a" failed: No such file or directory.
显然,
ip netns exec mynetns ip a ; ip a
Run Code Online (Sandbox Code Playgroud)
...将返回网络命名空间和主机上的接口.
有没有办法让它发挥作用?
该手册只谈论一个命令,这是不是一个非常好的迹象...
所以BPF程序是内核实体,因为它们在内核空间中运行。另一方面,Linux 命名空间又名容器,提供应用程序级别的隔离,在这种情况下,它们都共享主机的内核、内核模块等。
所以我想bpf每个容器加载一个程序是没有意义的,因为它也会在主机上可见?
因此,我猜测bpf程序会加载到主机和监视器/损坏/等上。进出命名空间的数据包。鉴于struct sock有关于命名空间 id 的信息,我认为只有某些类型的bpf程序才能做到这一点?
linux-namespaces ×13
linux ×8
ip ×2
namespaces ×2
networking ×2
bash ×1
bpf ×1
bridge ×1
c ×1
containers ×1
docker ×1
ebpf ×1
ethernet ×1
kubernetes ×1
linux-kernel ×1
mount ×1
procfs ×1
sandbox ×1
scheduler ×1
unshare ×1