From 5fb0f19ec8c52ed0c9bbb3551deb0016992ecc52 Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Thu, 3 Oct 2019 15:58:39 +0200 Subject: [PATCH] cgroups: raise an error on cgroups v2 Signed-off-by: Giuseppe Scrivano --- create.go | 8 ++++++++ run.go | 8 ++++++++ utils_linux.go | 14 ++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/create.go b/create.go index 5f3ac609..91d17d07 100644 --- a/create.go +++ b/create.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "os" "github.com/urfave/cli" @@ -52,6 +53,13 @@ command(s) that get executed on start, edit the args parameter of the spec. See }, }, Action: func(context *cli.Context) error { + unified, err := IsCgroup2UnifiedMode() + if err != nil { + return err + } + if unified { + return fmt.Errorf("this version of runc doesn't work on cgroups v2") + } if err := checkArgs(context, 1, exactArgs); err != nil { return err } diff --git a/run.go b/run.go index f8d63178..3f29737b 100644 --- a/run.go +++ b/run.go @@ -3,6 +3,7 @@ package main import ( + "fmt" "os" "github.com/urfave/cli" @@ -63,6 +64,13 @@ command(s) that get executed on start, edit the args parameter of the spec. See }, }, Action: func(context *cli.Context) error { + unified, err := IsCgroup2UnifiedMode() + if err != nil { + return err + } + if unified { + return fmt.Errorf("this version of runc doesn't work on cgroups v2") + } if err := checkArgs(context, 1, exactArgs); err != nil { return err } diff --git a/utils_linux.go b/utils_linux.go index 984e6b0f..a5a03de9 100644 --- a/utils_linux.go +++ b/utils_linux.go @@ -9,6 +9,7 @@ import ( "os/exec" "path/filepath" "strconv" + "syscall" "github.com/opencontainers/runc/libcontainer" "github.com/opencontainers/runc/libcontainer/cgroups/systemd" @@ -26,6 +27,10 @@ import ( "golang.org/x/sys/unix" ) +const ( + _cgroup2SuperMagic = 0x63677270 +) + var errEmptyID = errors.New("container id cannot be empty") // loadFactory returns the configured factory instance for execing containers. @@ -451,3 +456,12 @@ func startContainer(context *cli.Context, spec *specs.Spec, action CtAct, criuOp } return r.run(spec.Process) } + +// IsCgroup2UnifiedMode returns whether we are running in cgroup 2 cgroup2 mode. +func IsCgroup2UnifiedMode() (bool, error) { + var st syscall.Statfs_t + if err := syscall.Statfs("/sys/fs/cgroup", &st); err != nil { + return false, err + } + return st.Type == _cgroup2SuperMagic, nil +} -- 2.21.0