container调度与创建
选自:K8s、CRI与container - packy的文章 - 知乎
https://zhuanlan.zhihu.com/p/102897620
Cgroup创建:
cgexec -g cpu,memory:$UUID \
> unshare -uinpUrf --mount-proc \
> sh -c "/bin/hostname $UUID && chroot $ROOTFS /bin/sh"
/ echo "Hello from in a container"
解释一下选项 -uinpUrf
在给定的命令 unshare -uinpUrf --mount-proc
中,选项 -uinpUrf
用于指定要创建的不同类型的命名空间。以下是每个选项的含义:
-
-u
:创建一个新的用户命名空间(User Namespace),允许在其中映射用户 ID 和用户组 ID。这样可以在命名空间中隔离用户的身份标识,提供更好的安全性。 -
-i
:创建一个新的 PID 命名空间(PID Namespace),允许在其中隔离进程 ID。这样可以使得在不同命名空间中的进程看到不同的进程 ID,实现进程隔离。 -
-n
:创建一个新的网络命名空间(Network Namespace),允许在其中隔离网络资源,包括网络接口、IP 地址、路由表等。这样不同的命名空间中的网络可以相互隔离,实现网络隔离。 -
-p
:创建一个新的 IPC 命名空间(Inter-Process Communication Namespace),允许在其中隔离进程间通信的资源,如消息队列、共享内存和信号量。这样不同命名空间的进程间通信无法相互影响,实现通信隔离。 -
-U
:创建一个新的 UTS 命名空间(UTS Namespace),允许在其中隔离主机名和域名信息。这样在不同的 UTS 命名空间中可以设置不同的主机名,实现主机隔离。 -
-r
:创建一个新的挂载命名空间(Mount Namespace),允许在其中隔离文件系统挂载点,提供了独立的文件系统视图。这样不同挂载命名空间中的文件系统挂载情况相互隔离,实现文件系统隔离。
综合这些选项的作用,通过指定 -uinpUrf
选项,unshare
命令会创建一个新的用户命名空间、PID 命名空间、网络命名空间、IPC 命名空间、UTS 命名空间和挂载命名空间,实现了多个方面的隔离,使得在新的命名空间中的进程能够有更好的隔离性。