设置Cgroup

问题描述

我有一些go代码,可以创建骨架根系统,然后在每个linux命名空间chroots下进入它,设置cgroup,然后在该cgroup / chroot内部运行一个进程。

我已经大部分工作了,但是我很难让cgroup工作。

我在cgroups上所做的大部分工作都遵循this,但从概念上来说,我仍然是他们的新手。

如果我手动创建此环境并运行以下命令,那么一切似乎都可以正常工作。 (我在上面添加了数字以供以后参考)

1) mount -t proc proc /proc
2) mount -t sysfs sysfs /sys
3) mount -t tmpfs cgroup_root /sys/fs/cgroup
4) mkdir /sys/fs/cgroup/pids
5) mount -t cgroup pids -o pids /sys/fs/cgroup/pids

从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,一切正常。

我的问题是我试图在Go中执行相同的操作,但是遇到了问题。

在我的代码中,我可以成功执行步骤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,data)
    if err != nil {
        serverFatal(err)
    }
}

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

    err := syscall.Mount(source,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,data)
    if err != nil {
        serverFatal(err)
    }
}

我以与以前相同的权限运行了所有这些程序。也许我只是使用syscall.Mount()错误,但我不确定。 Go中的syscall软件包的文档不是很好,我发现我几乎必须阅读C / C ++文档,了解syscall包装的方法,然后尝试在两者之间建立连接。

谢谢!

P.S。 Here是您感兴趣的回购链接。我正在尝试制作一个程序,使您可以“安全地”执行外来代码。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)