有时我们在编译好内核后发现自己的网卡驱动没有编译进内核,这时我们应该怎么办呢?是重新把内核编译吗?下面方法是我经过试验,单独编译网卡驱动的方法。不好的地方请大家指出来。 首先要确定自己的网卡型号,可以通过以下三步实现: 1、查看自己网卡的型号 下面以Realtek的网卡驱动为例进行说明 [user@elrepo]$ /sbin/lspci | grep -i Ethernet 04:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 01) [user@elrepo]$ /sbin/lspci -n | grep '04:00.0' 04:00.0 0200: 10ec:8168 (rev 01) Searching for the vendor:device ID pairing of 10ec:8168 shows that kmod-r8168 should work with this Ethernet controller. 2、查看你的硬件对应的需要什么样的驱动:http://elrepo.org/tiki/DeviceIDs 3、对应的硬件驱动下载点:http://elrepo.org/linux/elrepo/el5/i386/RPMS/(此处为RPM包的网卡模块,可能需要为内核打补丁,比较麻烦,我试过了,就不介绍了)。 我的机器是联想B450的笔记本,在经过以上三步后,确定了我的网卡模块为atl1e.ko 下面开始介绍如何从内核源码中分离出代码单独进行编译: 1、首先从内核官网:http://www.kernel.org/中下载比较新的2.6内核的源代码,我下载的是stable(稳定版)的linux-2.6.32.59.tar.bz2 2、将下载的源码解压至我的根目录的work文件夹中,找到对应的网卡驱动目录路径为:/work/linux-2.6.32.59/drivers/net/atl1e,将该目录下的所有文件复制到另一个目录中。 [root@localhost atl1e]#cp ./* /home/atl1e (此处复制到我的home目录atl1e文件夹中) [root@localhost atl1e]#cd /home/atl1e [root@localhost atl1e]# ls atl1e_ethtool.c atl1e_hw.c atl1e_main.c Makefile atl1e.h atl1e_hw.h atl1e_param.c 将其中的Makefile中的内容改为如下:
ifeq ($(KERNELRELEASE),) KERNELDIR ?=/work/linux-2.6.32.59 PWD := $(shell pwd) modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules modules_install: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install clean: rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order Module* .PHONY: modules modules_install clean else obj-m := atl1e.o atl1e-objs := atl1e_main.o atl1e_hw.o atl1e_ethtool.o atl1e_para m.o (此处解释一下,如果一个目录文件依赖多个文件生成那么就得写成obj-m :=target.o target-objs := file1.o file2.o …) endif 接着执行make [root@localhost atl1e]# make 此时出现如下情况: make -C /work/linux-2.6.32.59 M=/home/atl1e modules make[1]: Entering directory `/work/linux-2.6.32.59' ERROR: Kernel configuration is invalid.
include/linux/autoconf.h or include/config/auto.conf are missing. Run 'make oldconfig && make prepare' on kernel src to fix it. WARNING: Symbol version dump /work/linux-2.6.32.59/Module.symvers is missing; modules will have no dependencies and modversions. scripts/Makefile.build:44: /home/atl1e/Makefile: 没有那个文件或目录 make[2]: *** 没有规则可以创建目标“/home/atl1e/Makefile”。 停止。 make[1]: *** [_module_/home/atl1e] 错误 2 make[1]: Leaving directory `/work/linux-2.6.32.59' make: *** [modules] 错误 2 按提示进入到/work/linux-2.6.32.59目录中依次执行make oldconfig ; make prepare命令。 没有报错,再回到刚刚编译的目录中,激动的再次执行make。此时出现如下错误:
make -C /work/linux-2.6.32.59 M=/home/atl1e modules make[1]: Entering directory `/work/linux-2.6.32.59' WARNING: Symbol version dump /work/linux-2.6.32.59/Module.symvers is missing; modules will have no dependencies and modversions. CC [M] /home/atl1e/atl1e_main.o CC [M] /home/atl1e/atl1e_hw.o CC [M] /home/atl1e/atl1e_ethtool.o CC [M] /home/atl1e/atl1e_param.o LD [M] /home/atl1e/atl1e.o Building modules, stage 2. MODPOST 1 modules /bin/sh: scripts/mod/modpost: 没有那个文件或目录 make[2]: *** [__modpost] 错误 127 make[1]: *** [modules] 错误 2 make[1]: Leaving directory `/work/linux-2.6.32.59' make: *** [modules] 错误 2 这是因为在内核源码中没有执行make scripts操作。好吧,再次回到/work/linux-2.6.32.59目录中,执行:make scripts
[root@localhost linux-2.6.32.59]# make scripts HOSTCC scripts/genksyms/genksyms.o SHIPPED scripts/genksyms/lex.c SHIPPED scripts/genksyms/parse.h SHIPPED scripts/genksyms/keywords.c HOSTCC scripts/genksyms/lex.o SHIPPED scripts/genksyms/parse.c HOSTCC scripts/genksyms/parse.o HOSTLD scripts/genksyms/genksyms CC scripts/mod/empty.o HOSTCC scripts/mod/mk_elfconfig MKELF scripts/mod/elfconfig.h HOSTCC scripts/mod/file2alias.o HOSTCC scripts/mod/modpost.o HOSTCC scripts/mod/sumversion.o HOSTLD scripts/mod/modpost HOSTCC scripts/selinux/mdp/mdp HOSTCC scripts/kallsyms HOSTCC scripts/pnmtologo HOSTCC scripts/conmakehash 此时再回到编译目录执行make后终于生成了atl1e.ko
[root@localhost atl1e]# make make -C /work/linux-2.6.32.59 M=/home/atl1e modules make[1]: Entering directory `/work/linux-2.6.32.59' WARNING: Symbol version dump /work/linux-2.6.32.59/Module.symvers is missing; modules will have no dependencies and modversions. CC [M] /home/atl1e/atl1e_main.o CC [M] /home/atl1e/atl1e_hw.o CC [M] /home/atl1e/atl1e_ethtool.o CC [M] /home/atl1e/atl1e_param.o LD [M] /home/atl1e/atl1e.o Building modules, stage 2. MODPOST 1 modules CC /home/atl1e/atl1e.mod.o LD [M] /home/atl1e/atl1e.ko make[1]: Leaving directory `/work/linux-2.6.32.59'
[root@localhost atl1e]# ls atl1e_ethtool.c atl1e.h atl1e_hw.h atl1e.ko atl1e_main.o atl1e.mod.o atl1e_param.c Makefile Module.symvers atl1e_ethtool.o atl1e_hw.c atl1e_hw.o atl1e_main.c atl1e.mod.c atl1e.o atl1e_param.o modules.order 3、加载驱动到内核
好了,驱动模块到此已经编译生成了,这比编译一个内核源码要省时间的多吧。下面就将驱动模块加载进内核。 4.模块测试 内核模块编译完成后,就要测试能否正常运行,因为我们已经运行depmod -a,所以直接以modprobe进行模块的加载. 1.加载模块测试 modprobe atl1e.o 注意,不要写完整的名称,.o不需要写.rhinefet就是刚刚编译出来的rhinefet.o. lsmod 2.设置开机加载摸块 就是编辑/etc/modules.conf 在文件中加入下面一行: alias eth0 atl1e 3.重新启动,看是否正常启动模块 #reboot 上面我们使用的是rhinefet模块,如果不是这个名称,就请依你的实际情况来修改.接下来就是测试这个网卡是否正常工作.
后记:编译内核步骤: 1、拷贝配置文件 #cp arch/x86/configs/x86_64_defconfig /home/linux-2.6.32.59/.config #make menuconfig #make #make modules_install #make install |