CGROUPS V2 с GOLANGLinux

Ответить
Anonymous
 CGROUPS V2 с GOLANG

Сообщение Anonymous »

Я следую за этим учебником, чтобы построить простой контейнер. Однако, когда инструктор реализует группы управления, она использует CGROUPS V1, в то время как моя машина запускает Ubuntu 24.04, который использует CGROUPS V2 (

Код: Выделить всё

cgroup2fs
).
Я изучил, как работает Cgroups v2, но я изо всех сил пытаюсь адаптировать реализацию из учебника. Ключевые различия между CGROUPS V1 и V2, по -видимому, включают изменения структуры файла и различные способы установки ограничений, но я не уверен, как их применять в этом случае.
Как изменить функцию CG () для работы с CGRUPS v2? Код: < /p>
package main

import (
"fmt"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
"strconv"
"syscall"
)

// go run main.go run
func main() {
switch os.Args[1] {
case "run":
run()
case "child":
child()
default:
panic("help")
}
}

func run() {
fmt.Printf("Running %v \n", os.Args[2:])

cmd := exec.Command("/proc/self/exe", append([]string{"child"}, os.Args[2:]...)...)
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.SysProcAttr = &syscall.SysProcAttr{
Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS,
Unshareflags: syscall.CLONE_NEWNS,
}

must(cmd.Run())
}

func child() {
fmt.Printf("Running %v \n", os.Args[2:])

cg()

cmd := exec.Command(os.Args[2], os.Args[3:]...)
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr

must(syscall.Sethostname([]byte("container")))
must(syscall.Chroot("/home/liz/ubuntufs"))
must(os.Chdir("/"))
must(syscall.Mount("proc", "proc", "proc", 0, ""))
must(syscall.Mount("thing", "mytemp", "tmpfs", 0, ""))

must(cmd.Run())

must(syscall.Unmount("proc", 0))
must(syscall.Unmount("thing", 0))
}

func cg() {
cgroups := "/sys/fs/cgroup/"
pids := filepath.Join(cgroups, "pids")
os.Mkdir(filepath.Join(pids, "liz"), 0755)
must(ioutil.WriteFile(filepath.Join(pids, "liz/pids.max"), []byte("20"), 0700))
// Removes the new cgroup in place after the container exits
must(ioutil.WriteFile(filepath.Join(pids, "liz/notify_on_release"), []byte("1"), 0700))
must(ioutil.WriteFile(filepath.Join(pids, "liz/cgroup.procs"), []byte(strconv.Itoa(os.Getpid())), 0700))
}

func must(err error) {
if err != nil {
panic(err)
}
}
< /code>
Это моя первая работа с CGROUPS, и я не мог найти хорошие учебные пособия Golang по этой теме. Я также спросил ИИ, но предоставленный он не был полезным. Любое руководство или примеры будут высоко оценены.

Подробнее здесь: https://stackoverflow.com/questions/794 ... ith-golang
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»