$ unshare -r
# ulimit -u 1000
# sh -c 'for i in $(seq 998); do sleep 1& done' >/dev/null
sh: fork: retry: Resource temporarily unavailable
sh: fork: retry: Resource temporarily unavailable
... (i.e. more than one error - so I guess my existing processes were already counted)
sh: fork: retry: Resource temporarily unavailable
-bash: fork: retry: Resource temporarily unavailable
相似地:
$ unshare -r
# ulimit -u 1002
# sh -c 'for i in $(seq 100); do sleep 1& done' >/dev/null
# sleep 2
# for i in $(seq 10); do unshare -r sh -c 'for i in $(seq 100); do sleep 1& done' >/dev/null; done
sh: fork: retry: Resource temporarily unavailable
sh: fork: retry: Resource temporarily unavailable
有一个一般原则,拥有命名空间不会给你任何额外的特权。对于具有多个名称空间的系统的其余部分,您无法对单个名称空间执行任何操作。命名空间为您提供了对某些进程应用额外限制的额外能力。
RLIMIT_NPROC
是您可以创建的最大进程数。如果其中一些进程在命名空间中,它们可能拥有较少的权限,但它们仍然算作一个进程。无论如何,所有这些进程都是外部命名空间中的进程。它们在命名空间内可能有不同的 UID ,但在命名空间之外,它们是您的进程。似乎并非如此。
相似地:
ulimit -u 1000
在内部运行unshare -r
不会影响我在用户命名空间之外的用户。啊 - 这是因为ulimit -u
总是在过程中设置一个限制。但是当在 fork() 中检查限制时,我们将该进程的 RLIMIT_NPROC 与“真实”UID 的进程总数进行比较,即从“根”命名空间的角度来看。据我所知,这一切都很好。
顺便说一句,如果您没有特权,我注意到您不能使用用户命名空间来创建具有多个不同 UID 的进程。
这方面的规则由 Michael Kerrisk 在Namespaces in operation, part 5: User namespaces中解释。