关于这方面的信息非常稀少。关于我是否可以在docker容器中执行depmod
、insmod
、rmmod
和modprobe
之类的操作,有哪些权威来源?
这假设容器运行的是完全相同的Linux(当然是内核方面的,但在构建模块时,内核标头也与加载的内核标头完全相同(。
我的容器需要设备可以访问,我已经从容器中玩过docker run --privileged
、--device
、mknod
,其他一些操作没有抱怨,我可以在日志中看到这些事情正在发生,但我想确保这不是错误的做法。
您不能(*(。
Docker有两个主要的设计目标:
-
容器可以在很大程度上独立于其主机系统运行;您可以在带有GNU libc的Fedora主机上运行带有musl-libc的Alpine容器。但是内核模块对于它们所编译的内核来说是非常特殊的。如果一个例行的主机系统更新向内核添加了一个供应商补丁,它会破坏您的映像。
-
在没有明确授予权限的情况下,容器不应该能够访问自己容器之外的内容。内核模块可以绕过所有内容——文件系统权限、容器边界、用户ID——因此,即使容器进程以root身份运行,容器通常也不允许运行
insmod
和类似命令。
如果您的进程需要访问主机设备并加载自定义内核模块,并且通常与Docker的隔离系统不兼容,那么最好直接在主机上运行,而不是在容器中运行。
(*(。。。好吧,如果在启动时从主机绑定挂载内核头并为当前运行的内核构建一个模块,并且容器正在运行--privileged
,那么可以。(您可能只需要--cap-add SYS_MODULE
。(但是,与只运行主机根进程相比,此路径要复杂得多,而且并不安全。