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