在 docker 容器内制作/构建内核模块

问题描述 投票:0回答:3

我目前的主机系统运行带有 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 容器中构建内核模块?

谢谢!

docker linux-kernel kernel-module
3个回答
0
投票

也许为时已晚,但为了在容器内构建内核模块,您应该以 --priviliged 模式执行容器。

除了依赖项 kernel-devel 和 kernel-headers 之外,还应该针对您的特定内核版本构建内核,因此您应该创建一个卷来将 host:/lib/modules 链接到 your_container:/lib/modules。

一个好的起点应该是 https://projectatomic.io/blog/2018/06/building-kernel-modules-with-podman/


0
投票

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答案。


0
投票

在 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

请注意,这假设主机运行与您为其开发内核模块相同的内核。

© www.soinside.com 2019 - 2024. All rights reserved.