Mount Namespace

Mount Namespace

  • Mount Namespace用来隔离各个进程看到的挂载点视图,在不同的Namespace进程中,看到的文件系统层次是不一样的,在Mount Namespace中调用mount()和umount()仅仅只会影响当前Namespace内的文件系统,而对全局的文件系统是没有影响的。
  • Mount Namespace比chroot(),更加灵活与安全,Mount Namespace是Linux第一个实现的Namespace类型,因此他的系统调用参数为NEWNS。
package main
import(
"os/exec"
"syscall"
"os"
"log"
)
func main(){

cmd:=exec.Command("sh")
cmd.SysProcAttr=&syscall.SysProcAttr{
Cloneflags:syscall.CLONE_NEWUTS|syscall.CLONE_NEWIPC| syscall.CLONE_NEWPID|syscall.CLONE_NEWNS,
}
cmd.Stdin=os.Stdin
cmd.Stdout=os.Stdout
cmd.Stderr=os.Stderr
if err:=cmd.Run();err!=nil{
log.Fatal(err)
}
}


  • 运行代码查看/proc的文件内容,proc是一个系统文件,提供额外的机制,可以通过内核和内核模块将信息发送给进程。

  • 首先运行代码,然后查看/proc

  • 此时/proc还是宿主机的,现在将/proc mount到自己的Namespace中。

mount -t proc proc /proc
  • 可以如下图所示看到少了很多文件

  • 使用ps -ef查看进程

  • 可以看到,在当前Namespace中sh进程是PID为1的进程,这就说明当前的Mount Namespace中mount和外部空间是隔离的,mount操作并没有影响到外部,Docker中volume也是利用了这个特性。

posted @ 2022-08-07 19:15  一生热爱  阅读(262)  评论(0编辑  收藏  举报