小公司研发总监,既当司令也当兵!
分类: LINUX
2015-05-16 18:13:09
尽管网上有各种各样编译内核的方法,但是基本上都是借助于工具,虽然编译安装很方便,但是屏蔽了最基本的内核编译安装过程,下面我借助于Ubuntu 9.04,linux内核版本为2.6.28系统,来编译Linux 2.6.38内核,并把这个内核安装该系统上。
安装make ,gcc, make-kpkg,运行menuconfig等等和编译内核相关的工具:
$sudo apt-get install build-essential kernel-package libncurses5-dev
本机系统信息,示意图如下:
2.1 下载内核源码包
从 下载linux-2.6.38.tar.bz2内核源码包,用:
$tar xvf linux-2.6.38.tar.bz2
解压源码包,产生linux-2.6.38的文件夹
备注:这个网址现在下载不了,但是可以从其他网上下载,O(∩_∩)O~,另外当编译内核源码时,产生的.o文件默认是和源码放在一块的,使用选项“make O=out/dir”使得我们可以另外建立一个文件夹来存放编译产生的.o文件(也包括编译产生的.config文件),例如在我的电脑中解压linux-2.6.38.tar.bz2源码包,产生linux-2.6.38,这个文件夹放在/home/seed/build_kernel目录(我是以seed用户登录,seed对build_kernel有读写权限)
编译产生的结果文件放在/home/seed/build_kernel/output目录中,示意图如下:
备注:如果在编译过程中出现:make menuconfig' requires the ncurses libraries的错误提示,则运行:$sudo apt-get install libncurses* 来安装libncurses库。
第一步:首先进入linux-2.6.38目录,清空上次编译产生的临时.o文件(对于第一次解压可以不需要做清理),命令如下:
$cd linux-2.6.38
$make O=/home/seed/build-kernle/output mrproper(本条命令在第一次解压进入linux-2.6.38 目录时,可以不做)
第二步:配置内核
配置内核主要有有两种方式流行的方式:
第一种方式:在系统原有配置文件的基础上,进行修改,方法如下:
把原有的配置文件拷入/home/seed/build-kernel/output目录下,重命名为.config,然后进行配置,命令如下:
$cp /boot/config-`uname -r` /home/seed/build-kernel/output/
$make O=/home/seed/build-kernle/output oldconfig
根据提示在原有的.config配置文件基础上,进行修改。
示意图如下:
第二种方式:重新配置一个新的内核,不参考系统原有的config文件(本次更新,我用的是这种方式)
命令如下:
$cd linux-2.6.38
$make O=/home/seed/build-kernle/output menuconfig
这样会弹出一个配置菜单,根据菜单来配置内核。示意图如下:
根据途中的提示进行配置,全部设置完成,最后一项是保存设置,在/home/seed/build/kernel/output目录生成文件 .config
退出设置程序。
备注:
关于每个配置选项的作用,可以查看相应选项的帮助文档,需要具体配置的主要由以下几个方面:
1、在“Block layer”里,假如没有2TB的硬盘,就去掉:Support for Large Block Devices 。Support for Large Single Files 也不需要,很少有2TB的文件。
2、Bus options的选择:
Bus options (PCI, PCMCIA, EISA, MCA, ISA)
PCI support
PCI Express support 现在新买的机器基本上都是PCI Express了
ISA support 较新的新机器没有ISA设备,可以去掉
MCA support 去掉
NatSemi SCx200 support 去掉
PCI Hotplug Support
Support for PCI Hotplug (EXPERIMENTAL) 如果没有PCI热插拔设备,去掉
这里的选项可以考虑全部编译进内核,而不是以模块形式存在。
3、Device Drivers是重点,由于linux不但面向个人工作站,更多的是面向服务器的应用,所以可以把自己机器上没有的硬件全部去掉,而不用面面俱到。但是通用型的选项要慎重。
4、File systems
Filesystem in Userspace support 简称fuse。是必选的,如果你要用windows分区。
CD-ROM/DVD Filesystems
ISO 9660 CDROM file system support 一般选*
DOS/FAT/NT Filesystems
VFAT (Windows-95) fs support 有FAT32分区就选*吧
NTFS file system support 有NTFS分区就选*吧
NTFS write support 如果想对 NTFS分区进行写操作,选*
具体配置可以在网上google相关的资料。
第三步:编译内核
使用命令:
$cd linux-2.6.38
$make O=/home/seed/build-kernle/output
第四步:安装内核
使用命令:
$cd linux-2.6.38
$sudo make O=/home/seed/build-kernle/output modules_install install(使用了root权限)
示意图如下:
initrd-2.6.38是一个镜像文件,类似ramdisk,把一段程序打包到img里,然后在开机的时候在内存里开辟一段区域,一般是2m,释放到那里运行,都是一些初始化的程序,比如sisc_mod、ext3、sd_mod等模块和insmod、nash等命令。不同内核,初始化的img可以相同,也可以不同,如果没有,可以在grub.conf里加上no initrd,它就跳过initrd的检测和执行了,以前好像就没有,后来才有的。它的作用是在没有mount /分区以前,系统要执行一些操作,比如挂载scsi驱动,它就把initrd释放到内存里,作一个虚拟的/,然后执行其根目录下的一个脚本 “linuxrc”,运行insmod和nash命令挂装模块。
使用命令:
$sudo update-initramfs -c -k 2.6.38(使用了root权限)
示意图如下:
第六步:添加引导项
在/boot/grup/menu.lst文件中添加引导项,示意图如下:
示意图如下:
备注:只有在第五步和第七步使用root权限,其他的命令均没有必要使用root权限(root权限尽量避免滥用)
参考资料:
编译命令参考linux-2.6.38.tar.bz2源码包中README文件
内核配置参考