xianlubird / mydocker

<<自己动手写docker>> 源码
Apache License 2.0
1.97k stars 555 forks source link

User Namespace 报错 #55

Open srstack opened 5 years ago

srstack commented 5 years ago

fork/exec /usr/bin/sh: no such file or directory

环境

Linux vm_16_14_centos 3.10.0-862.3.2.el7.x86_64 #1 SMP Mon May 21 23:36:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

srstack commented 5 years ago

已经参考相关资料:

        UidMappings: []syscall.SysProcIDMap{
            {
                ContainerID: uid,
                HostID:      0,
                Size:        1,
            },
        },
        GidMappings: []syscall.SysProcIDMap{
            {
                ContainerID: gid,
                HostID:      0,
                Size:        1,
            },
        },
dadahua555 commented 5 years ago

环境 Linux zhang 5.0.0-29-generic #31~18.04.1-Ubuntu SMP Thu Sep 12 18:29:21 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

错误 2019/09/25 11:11:38 fork/exec /bin/sh: no such file or directory 请问如何解决?

xueliang123 commented 4 years ago

同问 Linux 4.14.81.bm.15-amd64 #1 SMP Debian 4.14.81.bm.15 Sun Sep 8 05:02:31 UTC 2019 x86_64 GNU/Linux 书中示例已经失效 换成 UidMappings: []syscall.SysProcIDMap{ { ContainerID: uid, HostID: 0, Size: 1, }, }, GidMappings: []syscall.SysProcIDMap{ { ContainerID: gid, HostID: 0, Size: 1, }, }, 后报错fork/exec /bin/sh: no such file or directory

JasonkayZK commented 3 years ago

我是在Ubuntu 20.04环境:

root@jasonkayPC:/home/jasonkay/workspace/my_docker# uname -a
Linux jasonkayPC 5.4.0-58-generic #64-Ubuntu SMP Wed Dec 9 08:16:25 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

下面的代码是没问题的:

package main

import (
    "log"
    "os"
    "os/exec"
    "syscall"
)

func main() {
    cmd := exec.Command("sh")
    cmd.SysProcAttr = &syscall.SysProcAttr{
        Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWIPC |
            syscall.CLONE_NEWPID | syscall.CLONE_NEWNS | syscall.CLONE_NEWUSER,
        /*
            以下两种情况,会导致UidMappings/GidMappings中设置了非当前进程所属UID和GID的相关数值:
            1. HostID非本进程所有(与Getuid()和Getgid()不等)
            2. Size大于1 (则肯定包含非当前进程的UID和GID)
            则需要Host机使用Root权限才能正常执行此段代码。

            Issue #3 error about User Namespace:

                https://github.com/xianlubird/mydocker/issues/3
        */
        UidMappings: []syscall.SysProcIDMap{
            {
                ContainerID: 1,
                HostID:      syscall.Getuid(),
                Size:        1,
            },
        },
        GidMappings: []syscall.SysProcIDMap{
            {
                ContainerID: 1,
                HostID:      syscall.Getgid(),
                Size:        1,
            },
        },
    }

    cmd.Stdin = os.Stdin
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr

    if err := cmd.Run(); err != nil {
        log.Fatal(err)
    }

    os.Exit(-1)
}

代码来自于#3 error about User Namespace

zzsoszz commented 2 years ago

root@container:/home/ubuntu/projects/go_learning/go_namespace2# uname -a Linux container 4.15.0-142-generic #146-Ubuntu SMP Tue Apr 13 01:11:19 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

同样的错误: root@container:/home/ubuntu/projects/go_learning/go_namespace2# go run main3.go 2022/09/20 00:02:18 fork/exec /bin/sh: no such file or directory exit status 1