【问题标题】:Containers and syscall.CLONE_NEWNS容器和系统调用.CLONE_NEWNS
【发布时间】:2017-11-29 13:40:48
【问题描述】:

我在这个 repo https://github.com/lizrice/containers-from-scratch/blob/master/main.go 上运行 golang 代码,我遇到了挂载命名空间的问题。代码应该做的是在自己的挂载命名空间中创建一个进程。因此,如果我使用sudo go run main.go run /bin/bash 运行代码并在mytemp 目录中创建一个文件,我应该能够从新启动的进程中看到该文件,但是如果我尝试查看该文件移动到rootfs 目录在主机上,由于挂载命名空间,我应该看不到该文件。 不幸的是我仍然看到这个文件,所以我运行的进程似乎没有挂载命名空间。 为了运行代码,我使用了这个https://github.com/ericchiang/containers-from-scratch/releases/download/v0.1.0/rootfs.tar.gz 作为rootfs 并将它移动到/home/me 下。然后我创建了一个mytemp 目录用作tmpfs 挂载目标。 您对进程没有挂载命名空间的原因有任何想法吗?

谢谢!

【问题讨论】:

    标签: go containers mount linux-namespaces


    【解决方案1】:

    这个问题可以通过将主机挂载配置为私有的来解决,不接收或转发任何传播事件到其他挂载,参见RedHat - Sharing Mounts

    这个命令应该在你创建容器之前在你的主机上执行:

    $ mount --make-rprivate /
    

    【讨论】:

    • 使用MS_PRIVATE|MS_REC 标志调用mount 系统调用。这也可以in Go 完成。
    • 没错@ephemient,这里有一个例子:syscall.Mount("", "/", "", syscall.MS_PRIVATE|syscall.MS_REC, "")
    猜你喜欢
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 2010-12-18
    相关资源
    最近更新 更多