mirror of
https://github.com/opencontainers/runc.git
synced 2026-07-11 06:03:57 +08:00
bfca1e6262
Now that CRIU has released Go bindings, this commit vendors those in. At first it only replaces the copy of RPC interface but the goal is to use CRIU functions from the Go bindings instead of replicating the functionality in runc. Signed-off-by: Adrian Reber <areber@redhat.com>
134 lines
2.5 KiB
Go
134 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/checkpoint-restore/go-criu"
|
|
"github.com/checkpoint-restore/go-criu/rpc"
|
|
"github.com/golang/protobuf/proto"
|
|
"os"
|
|
"strconv"
|
|
)
|
|
|
|
// TestNfy struct
|
|
type TestNfy struct {
|
|
criu.NoNotify
|
|
}
|
|
|
|
// PreDump test function
|
|
func (c TestNfy) PreDump() error {
|
|
fmt.Printf("TEST PRE DUMP\n")
|
|
return nil
|
|
}
|
|
|
|
func doDump(c *criu.Criu, pidS string, imgDir string, pre bool, prevImg string) error {
|
|
fmt.Printf("Dumping\n")
|
|
pid, _ := strconv.Atoi(pidS)
|
|
img, err := os.Open(imgDir)
|
|
if err != nil {
|
|
return fmt.Errorf("can't open image dir (%s)", err)
|
|
}
|
|
defer img.Close()
|
|
|
|
opts := rpc.CriuOpts{
|
|
Pid: proto.Int32(int32(pid)),
|
|
ImagesDirFd: proto.Int32(int32(img.Fd())),
|
|
LogLevel: proto.Int32(4),
|
|
LogFile: proto.String("dump.log"),
|
|
}
|
|
|
|
if prevImg != "" {
|
|
opts.ParentImg = proto.String(prevImg)
|
|
opts.TrackMem = proto.Bool(true)
|
|
}
|
|
|
|
if pre {
|
|
err = c.PreDump(opts, TestNfy{})
|
|
} else {
|
|
err = c.Dump(opts, TestNfy{})
|
|
}
|
|
if err != nil {
|
|
return fmt.Errorf("dump fail (%s)", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Usage: test $act $pid $images_dir
|
|
func main() {
|
|
c := criu.MakeCriu()
|
|
// Read out CRIU version
|
|
version, err := c.GetCriuVersion()
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
os.Exit(1)
|
|
}
|
|
fmt.Println("CRIU version", version)
|
|
// Check if version at least 3.2
|
|
result, err := c.IsCriuAtLeast(30200)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
os.Exit(1)
|
|
}
|
|
if !result {
|
|
fmt.Println("CRIU too old")
|
|
os.Exit(1)
|
|
}
|
|
act := os.Args[1]
|
|
switch act {
|
|
case "dump":
|
|
err := doDump(c, os.Args[2], os.Args[3], false, "")
|
|
if err != nil {
|
|
fmt.Print(err)
|
|
os.Exit(1)
|
|
}
|
|
case "dump2":
|
|
err := c.Prepare()
|
|
if err != nil {
|
|
fmt.Print(err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
err = doDump(c, os.Args[2], os.Args[3]+"/pre", true, "")
|
|
if err != nil {
|
|
fmt.Printf("pre-dump failed")
|
|
fmt.Print(err)
|
|
os.Exit(1)
|
|
}
|
|
err = doDump(c, os.Args[2], os.Args[3], false, "./pre")
|
|
if err != nil {
|
|
fmt.Printf("dump failed")
|
|
fmt.Print(err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
c.Cleanup()
|
|
case "restore":
|
|
fmt.Printf("Restoring\n")
|
|
img, err := os.Open(os.Args[2])
|
|
if err != nil {
|
|
fmt.Printf("can't open image dir")
|
|
os.Exit(1)
|
|
}
|
|
defer img.Close()
|
|
|
|
opts := rpc.CriuOpts{
|
|
ImagesDirFd: proto.Int32(int32(img.Fd())),
|
|
LogLevel: proto.Int32(4),
|
|
LogFile: proto.String("restore.log"),
|
|
}
|
|
|
|
err = c.Restore(opts, nil)
|
|
if err != nil {
|
|
fmt.Printf("Error:")
|
|
fmt.Print(err)
|
|
fmt.Printf("\n")
|
|
os.Exit(1)
|
|
}
|
|
default:
|
|
fmt.Printf("unknown action\n")
|
|
os.Exit(1)
|
|
}
|
|
|
|
fmt.Printf("Success\n")
|
|
}
|