linux user namespace 和cgroup

user namespace

用户命名空间 提供了普通权限映射root权限的能力,但这个root权限只是在子命名空间中的虚构,需要配合其他的命名空间。本身不具有操作父命名空间真实root资源的能力。
linux user namespace 和cgroup_第1张图片
这里的source主要是文件系统资源,因为硬件资源应该是通过cgroup的机制限制的。
图中有点不准确,root映射的root的子user namespace是外部的普通进程。这里的普通是指uid为0但capabilities为空,可以读写很多root创建的文件。

正常用户都需要在user ns中映射自己的用户,不映射默认uid = 65534。映射之后存在文件资源访问限制的机制,如上图。user ns提供了上层构建内核系统的能力。

chr.c

#include 
 int main(){
char *argv[ ]={"ls", "-al", "/etc/passwd", NULL};
char *envp[ ]={"PATH=/bin", NULL};  
int ret = chroot("./newroot");
printf("error %d \n",ret);
chdir("/");
execve("/bin/ls", argv, envp);
}

gcc chr.c -o chr

lier@lier-virtual-machine:~/qemu$ sudo chroot newroot/ /bin/ls
a.out    bin      lib      linuxrc  ns.c     sbin     usr
lier@lier-virtual-machine:~/qemu$ sudo ./chr
error 0 
ls: /etc/passwd: No such file or directory
lier@lier-virtual-machine:~/qemu$ unshare --user -r /bin/bash
root@lier-virtual-machine:~/qemu# ./chr
error 0 
ls: /etc/passwd: No such file or directory
root@lier-virtual-machine:~/qemu# exit
exit
lier@lier-virtual-machine:~/qemu$ ./chr
error -1 
-rw-r--r-- 1 root root 2287 Nov 14 10:12 /etc/passwd
lier@lier-virtual-machine:~/qemu$ 

可以看到,成功的利用映射的root切换根目录。命令找不到参数,因为新的目录里缺少一个参数。

小结

user命名空间应该就是基于用户账户的权限隔离方式。同一个文件在不同的命名空间读到的内容可能不同,要么就干脆不能读。某用户启动的进程启父命名空间拥有子命名空间的所有权限。主要是针对子命名空间的root账户而言,因为父命名空间中的root账户创建的内容,本层的其他账户本身不可写。

子命名空间中能不能执行可执行文件,完全取决于可执行文件可执行属性其他组的标志是否允许。

cgroup

linux user namespace 和cgroup_第2张图片

cgroup 通过控制族群、层级的概念限制进程对资源的访问。

进程task_struct 和 cgroup存在多对多的概念,通过struct css_set结构联系。

每个cgroup存在susys子系统,用来描述被限制的资源。

cgroup文件系统

linux user namespace 和cgroup_第3张图片
cgroup文件系统提供用户态配置cgroup内核的能力,系统默认挂载在/sys/fs/cgroup文件加下,通过mkdir建立配置项。新建目录下自动生成配置文件,与内核数据结构关联。也可以手动挂载在其他目录,用法相同。

你可能感兴趣的:(linux,docker及容器技术,linux,运维,服务器)