主机操作系统版本:Windows 10
虚拟机版本:Workstation 12 Pro
虚拟机操作系统:Ubuntu 14.04
Linux内核:3.13.0
gcc版本:4.8.2
最近学习linux内核,不少比较经典的书籍都是以2.6.x源码进行讲解的。所以打算在linux虚拟机中安装一个2.6.36的内核。步骤如下:
(一)下载源码
内核下载官网:www.kernel.org
下载linux-2.6.36.tar.gz并解压到/usr/src目录下
进入/usr/src/linux-2.6.36目录,以后的工作都在这个目录下进行
(二)定制内核
为了节省配置内核的时间,我们把系统中现有的配置拷贝到当前目录下
#sudo cp /boot/config-3.13.0-24-generic ./.config
无论是否需要自己定制内核,都要执行配置命令
#sudo make menuconfig
然后保存退出就行了
(三)编译内核
在这里,网上有不少文章都说执行sudo make -j4,我这样编译的时候并没有提示错误,但是make install却有如下提示信息:
*** Missing file: arch/x86/boot/bzImage
*** You need to run "make" before "make install".
于是改用 #sudo make 来进行编译
下面是编译过程中遇到的几个错误,这里把他们以及解决方法贴出来(但为什么用make -j4编译没有提示错误呢?)
错误一:
gcc: error: elf_x86_64: No such file or directory
gcc: error: unrecognized command line option ‘-m’
OBJCOPY arch/x86/vdso/vdso.so
objcopy: ‘arch/x86/vdso/vdso.so.dbg‘: No such file
make[2]: *** [arch/x86/vdso/vdso.so] Error 1
make[1]: *** [arch/x86/vdso] Error 2
make: *** [arch/x86] Error 2
解决方法:修改文件arch/x86/vdso/Makefile,把"-m elf_x86_64"改为"-m64";把"-m elf_i386"改为"-m32"
错误二:
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
解决办法:在drivers/net/igbvf/igbvf.h中注释掉129行,及 //struct page *page;
错误三:
In file included from drivers/scsi/pmcraid.c:57:0:
drivers/scsi/pmcraid.h: At top level:
drivers/scsi/pmcraid.h:601:8: error: duplicate member ‘sense_buffer‘
drivers/scsi/pmcraid.c: In function ‘pmcraid_abort_cmd‘:
drivers/scsi/pmcraid.c:2940:33: warning: variable ‘res‘ set but not used [-Wunused-but-set-variable]
drivers/scsi/pmcraid.c: In function ‘pmcraid_ioctl_passthrough‘:
drivers/scsi/pmcraid.c:3745:5: warning: variable ‘access‘ set but not used [-Wunused-but-set-variable]
drivers/scsi/pmcraid.c: In function ‘pmcraid_check_ioctl_buffer‘:
drivers/scsi/pmcraid.c:4052:6: warning: variable ‘access‘ set but not used [-Wunused-but-set-variable]
make[3]: *** [drivers/scsi/pmcraid.o] Error 1
make[2]: *** [drivers/scsi] Error 2
make[1]: *** [drivers] Error 2
make[1]: Leaving directory `/home/ashish/litmus-rt‘
make: *** [debian/stamp/build/kernel] Error 2
解决办法:在drivers/scsi/pmcraid.h中注释掉571行,及//u8 *sense_buffer;
(四)安装内核
#sudo make modules_install 把内核模块拷贝到/lib/modules/2.6.36目录下
#sudo make install 把内核镜像文件和initrd文件拷贝到/root目录下并生成grub的配置文件
(五)配置grub
虽然在执行make install的时候有自动配置grub,但启动的时候并没有grub选择界面,我们还需要一些其他配置
配置grub有两种方式,一种是直接配置/boot/grub/grub.cfg,这种方式很麻烦,具体方式自行百度,因为我也不会。。。
另一种方式是配置/etc/default/grub文件,然后运行#sudo update-grub生成/boot/grub/grub.cfg文件。
为了让系统在开机时显示grub的选择界面,我们需要在/etc/default/grub中添加一行:GRUB_TIMEOUT_STYLE=menu。
想了解更多配置命令,查看 info -f grub -n ‘Simple configuration‘