zoukankan      html  css  js  c++  java
  • mount namespace

    root@ubuntu:/home/ubuntu/test/learning/namespaces/Mount_001# go run Mount_001.go run
    
    ERRO[0000] no such file or directory                    
    root@nshost:/# 
    root@nshost:/# exit
    exit
    ERRO[0003] no such file or directory                    
    root@ubuntu:/home/ubuntu/test/learning/namespaces/Mount_001# ls /root/docker/container/rootfs/
    bin  boot  client  dev  docker-entrypoint.d  docker-entrypoint.sh  etc  home  lib  media  mnt  opt  proc  root  run  sbin  server  srv  sys  tmp  unixsock  usr  var
    root@ubuntu:/home/ubuntu/test/learning/namespaces/Mount_001# mkdir -p /root/docker/container/rootfs/godir
    root@ubuntu:/home/ubuntu/test/learning/namespaces/Mount_001# go run Mount_001.go run
    ERRO[0000] no such file or directory                    
    root@nshost:/# exit
    exit
    ERRO[0005] no such file or directory                    
    root@ubuntu:/home/ubuntu/test/learning/namespaces/Mount_001# rm -rf /root/docker/container/rootfs/godir
    root@ubuntu:/home/ubuntu/test/learning/namespaces/Mount_001# mkdir -p /root/docker/container/rootfs/temp
    root@ubuntu:/home/ubuntu/test/learning/namespaces/Mount_001# go run Mount_001.go run
    root@nshost:/# 
    root@ubuntu:/home/ubuntu/test/learning/namespaces/Mount_001# go run Mount_001.go run
    root@nshost:/# ls
    bin  boot  client  dev  docker-entrypoint.d  docker-entrypoint.sh  etc  home  lib  media  mnt  opt  proc  root  run  sbin  server  srv  sys  temp  tmp  unixsock  usr  var
    root@nshost:/# ls temp/
    root@nshost:/# mount
    /dev/sdc3 on /unixsock type ext4 (rw,relatime,errors=remount-ro,stripe=64)
    proc on /proc type proc (rw,relatime)
    godir on /temp type tmpfs (rw,relatime)
    root@nshost:/# 

     host上

     这是因为现在还没有添加挂载点的隔离。

    容器退出

    host上也没有了

    package main
    
    import (
            "os"
            "os/exec"
            "syscall"
    
            "github.com/sirupsen/logrus"
    )
    
    func check(err error) {
            if err != nil {
                    logrus.Errorln(err)
            }
    }
    
    func run() {
            logrus.Info("Setting up...")
            cmd := exec.Command("/proc/self/exe", append([]string{"child"}, os.Args[2:]...)...)
            cmd.Stdin = os.Stdin
            cmd.Stdout = os.Stdout
            cmd.Stderr = os.Stderr
            cmd.SysProcAttr = &syscall.SysProcAttr{
                    Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS,
            }
            check(cmd.Run())
    }
    
    func child() {
            logrus.Infof("Running %v", os.Args[2:])
            cmd := exec.Command(os.Args[2], os.Args[3:]...)
            cmd.Stdin = os.Stdin
            cmd.Stdout = os.Stdout
            cmd.Stderr = os.Stderr
            check(syscall.Sethostname([]byte("newhost")))
            // "/root/go/src/PID_001/busybox" busybox解压的目录
            check(syscall.Chroot("/root/docker/container/rootfs/"))
            check(os.Chdir("/"))
            // func Mount(source string, target string, fstype string, flags uintptr, data string) (err error)
            // 前三个参数分别是文件系统的名字,挂载到的^H路径,文件系统的类型
            check(syscall.Mount("proc", "proc", "proc", 0, ""))
            // 这里godir是挂载文件系统的名称,可以修改特殊一些,以方便区分
            check(syscall.Mount("godir", "temp", "tmpfs", 0, ""))
            check(cmd.Run())
            // 卸载
            check(syscall.Unmount("proc", 0))
            check(syscall.Unmount("godir", 0))
    }
    
    func main() {
            if len(os.Args) < 2 {
                    logrus.Errorf("missing commands")
                    return
            }
            switch os.Args[1] {
            case "run":
                    run()
            case "child":
                    child()
            default:
                    logrus.Errorf("wrong command")
                    return
            }
    }

  • 相关阅读:
    JAVA中获取当前系统时间
    关于JAVA中URL传递中文参数,取值是乱码的解决办法
    javaweb学习总结——Filter高级开发
    java项目(java project)如何导入jar包的解决方案列表
    使用过滤器(Filter)解决请求参数中文乱码问题(复杂方式)
    关于配置Tomcat的URIEncoding
    web.xml中load-on-startup的作用
    最详细的Log4j使用教程
    使用MyEclipse开发第一个Web程序
    java.net.BindException: Address already in use: JVM_Bind
  • 原文地址:https://www.cnblogs.com/dream397/p/14031215.html
Copyright © 2011-2022 走看看