Linux Kernel有一大特性就是模块化,通过kernel module(内核模块,Fedora中缩写作kmod)来扩展内核功能(cf. what is a kernel module?)。最常见的一类内核模块就是驱动程序(driver)。由于许可证或使用规模等原因,一些硬件的驱动无法进入kernel,只能通过内核模块的形式来加载使用。在Fedora中如果你启用了rpmfusion-nonfree源,你会看到大量kmod-打头的软件包,大多都是rpmfusion帮我们编译、打包好的各类私有驱动(比如nvidia、ati的显卡驱动,broadcom的网卡驱动等等)。但是,你也许会注意到,几乎每一个kmod-*软件包都有一个对应的akmod-*软件包,而很多“私有驱动安装教程”都是直接让你把两个都装上。那么,这两个到底有什么区别呢?

让我们以(a)kmod-wl(broadcom无线网卡驱动)为例,看看两个包的summary:

kmod-wl: Metapackage which tracks in wl kernel module for newest kernel
akmod-wl: Akmod package for wl kernel module(s)

再看一下子包,akmod-wl没有子包,而kmod-wl则有大量的子包,和不同版本的内核一一对应(e.g. kmod-wl-2.6.38.7-30.fc15.i686.PAE.i686)。另外,akmod-*依赖akmods软件包,而这个软件包的用途则是:“Automatic kmods build and install tool”。

这下明白了吧?akmod是能够自动编译、安装的kmod。事实上,akmod-foo的rpm包中只包含了一个src包和一个平台spec文件,并没有任何编译好的二进制文件。akmod-foo通过内核安装后脚本(postinst),在每次安装了新内核后检查新内核是否有foo模块,如果没有则调用akmods从src里编译并安装foo模块,以此来及时为新内核提供相应的模块。这和debian系的dkms是一样的(Ubuntu下的私有驱动都是通过dkms来安装的)。

由于内核模块是安装在某个特定的内核上的,当更新内核后必须重新给新内核安装内核模块,因而如何实现自动化的模块安装、管理一直是一个令人头痛的问题。老方法是通过kmod-*这样的metapack来解决,每当出现新内核后,志愿者们为其编译、打包新的kmod,并把这个新的kmod作为kmod-* metapack的子包添加到源中,利用yum update的过程自动将新的kmod下载安装。不过这样的方法有两个问题:一是志愿者们打包新包总是需要一些时间,会有一些延迟;二是如果新内核是用户自定义的而非官方源提供的,就没有相应的kmod了。

解决这些问题的银弹就是akmods系统,通过上文所述的方法来实现自动安装,可以做到自动、及时为所有新内核装上模块。akmods系统从Fedora 9之后开始使用,akmod替代kmod是大势所趋,所以我们在安装私有驱动的时候其实只需要装上相应的akmod包即可了,而不再需要kmod。

参考资料:
http://fedorasolved.org/Members/zcat/akmods
http://forums.fedoraforum.org/showthread.php?t=193301