关键字:内核升级 无线网卡驱动
————————————————————背景——————————————————————
前几天上《Linux内核分析及驱动编程》的时候,老师布置了一项作业——安装Linux发行版系统,下载Linux内核,编译、配置和安装内核,配置启动文件。
本身机器上已经安装了Ubuntu11.10(内核版本3.0.0.16-generic),好,拿着同学的一份实验报告过来,照着命令一路欢乐的敲,经过长时间的编译、配置、安装,然后更新grub,成功加载了新内核3.2.9。果断重启,结果发现不能无线上网了,点击网络连接那里,根本就没有搜索周围的无线网络。然后上网各种查,发现资料挺多,但是太杂乱,而且多是一篇抄一篇的,版本也基本是比较早期的,看来看去,自己也按照那些帖子、博客的方法解决来解决去,依然无果。
后来,看到了一本O‘REILLY出的书《LINUX内核技术手册》,翻了一下,好像正好是关于构建和定制内核的,想着有可能能解决前面打问题。
新书慢慢看,今天翻到网络驱动这块,抱着试一试的心情,一顿捣鼓,好之。现在我的Ubuntu已经能够无线上网了。打算把配置过程写下来,方便以后选了这门课又不幸遇到同样问题的小学弟小学妹。
———————————————————————割———————————————————————
第一,找到你的无线网卡的驱动
首先,回到你安装的开发版Ubuntu(内核3.0.0.16-generic),因为你升级以后的内核不是没有驱动嘛,现在就回以前版本去找驱动。
这是我升级内核前的版本,如下图
或者也可以在系统监视器里查看内核版本等信息
然后,逆向的从网络连接名中找出控制它的PCI设备。要做到这一点,请查看各种网络连接名称,
在终端中输入:
$ ls /sys/class/net/
如图所示(我们默认以后命令都以截图方式给出,懒得复制出来了。。。)
lo目录代表的是网络回环设备,它没有连接到任何真正的网络设备。eth0、wlan0目录是你应该注意的,它们代表了真正的网络设备。
可以使用ifconfig工具,进一步查看并找出你所关心的网络设备
从这个列表的以下几行可以看出,wlan0是活动的并处于工作状态的网络设备:
该输出表明这是一个分配了有效IP(inet)地址的以太网设备。现在我们已经找到了wlan0这个设备,为了使它能在新内核中工作,我们需要找出控制此设备的驱动程序。在sysfs文件系统中跟踪链接是很简单的,用一条简单的命令就可以:
该输出表明模块iwlagn(如果你的模块名字不是这个,没有关系,下面遇到相关命令的时候对应替换就行)正在控制wlan0网络设备。Basename命令将完成以下步骤(可以不用管,这里只是给想了解的同学详细列一下)
a. 跟踪符号链接/sys/class/net/wlan0/device进入包含wlan0设备信息文件的/sys/device/目录下。请注意,在新版本内核中/sys/class/net/wlan0可能也是一个符号链接。
b.在sysfs目录下描述该设备的子目录中,有一个绑定到这个设备驱动的符号链接driver,因此我们跟踪这个链接。
c.在sysfs目录下描述该设备的子目录中,有一个到包含这个驱动的模块的符号链接module。我们要的就是这个符号链接的目标。可以通过readlink命令得到它,输出像这样
d.由于我们只关心模块的名称,要去掉readlink输出中的多余路径,只留下最右面的部分(模块名称)。这是basename命令所做的工作。直接传递路径给basename,它将输出:
所以,我们把readlink输出的一级级的符号链接所指的路径,传递给basename程序,使整个处理过程只用一行就能完成。
——————————————————————不用管结束———————————————————
第二,找到驱动模块对应的配置选项
现在我们已经得到了模块名称,还需要找到控制它的内核配置选项。
进入到你的linux内核目录。应该是/usr/src/目录下的。
查看具体配置信息。
如果你的模块名字不是“iwlagn”,将其替换为你要找的模块名字即可。
接着在上面find命令的输出中找出那些含有CONFIG_的行。它们就是构建模块需要启用的配置选项。在上图中
CONFIG_IWLWIFI_DEBUGFS
CONFIG_IWLWIFI_DEVICE_TRACING
CONFIG_IWLWIFI_DEVICE_SVTOOL
就是你要找的配置选项,现在有了配置内核所需的信息。运行菜单配置工具:
然后按下/键(这会启动搜索)并键入要配置的选项,去掉CONFIG_ 部分字符串。如下图所示(以CONFIG_IWLWIFI_DEBUGFS 为例,后面两个雷同)。
搜索之。
搜索结果,如下图所示。
该图显示出的就是你所寻找的。Location中的信息告诉你要把模块iwlagn构建到内核中,下面的配置选项必须启用:
第三,配置新内核
进入你下载的新内核解压后的目录,我的是在/home/david/ss.pku/linux-3.2.9目录下的
然后运行菜单配置工具进行配置,sudo make menuconfig,按照上面的路径,去把相应模块选中,即
方括号中选上*(“如上图的【*】”)
第四,重新编译、安装新内核
安装模块
安装内核
不用担心会重新编译全部的内核,make会查找哪些做出了更改。
小技巧:如果你的CPU是双核,或者4核,那么在make的时候,你可以采用sudo make install -j4或者sudomake install -j8命令,这样可以充分利用你的CPU资源(核的数目*2就行,默认是单核 -j2),可以大大降低内核编译安装的速度。
sudo make install -j8命令会把编译文件夹的“arch/x86/boot/bzImage”文件复制到“/boot”,同时还会复制 config 和 System.map 文件,最终在“/boot”会多出如下4个文件:
/boot/config-3.2.9
/boot/System.map-3.2.9
/boot/vmlinuz-3.2.9
/boot/initrd.img-3.2.9
输入命令update-grub,更新grub
重启,输入-uname-a,或者gnome-system-monitor可以看到加载了新内核,并且无线网卡已经驱动起来了,可以无线上网了。