环境:Ubuntu14.4 以及7G的磁盘空间
因为编译后的内核会很大,所以要预留7G的空间
1、前期准备,到如下网址下载需要编译的linux-2.6的内核,我选的是linux-2.6.32.27.tar.bz2
2.6.32.X:其中X选择最大数字的,应为最大数字的就不需要打补丁了。
https://mirrors.edge.kernel.org/pub/linux/kernel/v2.6/
需要的gcc编译器版本,V4.8
2、切换到root用户(怎么切换自行百度),将下载的内核解压到/usr/src目录下,使用tar -xvf 压缩包名 -C 解压到目标个目录
首先进入到内核压缩包所在的目录。 在命令行:tar -xvf linux-2.6.32.27.tar.bz2 -C /usr/src
3、进入解压后的内核源码文件夹。
在命令行:cd /usr/src/linux-2.6.32.27/
4、安装一些必要的依赖包。
apt-get install build-essential kernel-package libncurses5-dev
5、执行配置命令。执行make config 或者make menuconfig,不知道要选什么的话可以默认,可能编译的时间会长一些,如果是menuconfig的话,采用默认配置,直接选择最后的save选项,默认的.config不需要更改,保存后选择exit。清理操作简介:
#make clean: 清理大多数编译生成的文件,但会保留config文件等;
#make mrproper: 清理所有编译生成的文件、config及某些备份文件;
#make distclean: 清理mrproper、patches以及编辑器备份文件。
6、执行完配置命令之后,可以执行:make mrproper (清除以前曾经编译过的旧文件,第一次编译,可不执行) 或者make clean,这行这个命令只会删除以前编译过的一些中间文件,不会删掉一些配置文件;
7、开始编译。
命令行执行:make
编译过程遇到的问题:
(1)gcc: error: elf_x86_64: 没有那个文件或目录
gcc: error: unrecognized command line option ‘-m’
解决的办法是在arch/x86/vdso/Makefile中做一些修改:VDSO_LDFLAGS_vdso.lds 开头所在行的 "-m elf_x86_64" 替换为 "-m64"。将以 VDSO_LDFLAGS_vdso32.lds 开头所在行的 "-m elf_386" 替换为 "-m32"。 这么修改之后就没问题了。
(2)drivers/net/igbvf/igbvf.h:129:15: error: duplicate member'page'。按照提示的错误说是drivers/net/igbvf/igbvf.h中的第129行,打开文件看到第129行和第124行重复了struct page*page,因为这两行代码都定义在内部的一个结构体中,这是不允许重复的。解决办法:drivers/net/igbvf/igbvf.h中修改129行的structpage *page为struct page *pagep即可。
(3)compiler-gcc5.h:No such file解决办法:将附件compiler-gcc5.h放入/linux-2.6.34/include/linux中。
(4)Can't use 'defined(@array)' (Maybe you should just omit thedefined()?) at kernel/timeconst.pl line 373.。解决办法:将/linux-2.6.34/kernel/timeconst.pl中第373行的defined()去掉只留下@val
(5)安装好之后重启如果出现无法启动内核等错误则在原来的内核中打开终端依次输入下面指令,虽然有点长,但验证没问题,不然重启停留在initramfs处无法启动,这种情况说是磁盘受损,我上网查了很多资料,参考别人的做法都不行,逐条输入下面指令之后重启完美解决。(linux的版本是自己安装的版本,别复制了版本都忘了改,下图为重启遇到的initramfs的问题。注意输入指令的一些空格问题,最好直接复制在修改版本号即可。)
sudo su
cd /boot
cp initrd.img-2.6.34 initrd-2.6.34.old (备份)
depmod -a
update-initramfs -k 2.6.34 -c
cd /tmp
gzip -dc /boot/initrd.img-2.6.34| cpio -id
touch lib/modules/2.6.34/modules.dep
find ./ | cpio -H newc -o > /boot/initrd.img-2.6.34.new
gzip /boot/initrd.img-2.6.34.new
cd /boot
mv initrd.img-2.6.34.new.gz initrd.img-2.6.34
(6)注意事项:由于ubuntu16.04一些依赖项目版本过高,可能导致安装内核成功后,出现缺失模块无法正常启动,建议使用ubuntu14.04编译安装,或者直接使用ubuntu10/ubuntu12编译内核。
(7)可能会在make menuconfig之后执行了make clean 或者make mrproper,然后可能会提示如下错误。解决的办法是再重新执行make mrproper应该就可以了,这个也可以多多参考别人优秀的做法。
8、执行sudo make modules_install install,这部应该是可以直接编译和安装模块,就不需要先make modules(编译内核)再make modules_install(安装内核)了。
9、执行make stall安装内核;
10、创建 initrd文件:mkinitramfs -o/boot/initrd.img-2.6.34;
11、配置grub引导。
执行命令gedit /etc/default/grub,配置/etc/default/grub文件在文件中添加GRUB_TIMEOUT_STYLE=menu,GRUB_HIDDEN_TIMEOUT=0改为大于0的数即可,或者直接就添加GRUB_TIMEOUT_STYLE=menu,保存退出(一般两种方式都可以),执行命令update-grub;执行完这一步基本上就完成了内核的编译和安装,重启ubuntu应该就行了。