mirror of
https://github.com/containers/podman.git
synced 2025-08-06 19:44:14 +08:00

CRIU's pre-copy migration support relies on the soft dirty page tracking in the Linux kernel: https://www.kernel.org/doc/Documentation/vm/soft-dirty.txt This functionality is not implemented for all architectures and it can also be turned off in the kernel. CRIU can check if the combination of architecture/kernel/CRIU supports the soft dirty page tracking and exports this feature checking functionality in go-criu. This commit adds an early check if the user selects pre-copy checkpointing to error out if the system does not support it. Signed-off-by: Adrian Reber <areber@redhat.com>
46 lines
950 B
Go
46 lines
950 B
Go
// +build linux
|
|
|
|
package criu
|
|
|
|
import (
|
|
"github.com/checkpoint-restore/go-criu/v5"
|
|
"github.com/checkpoint-restore/go-criu/v5/rpc"
|
|
|
|
"google.golang.org/protobuf/proto"
|
|
)
|
|
|
|
// MinCriuVersion for Podman at least CRIU 3.11 is required
|
|
const MinCriuVersion = 31100
|
|
|
|
// PodCriuVersion is the version of CRIU needed for
|
|
// checkpointing and restoring containers out of and into Pods.
|
|
const PodCriuVersion = 31600
|
|
|
|
// CheckForCriu uses CRIU's go bindings to check if the CRIU
|
|
// binary exists and if it at least the version Podman needs.
|
|
func CheckForCriu(version int) bool {
|
|
c := criu.MakeCriu()
|
|
result, err := c.IsCriuAtLeast(version)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
return result
|
|
}
|
|
|
|
func MemTrack() bool {
|
|
features, err := criu.MakeCriu().FeatureCheck(
|
|
&rpc.CriuFeatures{
|
|
MemTrack: proto.Bool(true),
|
|
},
|
|
)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
|
|
if features == nil || features.MemTrack == nil {
|
|
return false
|
|
}
|
|
|
|
return *features.MemTrack
|
|
}
|