基于ubuntu14.04下编译linux-2.6.34版本内核的步骤和遇到的一些问题及解决

时间:2021-04-16 16:31:48

1、先在终端查询自己的gcc版本和ubuntu版本,然后到官网http://www.kernel.org/下载所需的内核版本,当然还可以从终端直接下载,可能会慢点,具体的怎么操作可以到网上查一查;


2、将下载的内核解压到/usr/src目录下,不是一定但建议解压到里面,使用tar -xvf +压缩包名或者tar -xzvf +压缩名都行,可能有些只支持其中一种,压缩包名比如linux-2.6.34.tar.gz(看你下载的内核压缩包名字即可);如果下载不是放在/usr/src/中的话,先从终端进入下载的内核压缩包所在的目录,将其移动到/usr/src/目录下,执行语句移动: mv linux-2.6.34.tar.gz /usr/src/  。(linux此篇文章默认的linux-2.6.34.tar.gz,按自己的版本来,下同)。


3、进入解压后的内核源码文件夹。cd  /usr/src/yourname/Desktop/linux-2.6.34


4、接下来的步骤可能基本都要在超级用户的模式下进行,在终端输入sudo su按提示输入密码即可,然后最好安装一些必要的依赖包。apt-get install build-essential kernel-package libncurses5-dev由于ubuntu16.04的gcc版本版本过高,容易导致error:undeclared (first use inthis function),建议使用apt-get install gcc-4.8,安装完成后执行ln –sf gcc-4.8 gcc替换掉系统默认gcc。


5、执行配置命令。执行make config 或者make menuconfig,不知道要选什么的话可以默认,可能变异的时间会长一些,如果是menuconfig的话,采用默认配置,直接选择最后的save选项,默认的.config不需要更改,保存后选择exit。清理操作简介:

#make clean: 清理大多数编译生成的文件,但会保留config文件等;

#make mrproper: 清理所有编译生成的文件、config及某些备份文件;

#make distclean: 清理mrproper、patches以及编辑器备份文件。


6、执行完配置命令之后,可以执行:sudomake mrproper (清除以前曾经编译过的旧文件,第一次编译,可不执行) 或者make clean,这行这个命令只会删除以前编译过的一些中间文件,不会删掉一些配置文件;


7、完了之后开始编译过程,直接make 或者sudo make,编译可能回话一两个小时甚至更久,中途也坑能会遇到各种问题,下面再说;


8、执行sudo make modules_install install,这部应该是可以直接编译和安装模块,就不需要先make modules(编译内核)再make modules_install(安装内核)了,博主我之前按网上教程这么做但安装完虚拟机季候可能会出现重启时一直就停在initramfs那儿的情况,身边好几个人也是,都按着sudo make modules_install install来基本都解决了;


9、执行make stall安装内核;(8跟9好像可以交换顺序,不过建议还是先安装模块在安装内核吧。)


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应该就行了。下面总结一下这个过程中可能会遇到的一些问题和解决方法。


(1)objcopy: 'arch/x86/vdso/vdso.so.dbg': No such file或者是提示gcc: error :elf_x86_64: 没有那个文件或目录,这个可能的原因是高版本的ubuntu跟低版本的内核不兼容。解决的办法是在arch/x86/vdso/Makefile中做一些修改:VDSO_LDFLAGS_vdso.lds 开头所在行的 "-m elf_x86_64" 替换为 "-m64"。将以 VDSO_LDFLAGS_vdso32.lds 开头所在行的 "-m elf_386" 替换为 "-m32"。  这么修改之后就没问题了。

基于ubuntu14.04下编译linux-2.6.34版本内核的步骤和遇到的一些问题及解决基于ubuntu14.04下编译linux-2.6.34版本内核的步骤和遇到的一些问题及解决

基于ubuntu14.04下编译linux-2.6.34版本内核的步骤和遇到的一些问题及解决基于ubuntu14.04下编译linux-2.6.34版本内核的步骤和遇到的一些问题及解决


(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即可。

基于ubuntu14.04下编译linux-2.6.34版本内核的步骤和遇到的一些问题及解决基于ubuntu14.04下编译linux-2.6.34版本内核的步骤和遇到的一些问题及解决基于ubuntu14.04下编译linux-2.6.34版本内核的步骤和遇到的一些问题及解决


(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的问题。注意输入指令的一些空格问题,最好直接复制在修改版本号即可。)

基于ubuntu14.04下编译linux-2.6.34版本内核的步骤和遇到的一些问题及解决基于ubuntu14.04下编译linux-2.6.34版本内核的步骤和遇到的一些问题及解决

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应该就可以了,这个也可以多多参考别人优秀的做法。

基于ubuntu14.04下编译linux-2.6.34版本内核的步骤和遇到的一些问题及解决基于ubuntu14.04下编译linux-2.6.34版本内核的步骤和遇到的一些问题及解决基于ubuntu14.04下编译linux-2.6.34版本内核的步骤和遇到的一些问题及解决


经过个这个看似漫长而复杂看似枯燥但其实有挺有趣的过程,结合可能会出现的问题应该编译和安装就没问题了。可能不一定一次就能安装成功,可以多结合别人优秀的做法,互相结合。笔者不才,不免会有一些可能描述错误的地方,欢迎指正。以上均为个人原创,文章至此已结束,请勿乱转载谢谢。