checkpoint-restore / checkpointctl

A tool for in-depth analysis of container checkpoints
Apache License 2.0
87 stars 15 forks source link

Make command fails #112

Closed shikharish closed 6 months ago

shikharish commented 6 months ago

Running make gives the following error:

❯ make
go build -o checkpointctl -ldflags "-X main.name=checkpointctl -X main.version=1.1.0"
# github.com/containers/storage/pkg/unshare
unshare.c: In function 'try_bindfd':
unshare.c:196:30: error: 'O_PATH' undeclared (first use in this function)
  196 |         ret = open(template, O_PATH | O_CLOEXEC);
      |                              ^~~~~~
unshare.c:196:30: note: each undeclared identifier is reported only once for each function it appears in
unshare.c: In function 'copy_self_proc_exe':
unshare.c:236:24: error: 'SYS_memfd_create' undeclared (first use in this function); did you mean 'SYS_timerfd_create'?
  236 |         mmfd = syscall(SYS_memfd_create, exename, (long) MFD_ALLOW_SEALING | MFD_CLOEXEC);
      |                        ^~~~~~~~~~~~~~~~
      |                        SYS_timerfd_create
make: *** [Makefile:36: checkpointctl] Error 1

System details: OS: Linux Mint 21.1 x86_64 Kernel: 5.15.0-91-generic CPU: 11th Gen Intel i5-11320H (8) @ 4.500GHz

adrianreber commented 6 months ago

You are probably missing header files. This is code included from another project (containers/storage) so nothing under our direct control.

On my Fedora system I would install the package kernel-headers to get the necessary header files. Not sure what you need.

shikharish commented 6 months ago

@adrianreber Can you tell me exactly what command you would run on Fedora? I believe I already have the kernel header files on my system.

snprajwal commented 6 months ago

On Mint, if you want to install both the kernel and headers together, you can install the linux-generic meta package which handles both. If you explicitly want to install only the headers, then you can install the linux-headers-generic package.

shikharish commented 6 months ago

I already have linux-headers-generic installed.

snprajwal commented 6 months ago

I see that you're using the 5.15 kernel, which is two versions behind the latest LTS release. Could you please upgrade your kernel to a newer version (6.1 or 6.6) and try? It could just be that the kernel does not support the newer bindings used in unshare.c.

shikharish commented 6 months ago

Updated to kernel 6.5.0, and removed old kernel. Same error.

snprajwal commented 6 months ago

Could you please check if /usr/include/linux/memfd.h is present on your machine?

shikharish commented 6 months ago

@snprajwal Yes there is. Here are the contents:

/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _LINUX_MEMFD_H
#define _LINUX_MEMFD_H

#include <asm-generic/hugetlb_encode.h>

/* flags for memfd_create(2) (unsigned int) */
#define MFD_CLOEXEC     0x0001U
#define MFD_ALLOW_SEALING   0x0002U
#define MFD_HUGETLB     0x0004U

/*
 * Huge page size encoding when MFD_HUGETLB is specified, and a huge page
 * size other than the default is desired.  See hugetlb_encode.h.
 * All known huge page size encodings are provided here.  It is the
 * responsibility of the application to know which sizes are supported on
 * the running system.  See mmap(2) man page for details.
 */
#define MFD_HUGE_SHIFT  HUGETLB_FLAG_ENCODE_SHIFT
#define MFD_HUGE_MASK   HUGETLB_FLAG_ENCODE_MASK

#define MFD_HUGE_64KB   HUGETLB_FLAG_ENCODE_64KB
#define MFD_HUGE_512KB  HUGETLB_FLAG_ENCODE_512KB
#define MFD_HUGE_1MB    HUGETLB_FLAG_ENCODE_1MB
#define MFD_HUGE_2MB    HUGETLB_FLAG_ENCODE_2MB
#define MFD_HUGE_8MB    HUGETLB_FLAG_ENCODE_8MB
#define MFD_HUGE_16MB   HUGETLB_FLAG_ENCODE_16MB
#define MFD_HUGE_32MB   HUGETLB_FLAG_ENCODE_32MB
#define MFD_HUGE_256MB  HUGETLB_FLAG_ENCODE_256MB
#define MFD_HUGE_512MB  HUGETLB_FLAG_ENCODE_512MB
#define MFD_HUGE_1GB    HUGETLB_FLAG_ENCODE_1GB
#define MFD_HUGE_2GB    HUGETLB_FLAG_ENCODE_2GB
#define MFD_HUGE_16GB   HUGETLB_FLAG_ENCODE_16GB

#endif /* _LINUX_MEMFD_H */
shikharish commented 6 months ago

I managed to build it for now by manually defining the constants in the file causing the error. Tried many other things but nothing worked. Closing this issue and keeping the the one in containers/storage open.