主機操作系統版本: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'