diff --git a/cgroups-v2.patch b/cgroups-v2.patch new file mode 100644 index 0000000..561b81a --- /dev/null +++ b/cgroups-v2.patch @@ -0,0 +1,103 @@ +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 + diff --git a/runc.spec b/runc.spec index 4d59022..5a8a772 100644 --- a/runc.spec +++ b/runc.spec @@ -31,6 +31,7 @@ License: ASL 2.0 URL: %{git0} Source0: %{git0}/archive/%{commit0}/%{name}-%{shortcommit0}.tar.gz Patch0: 1807.patch +Patch1: cgroups-v2.patch # e.g. el6 has ppc64 arch without gcc-go, so EA tag is required #ExclusiveArch: %%{?go_arches:%%{go_arches}}%%{!?go_arches:%%{ix86} x86_64 %%{arm}}