虽然在Linux 4.5以上的内核版本已经支持MPLS功能,但是我还是想试验一下,如何把mpls编译进内核,(绝对是我的血泪史,强烈建议看完之后再进行编译,问题一般情况都会发生的,尤其是make那里,时间长,把问题提前解决,省时省力省心,希望能给看到的小朋友一点启发,若有错误,望相互讨论)
本文是一篇整理的文章,包括
1 内核的编译过程,及可能遇到的问题,及解决办法
2 如果降低内核版本
系统环境:Ubuntu 12
原始内核是:3.13.0-32-generic 我的内核是:2.6.35
内核和patch的下载链接:https://pan.baidu.com/s/1ixF99SKG8l75xmNgUu7HCQ
1)下载2.6.35内核
下载链接:www.kernel.org
下载好后把下载的压缩文件复制到/usr/src,并进行解压缩,命令如下:(注:/home/cj替换成你压缩文件下载的地址,内核要做Linux系统下解压缩)
$ sudo cp /home/cj/linux-2.6.34.tar.gz /usr/src //复制文件到/usr/src目录
$ sudo cd /usr/src //进入到/usr/src
$ sudo tar -zxvf linux-2.6.35.tar.gz //解压缩
2 )下载patch文件:
因为想把mpls编译进内核,所以需要patch文件
linux-kernel-v2.6.35-mpls1.980.patch。
因为这patch文件是针对2.6.35的,所以,内核是2.6.35
3)将下载后的patch文件拷贝到/usr/src/目录下。然后将此文件打进内核中,命令如下:
$ sudo cp /home/cj/linux-kernel-v2.6.35-mpls1.980.patch /usr/src //复制文件到/usr/src目录
$ sudo cd /usr/src/linux-2.6.35 //首先进入kernel主目录下
$ sudo patch -p1 < ../linux-kernel-v2.6.35-mpls1.980.patch //将patch文件加载到内核文件中。
4)将内核重新编译
$ cd /usr/src/linux-2.6.35
$ sudo make mrproper //清除以前曾经编译过的旧文件,第一次编译,可不执行(我是一般都执行)
$ sudo make menuconfig
问题:Install ncurses (ncurses-devel) and try again.
解决:sudo apt-get install libncurses5-dev
再次执行:
$ sudo make mrproper
$ sudo make menuconfig
这时,终端会弹出一个配置界面,将mpls的选项选中,然后保存退出。
Networking support —>Networking options —>Mulitprtocol Label Switching
另外:建议将MPLS直接编译进linux内核,而不要选择模块编译,如果选择模块的话,则在系统编译完成后可能不会自动加载,这样就可能导致mpls服务无法启动。即在选中与mpls相关选项时,选择y, 即:“*”,它表示编译进系统内核。而不要选择M,这表示模块。(按空格更改)
$ sudo make //重新编译内核,此过程需要较长时间直接使用此命令可能有出现问题,可以使用:sudo make CONFIG_DEBUG_SECTION_MISMATCH=y
错误1
gcc: 错误: elf_i386:No such file or directory
make[2]: * [arch/x86/vdso/vdso32-int80.so.dbg] 错误 1
make[1]: * [arch/x86/vdso] 错误 2
make: * [sub-make] 错误 2
原因是gcc 4.6不再支持linker-style架构。
解决:
vi /usr/src/linux-2.6.35/arch/x86/vdso/Makefile
把”-m elf_x86_64” 替换为 “-m64“
把”-m elf_i386” 替换为 “-m32“
保存退出(注:查找 :/elf_x86_64)
问题2
In file included from drivers/net/igbvf/ethtool.c:36:0:
drivers/net/igbvf/igbvf.h: At top level:
drivers/net/igbvf/igbvf.h:129:15: error: duplicate member ‘page’
make[3]: * [drivers/net/igbvf/ethtool.o] Error 1
make[2]: * [drivers/net/igbvf] Error 2
make[1]: * [drivers/net] Error 2
make: * [drivers] Error 2
解决:
vi /usr/src/linux-2.6.35drivers/net/igbvf/igbvf.h
将第129行的struct page *page;注释掉或删掉此行
保存退出(注:vi中设置行号: :set nu)
$ sudo make install
$ sudo make modules //编译模块
会有警告如下(但是我没在意)也可按解决方案执行一下:
WARNING: modpost: Found 13 section mismatch(es).
To see full details build your kernel with:
‘make CONFIG_DEBUG_SECTION_MISMATCH=y’
解决方案:
sudo make CONFIG_DEBUG_SECTION_MISMATCH=y
$ sudo make modules_install //安装模块
5)最后创建initrd文件:
$ sudo mkinitramfs -o /boot/initrd.img-2.6.35
6)更新grub引导列表
$ sudo update-grub
若是更新内核到高版本,这样就可以了,因为系统默认是选择高内核版本,但是我们是要降低内核版本,所以,我从网上看了好多,但是感觉这个用着最好:
1 打开 grub 配置文件
sudo vi /etc/default/grub
2 找到GRUB_DEFAULT =0 非注释的第一行
GRUB_DEFAULT = "Advanced options for Ubuntu"
3 将下一行 GRUB_HIDDEN_TIMEOUT=0
注释掉,这是引导的时间
#GRUB_HIDDEN_TIMEOUT=0
4 保存,执行grub更新,重启
$ sudo update-grub
$ sudo reboot
8)重启后,选择2.6.35的内核,会出现:
1, 问题:
— Boot args (cat /proc/cmdline)
— Check rootdelay= (did the system wait long enough?)
— Check root= (did the system wait for the right device?)
— Missing modules (cat /proc/modules; ls /dev)
ALERT! /dev/disk/by-uuid/xxxxxxxxx does not exist. Dropping to a shell!
解决办法:
输入reboot,选择以前的内核版本进入:
打开终端,输入如下命令,打开grub配置文件:
$ sudo gedit /etc/default/grub
将配置文件里的==GRUB_DISABLE_LINUX_UUID=true==的注释去掉
更新grub,重启
$ sudo update-grub
$ sudo reboot
问题2
进入2.6.35,可能会出现下面的问题,oh,my god!!!(又有问题)
ALERT! /dev/sda1 does not exist . Dropping to a shell!
这是因为硬盘驱动没有配置好而造成的。需要配置==SCSI、PCI-X、Fusion-MPT驱动,需要在响应的驱动选项里将[M]设置为[*]==,因为硬盘驱动是在系统开机的时候加载,所以不能以模块形式加载。
解决办法
so,从第4步重新开始:
再加上
Device Drivers —>SCSI device support —>将里面的[M]缓存[*],
Device Drivers —>Fusion MPT device support —>将里面的[M]缓存[*]
再执行
5,6,7…
生活就是遇到问题解决问题,再遇到问题,再解决问题,加油~~~
http://www.cnblogs.com/liuwu265/p/4229656.html
http://www.cnblogs.com/liuwu265/p/4228027.html