问题描述
我有一些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 (将#修改为@)