编辑:我将 Cristians 的回答变成了一个脚本,可以自动完成所有操作:https://github.com/frans-fuerst/magic/blob/master/fedora-activate-can.sh
我需要一些 Linux 源中可用但在 Fedora 20 上停用的内核模块,我想知道使它们可用的最简单和最前卫的方法是什么。(即 net/CAN 支持导致一些 can_* 模块)
- 是否有 fedora-repos/rpms 可以使已停用的模块可用?
- 或者我必须手动编译这些模块?
- 在这种情况下 - 在内核更新的情况下是否存在某种机制可以自动执行此操作,或者我是否必须一遍又一遍地编译它们?
我已经关注这HowTo(还有很多非常相似的),但是“仅构建模块“部分似乎只对未被禁用的模块起作用,因为在这种情况下甚至模块源也丢失了。
这是我尝试过的继上述如何:
首先我尝试遵循树外模块部分,但在随附的该死的源代码树中,kernel-devel
甚至缺少 CAN 支持的源代码。因此,我尝试从 src.rpm 构建模块:
$ yumdownloader --source kernel
$ sudo yum-builddep kernel-3.14.8-200.fc20.src.rpm
$ rpm -Uvh kernel-3.14.8-200.fc20.src.rpm
$ cd ~/rpmbuild/SPECS
$ rpmbuild -bp --target=$(uname -m) kernel.special
$ cd ~/rpmbuild/BUILD/<kerneldir>/<linuxdir>
$ <configure the kernel using menuconfig>
$ make prepare
然后我构建并收到一些警告:
$ make -C /lib/modules/`uname -r`/build M=`pwd`/net/can modules
make: Entering directory `<rpmbuild-BUILD-kernel-linux-dir>'
WARNING: Symbol version dump <rpmbuild-BUILD-kernel-linux-dir>/Module.symvers
is missing; modules will have no dependencies and modversions.
CC [M] <rpmbuild-BUILD-kernel-linux-dir>/net/can/bcm.o
CC [M] <rpmbuild-BUILD-kernel-linux-dir>/net/can/gw.o
CC [M] <rpmbuild-BUILD-kernel-linux-dir>/net/can/raw.o
CC [M] <rpmbuild-BUILD-kernel-linux-dir>/net/can/af_can.o
CC [M] <rpmbuild-BUILD-kernel-linux-dir>/net/can/proc.o
LD [M] <rpmbuild-BUILD-kernel-linux-dir>/net/can/can.o
LD [M] <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-raw.o
LD [M] <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-bcm.o
LD [M] <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-gw.o
Building modules, stage 2.
MODPOST 4 modules
CC <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-bcm.mod.o
LD [M] <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-bcm.ko
CC <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-gw.mod.o
LD [M] <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-gw.ko
CC <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-raw.mod.o
LD [M] <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-raw.ko
CC <rpmbuild-BUILD-kernel-linux-dir>/net/can/can.mod.o
LD [M] <rpmbuild-BUILD-kernel-linux-dir>/net/can/can.ko
make: Leaving directory `<rpmbuild-BUILD-kernel-linux-dir>'
$ sudo make -C /lib/modules/`uname -r`/build M=`pwd`/net/can modules_install
make: Entering directory `<rpmbuild-BUILD-kernel-linux-dir>'
INSTALL <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-bcm.ko
Can't read private key
INSTALL <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-gw.ko
Can't read private key
INSTALL <rpmbuild-BUILD-kernel-linux-dir>/net/can/can-raw.ko
Can't read private key
INSTALL <rpmbuild-BUILD-kernel-linux-dir>/net/can/can.ko
Can't read private key
DEPMOD 3.14.8
make: Leaving directory `<rpmbuild-BUILD-kernel-linux-dir>'
我刚运行时并没有收到第一次警告make modules
,但这花费了我大约一个小时的时间。
但是安装后,.ko
文件位于错误的目录中(/usr/lib/modules/3.14.8
而不是/usr/lib/modules/3.14.8-200.fc20.x86_64
),之后depmod -a
我modprobe can
得到了
modprobe: ERROR: could not insert 'can': Exec format error
我究竟做错了什么?
答案1
我认为我已经明白了,尽管它可能还不够完美。
通过运行准备源代码
rpmbuild -bp --target=$(uname -m) kernel.spec
转到构建目录,例如通过:
cd ~/rpmbuild/BUILD/kernel-3.14.fc20/linux-3.14.8-200.fc20.x86_64
编辑
Makefile
并设置EXTRAVERSION
为如下内容:EXTRAVERSION = -200.fc20.x86_64
启用模块。我建议从
configs
目录下的相应文件开始(我使用了kernel-3.14.8-x86_64.config
)。为模块准备内核:
make modules_prepare
构建模块:
make M=drivers/net/can
获利!插入模块:
insmod can-dev.ko
答案2
为了完整起见,这里列出了使 CAN 模块(或任何其他模块)可用所需的完整步骤列表,该模块已在 Fedora 上被禁用(删除源,因此仅使用 kernel-devel-approach 无法做到这一点)。
这个过程可能并不完美,但是对我来说它很有用,并且可以在 Fedora 上启用peak_usb
和
vcan
基于 CAN 模块。
我很欣赏并很荣幸能有所改进,因为我必须经常这样做。
你可能想现在就更新你的内核,这样就不用再更新了
sudo yum update reboot
准备、获取和安装 Fedora 内核源代码树
rpmdev-setuptree yumdownloader --source kernel sudo yum-builddep kernel-3.14.8-200.fc20.src.rpm rpm -Uvh kernel-3.14.8-200.fc20.src.rpm cd ~/rpmbuild/SPECS rpmbuild -bp --target=$(uname -m) kernel.spec
编辑
Makefile
并设置EXTRAVERSION
为如下内容:cd ~/rpmbuild/BUILD/kernel-3.14.fc20/linux-3.14.8-200.fc20.x86_64 EXTRAVERSION = -200.fc20.x86_64
首先获取基本配置来配置内核,例如
cp /boot/config-3.14.8-200.fc20.x86_64 .config
或者
cp configs/kernel-3.14.8-x86_64.config .config
并通过激活所需的模块来配置它,例如
make menuconfig
构建模块
make modules_prepare make M=net/can modules make M=drivers/net/can modules
安装和加载
sudo make M=net/can modules_install sudo make M=drivers/net/can modules_install sudo depmod -a sudo modprobe can