我目前的主机系统运行带有 docker 的 Mac OS。我的 Mac OS 主机系统生成了一个 docker 容器。
生成的 docker 容器当前正在运行
ubuntu:19.10
我正在尝试在 docker 容器内构建内核模块
当我跑步时
$> make
我明白了...
Building coolMod driver...
make -C /lib/modules/`uname -r`/build M=/home/foo/coolMod modules
make[1]: *** /lib/modules/4.19.76-linuxkit/build: No such file or directory. Stop.
make: *** [Makefile:43: coolMod.ko] Error 2
docker容器没有内核头。
当我尝试跑步时:
$> apt install linux-headers-$(uname -r)
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package linux-headers-4.19.76-linuxkit
E: Couldn't find any package by glob 'linux-headers-4.19.76-linuxkit'
E: Couldn't find any package by regex 'linux-headers-4.19.76-linuxkit'
如何安装内核头文件,以便可以从 Docker 容器中构建内核模块?
谢谢!
也许为时已晚,但为了在容器内构建内核模块,您应该以 --priviliged 模式执行容器。
除了依赖项 kernel-devel 和 kernel-headers 之外,还应该针对您的特定内核版本构建内核,因此您应该创建一个卷来将 host:/lib/modules 链接到 your_container:/lib/modules。
一个好的起点应该是 https://projectatomic.io/blog/2018/06/building-kernel-modules-with-podman/。
Docker 容器没有自己的内核;他们使用 Docker 主机的内核。因此,当您运行
uname
命令时,您看到的结果是底层 Docker 主机的结果。您可以通过将 Docker 主机上的 uname -a
的结果与 Docker 容器中的结果进行比较来验证这一点。
这很可能是您的
make
以及 apt install
都失败的原因。
我不确定您正在尝试构建的特定模块以及它是否有任何其他依赖项。一般来说,如果 Docker 容器中有内核源代码,则可以在 Docker 容器中构建内核模块。尝试在
apt install
命令中使用特定版本的内核,而不是使用/依赖 uname
命令。然后$ make -C <path_to_kernel_src> M=$PWD
参考我刚刚在另一个问题上发布的this答案。
在 Dockerfile 中,您需要添加适用于您的操作系统的存储库,以提供内核开发资源。
对于我来说,(在 ubi8 上)我首先需要添加 Oracle Linux 8 存储库及其 GPG 密钥:
RUN rpm --import "https://yum.oracle.com/RPM-GPG-KEY-oracle-ol8"
RUN dnf config-manager --add-repo http://yum.oracle.com/repo/OracleLinux/OL8/baseos/latest/x86_64
然后就可以安装开发工具和模块了:
RUN dnf install kernel-devel-$(uname -r) kernel-modules-$(uname -r) elfutils-libelf-devel -y
请注意,这假设主机运行与您为其开发内核模块相同的内核。