最近编译Palacios需要linux的内核支持cpu Hot-Plug(内存热插拔)特性,无奈我机器上安装的Ubuntu10.04系统默认不支持内存热插拔特性,所以需要修改配置文件并重新编译linux内核,然后就开始了漫长的linux内核编译过程,幸好有个大神帮我,然后参考了网上很多朋友的博客,才让我快速结束了这个痛苦的经历。记于此,备忘、分享。
一、查看自己的机器是否支持cpu Hot-Plug(内存热插拔)特性
这也是我的最初的需求。
linux命令行执行以下命令:
$ cat /boot/config-$(uname -r) | grep HOTREMOVE
如果输出以下内容说明你的系统已经支持内存热插拔特性,恭喜,你不需要重新编译内核了。
CONFIG_MEMORY_HOTREMOVE=y CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
如果没有出现,那就得苦逼地去编译内核,走起吧骚年。
二、查看本机linux内核版本并下载目标linux内核版本
2.1 查看本机Linux内核版本:
sudo uname -r
然后去linux内核官网下载需要编译的内核,一般都选择比自己本机内核高的版本,除非你有特殊要求。
比如我本机的linux内核是linux-2.6.32.21,我选择的目标linux内核为2.6.32.27。
2.2下载内核
linux内核官网为:我是内核列表
然后选择想要下载的版本的压缩包,比如我选择的是linux-2.6.32.27.tar.bz2,如下图所示。(下图两种后缀的压缩文件都是可以的)
2.3解压内核
将下载的压缩包文件复制到/usr/src目录下,然后解压
sudo tar xvf linux-2.6.32.27.tar.bz2
三、配置内核配置文件
这一步是重中之重,直接关系到能不能编译成功以及编译后的内核能否运行起来。当时我就被卡在这一步很久。
3.1打开配置文件
ok,上一步我们已经解压完了内核压缩文件,现在进入我们解压完的新的内核文件夹中看一看。
cd /usr/src/linux-2.6.32.27 ls -a
这时候,你发现目录下并没有配置文件,也就是.config文件,因此我们要生成一个默认的配置文件,运行以下命令:
sudo make defconfig
这时候会生成当前内核的默认配置文件。当然我们还需要对它进行改进,要不然启动的时候会找不到文件系统,其次我们需要配置的cpu Hot-Plug也是在这里设置的。
运行以下命令,以图形界面的形式来配置。
sudo make menuconfig
如果你在这一步报错了,提示error: curses.h: No such file or directory
,说明你的机器上缺少运行menuconfig的必要类库支持。运行一下命令:
sudo apt-get install libncurses5-dev libncursesw5-dev
然后再重新make menuconfig就可以了。
3.2配置内核配置文件
进去以后看到的界面应该是这样的。(高版本可能有所不同,不过大同小异)
首先,我们先配置文件系统,如果不配置,新内核一直发现不了文件系统,重启后会黑屏然后一个光标一直在左上角闪烁或则提示找不到FileSystem。
文件系统配置如下图:
然后我们配置cpu Hot-Plug特性,
1.Processor type and features —>Meeory model —> SparseMemory
2.Processor type and features —>Allow for memory hot-add
3.Processor type and features —>Allow for memory hot-remove
4.Processor type and features —>Page migration
5.Processor type and features —>Support for hot-pluggable cpus
6.Power management and ACPI options —>ACPI(~~全称~~)Support —>Memory Hotplug
以上几项都要选上。
如果还是不太明白,可以看看官方的文档:我是官方文档
另外,还有一篇讲内存热插拔的文章,也不错。拿走拿走:满足你们,哼
至此,配置已经基本达到了我们的要求。然后一直选择Exit,最后会提示让你保存,一定要选则YES,保存。
另外,如果在配置文件中,你不知道该不该选择某一项,那么你就将光标停在那一项上,然后按H,会有惊喜哟。
四、编译及安装
好了,经历了艰难险阻,我们终于走到了这一步。现在可以编译和安装了。(以下命令均在新内核目录内执行)
4.1 编译内核
sudo make
好了,只有一句话。这个过程比较漫长,如果前面的配置文件没有问题。而且你的编译环境没有问题,那么应该是不会出问题。
如果你还没有gcc编译环境,那么你需要先执行下面的命令,安装必要的编译环境。
sudo apt-get install build-essential
4.2 编译安装内核模块
sudo make modules_install
这一步应该挺快。
4.3 安装内核
sudo make install
五、生成内核镜像及启动项
马上就要成功了。
5.1 生成内核镜像
首先来看一下这个文件夹/lib/modules/目录下的文件夹:
ls /lib/modules
该文件夹下应该会有两个文件夹,一个是你原来系统的内核模块文件,另一个是刚编译完的新内核的内核模块文件。
然后执行:
sudo mkinitramfs -o /boot/initrd.img-2.6.32.27 sudo update-initramfs -c -k 2.6.32.27
命令中的版本号对应你的新版本的版本号。
最后就是配置启动时候的grub文件了:
sudo update-grub2
OK.大功告成。不过再来改一点点东西,然我们的grub启动的时候等几秒,而不是直接进入默认的系统。
sudo gedit /boot/grub/grub.cfg
然后找到其中所有的timeout=0或者timeout=负数的,都改成timeout=10,保存、退出。
完成。
重启机器,会出现grub界面,然后选择新内核进入就好了。
六、如果重启后无法看到grub界面怎么办。
当时我也遇到了这个问题,才开始编译内核的时候由于各种不明问题,导致编译完成重启机器后只有一个光标在闪闪闪…连grub界面都木有,连原来的系统都进不去啊!!所以贴心的我就来教你怎么解决这个问题。
直接给连接:我是秘籍
只是需要注意的是,上面教程中第一步不需要。只要一个可以装Ubuntu的U盘就可以了,就跟使用U盘安装Ubuntu一样,只不过用U盘引导起来以后不选择Istall Ubuntu,而是进第一项,试用Ubuntu。
七、参考资料
谢谢各位博客的大神们。本博客中许多内容都是摘自你们的博客。谢谢!
http://www.jb51.cc/article/p-rfhcvauo-vg.html //很靠谱的内核编译博客
http://blog.chinaunix.net/uid-15007890-id-106930.html //内存热插拔介绍,上面已经提到
http://smilejay.com/2011/05/linux-kernel-configuration/ //内核编译
http://blog.chinaunix.net/uid-7525568-id-3453610.html //内核配置及编译详细过程,参数也有讲到
http://www.cnblogs.com/jack204/archive/2012/02/21/2361661.html //内核编译,貌似是个总结