首先使用man查看unshare帮助:
run program with some namespaces unshared from parent
看下这几个参数的功能。
–fork:
执行unshare的进程fork一个新的子进程,在子进程里执行unshare传入的参数
–pid:
不从父进程继承pid命名空间。也就是说,在子进程内执行ps,无法看到父进程原有的进程。
–mount-proc: 这个先不解释。
执行命令:
sudo unshare --fork --pid --mount-proc bash
注意到share提示符从vagrant变成了root。
此时在生成的子进程里,whoami返回root。
从父进程的命令ps -ejf不能看出这个父子进程关系:
因为子进程已经隔离了pid namespace,所以子进程的ps 无法看到父进程里能看到的那些进程列表。
最后来看–mount-proc:
这个选项能确保创建了 PID 和 Mount namespace 后,自动挂载 /proc 文件系统,无需我们手动执行 mount -t proc proc /proc 命令。
父进程10945对应的/proc/10945:
子进程的/proc文件夹下面,看不到父进程pid对应的文件夹:
这个unshare也是Linux容器工作的基础之一。