在构建内核源码树之前首先要明确的就是需要在什么内核版本下编译模块,这点非常重要,因为即使小版本的不同也会导致模块编译后无法在运行环境下加载。通常使用uname命令查看当前内核版本。
uname -m
确定内核版本后,虽然总体思路大同小异,但是不同distribution在实际操作上还时有所不同,下面只对Ubuntu14.04下构建过程进行介绍,由于联网环境下对依赖包的获取和安装相对容易,这里着重介绍不联网时的解决方法。
- Ubuntu14.04
(1)安装依赖包
安装编译内核所需要的软件 build-essential、autoconf、automake、cvs、subversion,在make menuconfig时会提示缺少libncurses-dev
联网时,通过apt-get install libncurses5-dev安装
离线时,http://packages.ubuntu.com/搜索并下载,其他依赖包同样可以到这个网址下载,但要注意架构类型和版本要与实际环境和提示的一致。
(2)查看可内核源代码
sudo apt-cachesearch linux-source
会查看到可下载的linux-source源码包,通常时类似下面列出的两个选项
linux-source -Linux kernel source withUbuntu patches
linux-source-2.6.32- Linux kernel sourcefor version 2.6.32 with Ubuntu patches
(3)下载内核源代码
根据需要选择相应的版本进行下载,例如下载linux-source,则使用
sudo apt-get installlinux-source下载
在离线时通过其他相同内核版本的联网系统进行下载后拷贝,务必确保版本一致,通常Ubuntu的下载目录在/usr/src下,当下载内核版本与当前内核版本不同时,将会在/usr/src下产生与下载内核版本号一致的名称中带header
的文件夹,在实际操作中没有产生这样的文件夹,本人分析认为是因为所下载的内核版本号虽然不一致,但是由于Ubuntu进行修改所致,而原有的header文件夹与下载内核所需要的其实是一致的。
(4)解压内核源代码
在成功下载内核源代码后,会在/usr/src下得到一个类似linux-source-2.6.32.tar.bz2形式的压缩包,将该压缩包解压
sudo tar–jxvf linux-source-2.6.32.tar.bz2
为了操作方便,可以给源码目录建立一个软连接:
sudoln–s linux-source-2.6.32 linux
(5)配置内核
在内核配置这个环节,有很多方式,主要是指定在安装内核时需要哪些功能,不需要哪些功能。对于内核功能理解不够深入的就采取简单一点的方法,本人就常采用导入原来的内核配置的方式。
sudo cp ../linux-headers-2.6.32-34-generic/.config ./.config
需要注意的是在linux-headers-2.6.32-34-generic目录下查看文件列表时,可能看不到.config文件,因为 .开头的文件是隐藏的,要用 ls–a才能看到。使用配置界面的方式导入配置。
make menuconfig
通常也是在这步提示缺少 libncurses5-dev,安装方式步骤(1)已经说明。
在配置界面下,选择load a kernelconfiguration保存,然后在选择save akernel configuration再保存退出,并退出。需要说明的是配置界面中*表示静态编译到内核,[ ]表示不编译,[M]表示编译为模块。这点在加载brd.ko的过程中遇到问题,如果编译到内核后再通过insmod或者modprobe加载会提示已加载,试图移除会提示built-in模块。
(6)编译内核
make bzIme
编译成功后会/boot下创建vmlinuz开头的文件,当然编译可能会报错,这时就需要根据提示排错后再重新编译。
(7)编译模块
make modules
步骤(6)(7)可以通过make命令一起执行,根据需要使用。
编译过程非常漫长,需要耐心等待,在使用make时,如果机器是多核的,可以指定多个任务。
查看cpu核数
cat /proc/cpuinfo| grep "cpucores"| uniq
make jN
N通常设为cpu核数加1,可以加块编译速度,通常在具有多核处理器的服务器上采用此操作。
(8)安装模块
make modules_install
模块的安装其实就是将编译好的模块复制到/lib/modules下
(9)升级启动内核
make install
如果需要启动后进入新内核,执行此步,是通过修改/etc/grub.conf等三个文件实现。