我的环境是在虚拟机中安装的ubuntu10.10系统,内存1024,2个处理器,20G硬盘(SCSI), i686(32位系统) 当前内核版本2.6.35-22-generic,我的电脑很旧,是宏碁aspire4720G,core2双核1.5GHZ主频,3G内存,虚拟机版本,7.1.3 build-324285。
现在要把它升级到最新的稳定版内核,2.6.38.2,首先从www.kernel.org下载最新版本的内核2.6.38.2(stable, full source),(建议安装vm tools方便在虚拟机和主机之间传送文件)
1, 因为我们之后要进行make menuconfig,所以需要在ubuntu中安装一个ncurses,执行命令:
sudo apt-get install libncurses*
2, 将内核文件放到主目录(/home/yourname)下,其实放在哪儿没关系,只不过习惯放在home目录下,然后解压:
sudo tar -jxvf linux-2.6.38.2.tar.bz2
(注意也有人喜欢解压到/usr/src目录下,那么久请执行
sudo tar -jxvf linux-2.6.38.2.tar.bz2 -C /usr/src
)
3, 进入到内核源代码目录,需要配置内核,但是配置内核前,可能有一些清理工作需要做(因为是新下载的内核,所以通常可不必此步骤)
make clean remove most generated files but keep the config
make mrproper remove all generated files + config+ vaious backup files
4, 配置内核,有几个选项可以选择:
make config是基于文本的传统配置界面
make menuconfig是基于文本的选单式配置界面,是最为灵活的内核配置工具
make xconfig是基于图形窗口模式的配置界面,需要xWindow图形环境的支持
make oldconfig用于在原来内核配置的基础上作修改
但通常我们都是用第二种方式(需要libncurses)
make menuconfig
在这里,进入到文本选单,当然可以做一些选择,但通常如果不是实际应用,只是练习内核编译,那么选择general setup就可以了,然后退出,并保存内核配置
5、sudo make dep 建立模块间的依赖信息
6、sudo make clean 删除配置时留下的一些不用的文件
(5、6两步可能对于一些PC没有作用,的确这里对我的虚拟机是没用的,执行命令后并没有做任何事情)
7, 编译内核和模块,注意这里是编译内核和模块,在网上很多地方都没将此处叙述清除,这里有3个命令可供选择:
make 编译内核和模块,相当于make bzImage 加 make modules; 3个多小时
make zImage 编译长生压缩形式的内核文件,30分钟左右
make bzImage 编译产生高压缩形式的内核文件,30分钟左右
如果你执行了make,就没必要执行make modules,前一个在30分钟,后一个在3小时时间,如果执行make bzImage则需要make modules,前者编译内核,后者编译模块,如果是第一次编译内核则通常两个都需要,但如果是后来编程需要,只是修改了内核源码,则重新编译内核时并不需要重新编译内核。
在此,我先执行
make -j2 bzImage
再执行make modules
注意,在编译内核时,可以添加-j选项,来加快内核编译速度,单核使用-j2,双核使用-j4
8, 安装内核模块 sudo make modules_install
9, 安装内核 sudo make install,
该步骤,会为我们安装内核,它执行了下列命令:
#sudo cp /usr/src/linux-2.6.38.2/arch/i386/boot/bzImage /boot/vmlinuz-2.6.38.2
#sudo cp System.map /boot/System.map-2.6.38.2
#sudo ln -s /boot/System.map-2.6.38.2 /boot/System.map
即,把内核映象和System.map拷贝到/boot/下
同时,建立内核的config文件config-2.6.38.2
10, 在之前的内核和模块编译完成后,会在/lib/modules/目录下生成2.6.38.2的模块文件(包括内核头文件等),我们需要将它与/boot目录下关联,生成initrd映像,到/lib/modules/目录下(不在该目录下也行),执行命令:
sudo mkinitramfs 2.6.38.2 -o /boot/initrd.img-2.6.38.2
11, 至此,内核编译完成,更新grub文件:
sudo update-grub 或 sudo update-grub2(后者会生成一个old-内核文件的启动选项)
12,重启系统,如果没有错误,则查看uname -a会看到内核版本已经变成2.6.38.2
**中间可能会出现问题,大都是重启后不能进入系统,kernel panic或者没有grub选项,但这一次都没有遇到,有人说scsi的硬盘不能成功,但我的成功了,之前我也出现了kernel pani,然后找不到root fs,当时我使用的是2.6.35.12的内核,没有找到原因,换了最新内核之后就没有出现问题了,还有编译的时间很长,大家一定要有耐性。