{"record":{"id":"1ab0d8c7d457df1e","repo":"containerd/containerd","slug":"checkpoint-restore-requires-at-least-criu-d-curr","errorCode":null,"errorMessage":"checkpoint/restore requires at least CRIU %d, current version is %d","messagePattern":"checkpoint/restore requires at least CRIU (.+?), current version is (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/cri/server/container_checkpoint_linux.go","lineNumber":115,"sourceCode":"\treturn c.checkCriuErr\n}\n\nfunc (c *criService) doCheckCriu() error {\n\tif c.config.EnableCRIU != nil && !*c.config.EnableCRIU {\n\t\treturn errors.New(\"criu support is disabled by configuration\")\n\t}\n\tpath := resolveCriuPath(c.shimPath)\n\tif path == \"\" {\n\t\treturn errors.New(\"criu binary not found in shim path or system PATH\")\n\t}\n\tclient := criu.MakeCriu()\n\tclient.SetCriuPath(path)\n\tversion, err := client.GetCriuVersion()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to retrieve criu version: %w\", err)\n\t}\n\tif version < utils.PodCriuVersion {\n\t\treturn fmt.Errorf(\"checkpoint/restore requires at least CRIU %d, current version is %d\", utils.PodCriuVersion, version)\n\t}\n\treturn nil\n}\n\nfunc resolveCriuPath(customPath string) string {\n\tif customPath != \"\" {\n\t\t// This logic is Linux-specific. If CRIU is ever supported on other\n\t\t// operating systems, path lookup will need to respect that OS's\n\t\t// conventions.\n\t\tfor _, dir := range filepath.SplitList(customPath) {\n\t\t\tif !filepath.IsAbs(dir) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tcriuPath := filepath.Join(dir, \"criu\")\n\t\t\tif fi, err := os.Stat(criuPath); err == nil && fi.Mode().IsRegular() && fi.Mode()&0111 != 0 {\n\t\t\t\treturn criuPath\n\t\t\t}\n\t\t}","sourceCodeStart":97,"sourceCodeEnd":133,"githubUrl":"https://github.com/containerd/containerd/blob/4246446a2bf7d03837b0244118d858799393bd80/internal/cri/server/container_checkpoint_linux.go#L97-L133","documentation":"doCheckCriu found CRIU but its version is lower than the minimum required (utils.PodCriuVersion), so checkpoint/restore is refused. Older CRIU lacks features the pod-level checkpoint implementation depends on.","triggerScenarios":"CheckpointContainer invoked on a node with CRIU older than the required minimum; distro ships an outdated criu package; manually installed CRIU in the shim path is an old build picked by resolveCriuPath before the system PATH one.","commonSituations":"Older LTS distro with an ancient criu package; someone dropped a legacy criu binary next to the shim; kernel/CRIU mismatch after node upgrade.","solutions":["Upgrade CRIU to at least the required version (per the error message) via the package manager or upstream release","Remove/rename the outdated criu binary in the shim path so resolveCriuPath picks the newer system one","If upgrade is impossible, disable checkpoint/restore features on that node","Verify with `criu --version` that the resolved binary meets the minimum"],"exampleFix":"// before\n$ criu --version\nVersion: 3.12   # below minimum\n// after\n$ apt-get install -y criu && criu --version\nVersion: 3.17.1","handlingStrategy":"validation","validationCode":"out, err := exec.Command(criuPath, \"--version\").Output()\nif err != nil { return err }\nv, err := parseCriuVersion(string(out))\nif err != nil { return err }\nif v < utils.PodCriuVersion {\n    return fmt.Errorf(\"need criu >= %d, got %d\", utils.PodCriuVersion, v)\n}","typeGuard":null,"tryCatchPattern":"if err := checkCriu(); err != nil && strings.Contains(err.Error(), \"requires at least CRIU\") {\n    // parse required/current versions from the message and upgrade\n}","preventionTips":["Enforce minimum CRIU version in node image builds","Remove stale old criu binaries from shim directories","Track the runtime's required CRIU version when upgrading containerd","Test checkpoint/restore in CI after node upgrades"],"tags":["criu","checkpoint","version-check","upgrade"],"backgroundTag":"criu-version-too-old","analyzedSha":"4246446a2bf7d03837b0244118d858799393bd80","analyzedAt":"2026-09-02T00:14:43.053Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-09T06:17:21.866Z"}