Merge pull request #667 from mrunalp/systemd_cgroups
Add support for enabling systemd cgroups
This commit is contained in:
commit
24950964ec
4
main.go
4
main.go
|
@ -79,6 +79,10 @@ func main() {
|
||||||
Value: "criu",
|
Value: "criu",
|
||||||
Usage: "path to the criu binary used for checkpoint and restore",
|
Usage: "path to the criu binary used for checkpoint and restore",
|
||||||
},
|
},
|
||||||
|
cli.BoolFlag{
|
||||||
|
Name: "systemd-cgroup",
|
||||||
|
Usage: "enable systemd cgroup support, expects cgroupsPath to be of form \"slice:prefix:name\" for e.g. \"system.slice:runc:434234\"",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
app.Commands = []cli.Command{
|
app.Commands = []cli.Command{
|
||||||
checkpointCommand,
|
checkpointCommand,
|
||||||
|
|
|
@ -48,5 +48,6 @@ value for "bundle" is the current directory.
|
||||||
--log-format "text" set the format used by logs ('text' (default), or 'json')
|
--log-format "text" set the format used by logs ('text' (default), or 'json')
|
||||||
--root "/run/opencontainer/containers" root directory for storage of container state (this should be located in tmpfs)
|
--root "/run/opencontainer/containers" root directory for storage of container state (this should be located in tmpfs)
|
||||||
--criu "criu" path to the criu binary used for checkpoint and restore
|
--criu "criu" path to the criu binary used for checkpoint and restore
|
||||||
|
--systemd-cgroup enable systemd cgroup support, expects cgroupsPath to be of form "slice:prefix:name" for e.g. "system.slice:runc:434234"
|
||||||
--help, -h show help
|
--help, -h show help
|
||||||
--version, -v print the version
|
--version, -v print the version
|
||||||
|
|
|
@ -92,7 +92,7 @@ using the runc checkpoint command.`,
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fatal(err)
|
fatal(err)
|
||||||
}
|
}
|
||||||
config, err := createLibcontainerConfig(id, spec)
|
config, err := createLibcontainerConfig(id, context.GlobalBool("systemd-cgroup"), spec)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fatal(err)
|
fatal(err)
|
||||||
}
|
}
|
||||||
|
|
49
spec.go
49
spec.go
|
@ -248,7 +248,7 @@ func loadSpec(cPath string) (spec *specs.Spec, err error) {
|
||||||
return spec, validateProcessSpec(&spec.Process)
|
return spec, validateProcessSpec(&spec.Process)
|
||||||
}
|
}
|
||||||
|
|
||||||
func createLibcontainerConfig(cgroupName string, spec *specs.Spec) (*configs.Config, error) {
|
func createLibcontainerConfig(cgroupName string, useSystemdCgroup bool, spec *specs.Spec) (*configs.Config, error) {
|
||||||
// runc's cwd will always be the bundle path
|
// runc's cwd will always be the bundle path
|
||||||
rcwd, err := os.Getwd()
|
rcwd, err := os.Getwd()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -299,7 +299,7 @@ func createLibcontainerConfig(cgroupName string, spec *specs.Spec) (*configs.Con
|
||||||
if err := setupUserNamespace(spec, config); err != nil {
|
if err := setupUserNamespace(spec, config); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
c, err := createCgroupConfig(cgroupName, spec)
|
c, err := createCgroupConfig(cgroupName, useSystemdCgroup, spec)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -344,26 +344,47 @@ func createLibcontainerMount(cwd string, m specs.Mount) *configs.Mount {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func createCgroupConfig(name string, spec *specs.Spec) (*configs.Cgroup, error) {
|
func createCgroupConfig(name string, useSystemdCgroup bool, spec *specs.Spec) (*configs.Cgroup, error) {
|
||||||
var (
|
var (
|
||||||
err error
|
err error
|
||||||
myCgroupPath string
|
myCgroupPath string
|
||||||
)
|
)
|
||||||
|
|
||||||
if spec.Linux.CgroupsPath != nil {
|
|
||||||
myCgroupPath = libcontainerUtils.CleanPath(*spec.Linux.CgroupsPath)
|
|
||||||
} else {
|
|
||||||
myCgroupPath, err = cgroups.GetThisCgroupDir("devices")
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
myCgroupPath = filepath.Join(myCgroupPath, name)
|
|
||||||
}
|
|
||||||
|
|
||||||
c := &configs.Cgroup{
|
c := &configs.Cgroup{
|
||||||
Path: myCgroupPath,
|
|
||||||
Resources: &configs.Resources{},
|
Resources: &configs.Resources{},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if spec.Linux.CgroupsPath != nil {
|
||||||
|
myCgroupPath = libcontainerUtils.CleanPath(*spec.Linux.CgroupsPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
if useSystemdCgroup {
|
||||||
|
if myCgroupPath == "" {
|
||||||
|
c.Parent = "system.slice"
|
||||||
|
c.ScopePrefix = "runc"
|
||||||
|
c.Name = name
|
||||||
|
} else {
|
||||||
|
// Parse the path from expected "slice:prefix:name"
|
||||||
|
// for e.g. "system.slice:docker:1234"
|
||||||
|
parts := strings.Split(myCgroupPath, ":")
|
||||||
|
if len(parts) != 3 {
|
||||||
|
return nil, fmt.Errorf("expected cgroupsPath to be of format \"slice:prefix:name\" for systemd cgroups")
|
||||||
|
}
|
||||||
|
c.Parent = parts[0]
|
||||||
|
c.ScopePrefix = parts[1]
|
||||||
|
c.Name = parts[2]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if myCgroupPath == "" {
|
||||||
|
myCgroupPath, err = cgroups.GetThisCgroupDir("devices")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
myCgroupPath = filepath.Join(myCgroupPath, name)
|
||||||
|
}
|
||||||
|
c.Path = myCgroupPath
|
||||||
|
}
|
||||||
|
|
||||||
c.Resources.AllowedDevices = allowedDevices
|
c.Resources.AllowedDevices = allowedDevices
|
||||||
r := spec.Linux.Resources
|
r := spec.Linux.Resources
|
||||||
if r == nil {
|
if r == nil {
|
||||||
|
|
|
@ -15,7 +15,7 @@ func TestLinuxCgroupsPathSpecified(t *testing.T) {
|
||||||
spec := &specs.Spec{}
|
spec := &specs.Spec{}
|
||||||
spec.Linux.CgroupsPath = &cgroupsPath
|
spec.Linux.CgroupsPath = &cgroupsPath
|
||||||
|
|
||||||
cgroup, err := createCgroupConfig("ContainerID", spec)
|
cgroup, err := createCgroupConfig("ContainerID", false, spec)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Couldn't create Cgroup config: %v", err)
|
t.Errorf("Couldn't create Cgroup config: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@ func TestLinuxCgroupsPathSpecified(t *testing.T) {
|
||||||
func TestLinuxCgroupsPathNotSpecified(t *testing.T) {
|
func TestLinuxCgroupsPathNotSpecified(t *testing.T) {
|
||||||
spec := &specs.Spec{}
|
spec := &specs.Spec{}
|
||||||
|
|
||||||
cgroup, err := createCgroupConfig("ContainerID", spec)
|
cgroup, err := createCgroupConfig("ContainerID", false, spec)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Couldn't create Cgroup config: %v", err)
|
t.Errorf("Couldn't create Cgroup config: %v", err)
|
||||||
}
|
}
|
||||||
|
|
13
utils.go
13
utils.go
|
@ -12,6 +12,7 @@ import (
|
||||||
"github.com/Sirupsen/logrus"
|
"github.com/Sirupsen/logrus"
|
||||||
"github.com/codegangsta/cli"
|
"github.com/codegangsta/cli"
|
||||||
"github.com/opencontainers/runc/libcontainer"
|
"github.com/opencontainers/runc/libcontainer"
|
||||||
|
"github.com/opencontainers/runc/libcontainer/cgroups/systemd"
|
||||||
"github.com/opencontainers/runc/libcontainer/configs"
|
"github.com/opencontainers/runc/libcontainer/configs"
|
||||||
"github.com/opencontainers/specs/specs-go"
|
"github.com/opencontainers/specs/specs-go"
|
||||||
)
|
)
|
||||||
|
@ -146,7 +147,15 @@ func loadFactory(context *cli.Context) (libcontainer.Factory, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return libcontainer.New(abs, libcontainer.Cgroupfs, func(l *libcontainer.LinuxFactory) error {
|
cgroupManager := libcontainer.Cgroupfs
|
||||||
|
if context.GlobalBool("systemd-cgroup") {
|
||||||
|
if systemd.UseSystemd() {
|
||||||
|
cgroupManager = libcontainer.SystemdCgroups
|
||||||
|
} else {
|
||||||
|
return nil, fmt.Errorf("systemd cgroup flag passed, but systemd support for managing cgroups is not available.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return libcontainer.New(abs, cgroupManager, func(l *libcontainer.LinuxFactory) error {
|
||||||
l.CriuPath = context.GlobalString("criu")
|
l.CriuPath = context.GlobalString("criu")
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
@ -285,7 +294,7 @@ func createPidFile(path string, process *libcontainer.Process) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func createContainer(context *cli.Context, id string, spec *specs.Spec) (libcontainer.Container, error) {
|
func createContainer(context *cli.Context, id string, spec *specs.Spec) (libcontainer.Container, error) {
|
||||||
config, err := createLibcontainerConfig(id, spec)
|
config, err := createLibcontainerConfig(id, context.GlobalBool("systemd-cgroup"), spec)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue