c/r: create cgroups to restore a container
Here are two reasons: * If we use systemd, we need to ask it to create cgroups * If a container is restored with another ID, we need to change paths to cgroups. Signed-off-by: Andrey Vagin <avagin@openvz.org>
This commit is contained in:
parent
da2535f2d1
commit
df39686c93
|
@ -411,7 +411,7 @@ func (c *linuxContainer) Checkpoint(criuOpts *CriuOpts) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = c.criuSwrk(nil, req, criuOpts)
|
err = c.criuSwrk(nil, req, criuOpts, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -504,6 +504,7 @@ func (c *linuxContainer) Restore(process *Process, criuOpts *CriuOpts) error {
|
||||||
FileLocks: proto.Bool(criuOpts.FileLocks),
|
FileLocks: proto.Bool(criuOpts.FileLocks),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, m := range c.config.Mounts {
|
for _, m := range c.config.Mounts {
|
||||||
switch m.Device {
|
switch m.Device {
|
||||||
case "bind":
|
case "bind":
|
||||||
|
@ -561,14 +562,36 @@ func (c *linuxContainer) Restore(process *Process, criuOpts *CriuOpts) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err = c.criuSwrk(process, req, criuOpts)
|
err = c.criuSwrk(process, req, criuOpts, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *linuxContainer) criuSwrk(process *Process, req *criurpc.CriuReq, opts *CriuOpts) error {
|
func (c *linuxContainer) criuApplyCgroups(pid int, req *criurpc.CriuReq) error {
|
||||||
|
if err := c.cgroupManager.Apply(pid); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
path := fmt.Sprintf("/proc/%d/cgroup", pid)
|
||||||
|
cgroupsPaths, err := cgroups.ParseCgroupFile(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for c, p := range cgroupsPaths {
|
||||||
|
cgroupRoot := &criurpc.CgroupRoot{
|
||||||
|
Ctrl: proto.String(c),
|
||||||
|
Path: proto.String(p),
|
||||||
|
}
|
||||||
|
req.Opts.CgRoot = append(req.Opts.CgRoot, cgroupRoot)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *linuxContainer) criuSwrk(process *Process, req *criurpc.CriuReq, opts *CriuOpts, applyCgroups bool) error {
|
||||||
fds, err := syscall.Socketpair(syscall.AF_LOCAL, syscall.SOCK_SEQPACKET|syscall.SOCK_CLOEXEC, 0)
|
fds, err := syscall.Socketpair(syscall.AF_LOCAL, syscall.SOCK_SEQPACKET|syscall.SOCK_CLOEXEC, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -602,6 +625,13 @@ func (c *linuxContainer) criuSwrk(process *Process, req *criurpc.CriuReq, opts *
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
if applyCgroups {
|
||||||
|
err := c.criuApplyCgroups(cmd.Process.Pid, req)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var extFds []string
|
var extFds []string
|
||||||
if process != nil {
|
if process != nil {
|
||||||
extFds, err = getPipeFds(cmd.Process.Pid)
|
extFds, err = getPipeFds(cmd.Process.Pid)
|
||||||
|
|
Loading…
Reference in New Issue