如何在编译内核时添加缺乏的固件(以intel wireless 5100 AGN的 iwlwifi 为例)

不知你们在笔记本使用 Linux 时编译内核后无线wifi 能不能用,个人本本是“联想 Y450”一款足够老的本本,配的无线网卡是:linux

 $ lspci | grep Wireless
06:00.0 Network controller: Intel Corporation PRO/Wireless 5100 AGN [Shiloh] Network Connection
git

目前使用的系统为 Linux Mint 17 Qiana (Cinnamon桌面版的,毕竟cinnamon是基于Gnome3 的,与Mate 桌面相比仍是更喜欢Cinnamon 。Mint 用户定制比较多,仍是比较好玩的Linux 发型版)网络

以前在使用Debian 时我记得好像是编译使用了一个比较新的内核后就支持了无线,可是不知道如今为何不能解决,因而只能老老实实安装上系统提示的缺失固件。方法可行,但愿对你有用。
less


1. 无线必备的内核选项

在编译内核时咱们确定须要选择上与 WIFI 相关的内核选项:
long@Jarvis ~ $ lsmod | grep wifi
iwlwifi               147953  1 iwldvm
cfg80211              409394  3 iwlwifi,mac80211,iwldvm
ui


很轻松的就能选上这些:spa

首先选择对应的 WIFI 网卡模块(iwlwifi)及其 DVM 固件支持(iwldvm)日志

-> Device Drivers
  -> Network device support
    -> Wireless LAN
      -> Intel Wireless WiFi Next Gen AGN - Wireless-N/Advanced-N/Ultimate-N (iwlwifi)
        -> Intel Wireless WiFi DVM Firmware support    (iwldvm)
code


再选择上网络的无线协议802.11 API(CFG80211):ci

-> Networking support
  -> Wireless
    -> cfg80211 - wireless configuration API (CFG80211)
资源


以及通用的IEEE的802.11 网络协议栈(mac80211)

-> Networking support
  -> Wireless
    -> Generic IEEE 802.11 Networking Stack (mac80211)


2. 错误状况及其处理办法

理论上,这几项编译上以后此内核应该就支持了 无线功能,可是开机后无线没法使用,在内核报告中,咱们能够清晰的看到:

$ dmesg | grep wifi

[    4.577225] iwlwifi 0000:06:00.0: request for firmware file 'iwlwifi-5000-5.ucode' failed.
[    4.577313] iwlwifi 0000:06:00.0: Direct firmware load failed with error -2
[    4.577318] iwlwifi 0000:06:00.0: Falling back to user helper
[    4.592958] iwlwifi 0000:06:00.0: request for firmware file 'iwlwifi-5000-4.ucode' failed.
[    4.593079] iwlwifi 0000:06:00.0: Direct firmware load failed with error -2
[    4.593084] iwlwifi 0000:06:00.0: Falling back to user helper
......
[    4.594753] iwlwifi 0000:06:00.0: request for firmware file 'iwlwifi-5000-1.ucode' failed.


[    4.594782] iwlwifi 0000:06:00.0: no suitable firmware found!
红色标出来的部分咱们能够看到在系统启动时查询加载固件出问题了,找不到'iwlwifi-5000-5.ucode' 固件,转而内核查找“'iwlwifi-5000-4.ucode' ”,"'iwlwifi-5000-3.ucode' ","'iwlwifi-5000-2.ucode' ","'iwlwifi-5000-1.ucode' ",都加载失败后内核放弃治疗,打印了个没有合适固件,而后就无论无线网卡了。


因此咱们须要在内核中添加无线网卡的固件支持,在网上寻找良方,找到解决办法

1. 首先下载网卡对应的固件文件,并且以前的内核日志也告诉咱们该下载哪一个:内核想查找'iwlwifi-5000-5.ucode' ,再找不到的状况下才转而查找其余的,因此咱们下载'iwlwifi-5000-5.ucode' 足矣。

注: 我使用 git clone git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git 克隆了全部内核目前可能须要的固件的仓库,以备后患,并且很轻松就能够在里面找到我须要的'iwlwifi-5000-5.ucode' 固件。

2. 使用 $ sudo cp iwlwifi-5000-5.ucode /lib/firmware/ 将固件拷贝到“/lib/firmware/” 目录下

3. 编译内核时,按照我下面的修改:

-> Device Drivers
  -> Generic Driver Options  --->
     -*- Userspace firmware loading support                 
     [*]   Include in-kernel firmware blobs in kernel binary
     (iwlwifi-5000-5.ucode) External firmware blobs to build into the kernel binary     # 指定须要加载的固件
     (/lib/firmware) Firmware blobs root directory      # 指定固件所在的(根)目录,与上面选项搭配指定具体固件


其余内核选项照旧,编译后内核就支持无线功能咯,仍是很方便的。此方法对于其余内核须要的固件应该也是有效的。


=====================

此外,在安装Debian 时,缺失这样的固件系统会检测而且通知用因而否插入有固件的可移动盘,在那个时候直接添加上固件应该也是有效的,虽然我还何尝试大笑


本文资源以及方法参考: http://wireless.kernel.org/en/users/Drivers/iwlwifi/?n=downloads