Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 设置cgroup_Linux_Go_System Calls - Fatal编程技术网

Linux 设置cgroup

Linux 设置cgroup,linux,go,system-calls,Linux,Go,System Calls,我有一些go代码,它创建了一个基本的根系统,然后在每个linux名称空间下插入它,设置cgroup,然后在cgroup/chroot中运行一个进程 我已经让它的大部分工作,但我有困难让cgroup工作 我在cgroup的大部分工作中都在关注,作为一个概念,我对cgroup还是非常陌生的 如果我手动创建这个环境并运行以下命令,一切都会正常工作。 (我已为这些添加了数字,以供以后参考) 从cat/proc/mounts的输出可以看出 proc /proc proc rw,relatime 0 0 s

我有一些go代码,它创建了一个基本的根系统,然后在每个linux名称空间下插入它,设置cgroup,然后在cgroup/chroot中运行一个进程

我已经让它的大部分工作,但我有困难让cgroup工作

我在cgroup的大部分工作中都在关注,作为一个概念,我对cgroup还是非常陌生的

如果我手动创建这个环境并运行以下命令,一切都会正常工作。 (我已为这些添加了数字,以供以后参考)

从cat/proc/mounts的输出可以看出

proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
cgroup_root /sys/fs/cgroup tmpfs rw,relatime 0 0
pids /sys/fs/cgroup/pids cgroup rw,relatime,pids 0 0
我有一个挂载的
/proc、/sys、/sys/fs/cgroup
,还有一个位于
/sys/fs/cgroup/pids
的pids cgroup。我现在可以用我想要的任何设置设置这个pids cgroup,一切正常

我的问题是我试图在围棋中做同样的事情,我遇到了问题

在我的代码中,我可以成功地执行步骤4)
mkdir/sys/fs/cgroup/pids
,我甚至验证了这个文件是否已创建,但我在获取syscall.Mount()以执行第五个命令时遇到了问题

这是我现在拥有的

func mountPid(pidsLoc string) {
    fstype := "cgroup"
    source := "pids"
    flags := uintptr(0)
    data := "pids"

    err := syscall.Mount(source, pidsLoc, fstype, flags, data)
    if err != nil {
        serverFatal(err)
    }
}
其中,
pidsLoc=/sys/fs/cgroup/pids
,但当我尝试运行它时,会出现一个错误“不允许操作”

我真的不认为这是一个权限错误,因为我能够挂载我的
/sys
/proc
/sys/fs/cgroups
很好。以下是我用于这三个方面的代码:

func mountProc() {
    source := "proc"
    fstype := "proc"
    target := "/proc"
    flags := uintptr(0)
    data := ""

    err := syscall.Mount(source, target, fstype, flags, data)
    if err != nil {
        serverFatal(err)
    }
}

func mountSys() {
    source := "sysfs"
    fstype := "sysfs"
    target := "/sys"
    flags := uintptr(0)
    data := ""

    err := syscall.Mount(source, target, fstype, flags, data)
    if err != nil {
        serverFatal(err)
    }
}

//This can not be called before mountSys()
func mountCGroupFS() {
    fstype := "tmpfs"
    source := "cgroup_root"
    target := "/sys/fs/cgroup"
    flags := uintptr(0)
    data := ""

    err := syscall.Mount(source, target, fstype, flags, data)
    if err != nil {
        serverFatal(err)
    }
}
我以与以前相同的权限运行了所有这些。也许我只是使用了syscall.Mount()错误,但我不确定。Go中的syscall包的文档不是很好,我发现我主要需要阅读C/C++文档,了解syscall正在包装的方法,然后尝试在两者之间建立连接

提前谢谢


如果您感兴趣,p.S.是回购协议的链接。我正在尝试制作一个程序,允许您“安全地”执行外来代码。

为什么不使用这个:?我不知道这一点,它看起来将是一个很好的资源,但我正在尝试从头开始构建自己的程序来学习,所以我不想使用其他库。
func mountProc() {
    source := "proc"
    fstype := "proc"
    target := "/proc"
    flags := uintptr(0)
    data := ""

    err := syscall.Mount(source, target, fstype, flags, data)
    if err != nil {
        serverFatal(err)
    }
}

func mountSys() {
    source := "sysfs"
    fstype := "sysfs"
    target := "/sys"
    flags := uintptr(0)
    data := ""

    err := syscall.Mount(source, target, fstype, flags, data)
    if err != nil {
        serverFatal(err)
    }
}

//This can not be called before mountSys()
func mountCGroupFS() {
    fstype := "tmpfs"
    source := "cgroup_root"
    target := "/sys/fs/cgroup"
    flags := uintptr(0)
    data := ""

    err := syscall.Mount(source, target, fstype, flags, data)
    if err != nil {
        serverFatal(err)
    }
}