在Linux运维和开发工作中,内核相关组件的安装常常成为一道门槛——尤其是Fedora这类快速迭代的发行版,内核源码和头文件的处理方式跟Ubuntu有很大差异。不少新手照着网上的零散教程折腾半天,结果要么版本不对,要么编译失败。其实只要理清三个核心概念:Kernel Headers(头文件)、Kernel Source(内核源码)以及它们的安装路径,整个过程就能清晰很多。
安装Kernel Headers(头文件)
这个包提供的是编译内核模块所需的最小集——头文件和必要的Makefile。如果你只是想装个驱动或者某些第三方软件,通常情况下Kernel Headers就足够了,不一定非得把完整的源码拉下来。
Kernel Headers通过安装kernel-devel RPM包获得。Fedora默认安装可能不会带它,你可以从DVD、FTP或者YUM在线安装。关键是要确保版本与当前运行的内核匹配,用uname命令先确认一下:
[wisfern@Wisfern ~]$ uname -rm 2.6.32.11-99.fc12.i686.PAE i686
如果你已经通过yum升级过内核,那最好也用yum来安装这个包,省去手动匹配版本的麻烦:
[wisfern@Wisfern ~]$ sudo yum install kernel-PAE-devel
安装Kernel Source(内核源码)
除非你有特别的需求——比如要重新编译整个内核、打自定义补丁,或者深入研究内核代码——否则一般用不到完整的Kernel Source。不过话说回来,即便只是编译模块,Kernel Headers也是必需的,这一点一定要分清。
安装Kernel Source大致分为四个步骤:准备好编译环境、下载目标版本的内核源码(最好与当前内核匹配)、安装SRC.RPM包、用rpmbuild把源码解压成可用的目录结构。注意,整个过程至少需要400MB磁盘空间,提前清理一下。
准备相关的环境
开始之前先装两个工具:rpmdevtools和yum-utils。命令很简单:
su -c 'yum install yum-utils rpmdevtools'
这里有个关键点:安装kernel.src.rpm的过程绝对不能在root用户下进行,否则后面会遇到权限问题。
设置目录
执行以下命令会在当前用户目录下生成rpmbuild目录结构:
rpmdev-setuptree
下载内核源码
利用yum工具可以下载最新的内核源代码。如果仓库里没有更新版本,那就用Fedora默认的内核源码即可:
[wisfern@Wisfern Desktop]# yumdownloader --source kernel
注意--source前面是两个短横线。
安装内核源码
先安装依赖软件:
su -c 'yum-builddep kernel-.src.rpm'
再安装.src.rpm包:
[wisfern@Wisfern Desktop]# sudo rpm -ivh kernel-2.6.32.11-99.fc12.src.rpm 1:kernel ########################################### [100%]
如果安装过程中间出现类似warning: user mockbuild does not exist的错误,说明缺少mockbuild用户和组,手动创建即可:
# groupadd mockbuild # useradd mockbuild -g mockbuild
然后重新安装。
准备内核源码
接下来进入SPECS目录,用rpmbuild将源码解压成可用的状态:
cd ~/rpmbuild/SPECS rpmbuild -bp --target=$(uname -m) kernel.spec
执行完之后,源码会出现在~/rpmbuild/BUILD/kernel-2.6.32目录下。这里有两个重要的子目录:
linux-2.6.32.i686/arch—— 包含了标准kernel.org内核以及Fedora补丁和更新,系统架构与uname -m输出一致(通常是i686)。如果不需要特定架构,也可以让--target=使用noarch。vanilla-2.6.32/—— 只包含标准kernel.org内核,没有Fedora补丁。
Fedora编译和配置内核源码的完整流程,可以在Fedora Wiki中找到更详细的说明。
删除旧内核
Fedora更新频繁,旧内核会越积越多,不仅占用/boot空间,还可能干扰grub启动菜单。清理时千万别图省事直接rpm -e,推荐用yum remove,这样yum会自动帮你更新/boot/grub/menu.lst中的启动项,避免手动修改出错。
操作方法很直观:先查看当前已安装的内核相关包:
[root@localhost ~]# rpm -qa | grep kernel kernel-headers-2.6.32.12-115.fc12.i686 kernel-firmware-2.6.32.12-115.fc12.noarch kernel-PAE-devel-2.6.32.11-99.fc12.i686 kernel-devel-2.6.32.12-115.fc12.i686 kernel-PAE-2.6.32.11-99.fc12.i686 kernel-PAE-devel-2.6.32.12-115.fc12.i686 kernel-PAE-2.6.32.12-115.fc12.i686 kernel-devel-2.6.32.11-99.fc12.i686 abrt-addon-kerneloops-1.0.9-2.fc12.i686
再确认当前使用的内核版本:
[root@localhost ~]# uname -r 2.6.32.12-115.fc12.i686.PAE
比如要删除旧内核kernel-PAE-2.6.32.11-99.fc12.i686,直接执行:
[root@localhost ~]# yum remove kernel-PAE-2.6.32.11-99.fc12.i686
这样就干净利落地清掉了,grub菜单也会同步更新。
