第一步:下载内核
从哪里获取内核源码?官方渠道有对应的下载地址。这里以3.2.84版本为例,直接下载对应的压缩包即可。
第二步:解压编译内核
下载的是.tar.xz格式的文件,直接用tar命令可能无法解压,因为系统可能缺少xz解压工具。需要先搞定这个依赖。
1. 安装xz解压工具
如果系统里没有xz,先下载xz-5.0.3.tar.bz2,然后解压并安装:
tar -jvxf xz-5.0.3.tar.bz2 cd /opt/xz-5.0.3 # 进入解压后的文件夹 ./configure make make install
2. 解压内核源码
xz -d linux-3.2.84.tar.xz tar -xvf linux-3.2.84.tar
3. 清理残留文件(第一次编译可跳过)
如果之前编译过其他内核,建议先清理一下。不同清理指令的作用要搞清楚:
make clean:删除大部分编译生成文件,但保留配置文件.config和编译支持。make mrproper:删除所有编译生成文件、内核配置文件以及各种备份文件。make distclean:在mrproper基础上,再删掉编辑备份文件和补丁文件。
第一次编译的话,可以跳过这一步(不过最好还是先执行make mrproper,确保环境干净)。
4. 搭建编译环境
需要安装gcc、ncurses库和openssl开发包:
yum -y install gcc yum install ncurses ncurses-devel yum install openssl-devel
5. 配置内核参数
对于刚入门的朋友,手动配置可能有点懵。图省事的话,可以用make localmodconfig命令,它会以当前系统已有的.config文件为基础,自动选择模块。可以参考论文《嵌入式linux系统的裁剪优化和测试技术》。一直回车直到结束即可。然后运行make menuconfig进入图形菜单,把Kernel hacking下的Sample...选项取消勾选(具体名称记不太清了,找到类似选项去掉就行),退出保存。接着编辑.config文件,找到CONFIG_SYSFS_DEPRECATED这一行,默认被注释掉了(not set),将其改为CONFIG_SYSFS_DEPRECATED=y。后面可能还有别的参数需要调整,到时候再说。
6. 编译新内核
make bzImage && make modules && make modules_install
7. 安装内核
编译完成后,直接安装即可。
8. 常见问题:时钟错误警告
编译时可能会遇到这样的警告:make:警告:检测到时钟错误。您的创建可能是不完整的。解决办法很简单:find . -type f -exec touch {} \;,然后重新编译。
9. 处理initrd镜像
这一步稍微有点绕,但跟着做就好:
解压initrd文件:
cp /boot/initrd-3.2.84.img /tmp cd /tmp/ mkdir newinitrd cd newinitrd/ zcat ../initrd-2.6.30.4.img | cpio -i
解压后会看到以下内容:
bin dev etc init lib proc sbin sys sysroot
编辑init文件:删除其中重复的四行中的两行(内容是加载dm-region-hash.ko模块的echo和insmod命令)。
重新打包initrd:
find . | cpio -c -o > ../initrd cd .. gzip -9 < initrd > initrd.img
生成的initrd.img就是重新打包后的文件。
复制到/boot并修改grub配置:
- 复制:
cp initrd.img /boot - 编辑/etc/grub.conf,将原来的
initrd-3.2.84.img改为initrd.img
重启系统:别忘了在启动时选择新编译的内核,别选错了。
