Linux内核编译与安装-基于linux-2.6.30.6内核

由于实验课需要的关系,最近研究了一下Linux内核的编译。

貌似不同版本的Linux内核的编译过程略有区别,时间精力有限,所以不做进一步探讨了。

这里仅展示一下基于linux-2.6.30.6内核的编译过程。实验环境是内核2.6.35-22-generic-pae的服务器版Ubuntu。

文章内容中涉及一些资料是从别人博客里Copy过来的,因为太杂太乱,所以没办法逐一帖上原帖链接,希望见谅。同时,其正确性也无法保证,仅供参考。

●下载内核压缩包

http://www.kernel.org/下载linux压缩包linux-2.6.30.6.tar.bz2

●解压缩内核压缩包

tar -jxvf linux-2.6.30.tar.gz

●检查源码(貌似该步不是必须)

$ cd /home/std/ linux-2.6.30.6

$ make mrproper

该步的作用是检查源码是否有.o文件和依赖问题,从全新的源码编译时不需要这一步。配合makeclean(主要清除.o文件)使用更好,make mrproper主要清除环境变量及配置文件,清除旧的编译过的文件。

配置内核

$ make menuconfig

可以无需做任何改动直接退出。对于第一次编译内核的人,不推荐直接从内核默认配置开始,推荐使用发行版自带的配置文件,通常/boot下会有config-2.6.35-22-generic-pae的文件。选择Load an Alternate Configuration File,然后输入/boot下那个config文件的名字,载入即可。第一次编译最好还是不要随便修改配置了,如果失败的话,会留下心理阴影的。在配置里随便看看,如果有什么懂的也可以根据自己的需求改改,不明白的地方就不要动了吧。完了之后别忘了save,保存的时候文件名就填.config。

注意:如果出现找不到ncurses开发库可以使用命令sudo apt-get install ncurses-dev,然后重新运行上面的命令就可以了

●编译内核

$ make

为了加快编译的速度,可以使用-j参数,开启多线程。比如双核的cpu可以这样编译

$ make -j4

一般-jn的n为核数的两倍即可

●安装内核模块

$ make modules_install

将编译得到的内核模块复制到/lib/modules/<kernel-version>/目录下

安装内核

$ make install

(启动配置文件grub.cfg是/boot/grub/grub.cfg(fedora是在menu.lst文件中))

此时只是把压缩的内核镜像vmlinuz拷贝到了/boot下,还没有生成initrd.img,如果此时在grub.cfg文件中增加新编译的内核镜像的话(将其他内核版本的img作为此内核的img),开机后出现:Could not load /lib/modules/.../modules.dep

生成镜像文件initrd

$ sudo mkinitramfs -o /boot/initrd.img-2.6.30.6 2.6.30.6

完成后, 将在linux-source-2.6.30.6/目录下生成initrd.img-2.6.30.6文件。

关于mkinitramfs的其他参数,请参考man mkinitramfs。关于initrd的作用,请自己google搜索。

如果开机后还是出现:Could notload /lib/modules/.../modules.dep,提供了一个解决方案,就是使用initramfs-tools生成initrd.img,命令如下:update-initramfs-c -k 2.6.30.6之后会利用lib/modules下的文件生成initrd.img-2.6.30.6(位置在boot文件夹下),修改grub.cfg的img的路径。重新启动选择2.6.35.2,启动成功!参考http://www.linuxquestions.org/questions/debian-26/modprobe-fatal-could-not-load-lib-modules-modules-dep-335214/

●修改引导

使用grub的话,可以直接使用:

$ sudo update-grub

来更新引导文件,当然也可以自己编辑/boot/grub/menu.lst或者/boot/grub/grub.cfg文件。grub.cfg引导文件示例如下:

Linux内核编译与安装-基于linux-2.6.30.6内核_第1张图片

重启

重启之后可以通过以下命令确认你当前使用的是不是刚编译的内核:

$ uname -a

在启动的过程中发现,ubuntu默认启动下是看不到grub的启动菜单的(在多系统的机器上可以看到,但虚拟机中无法看到),因此需要修改grub.cfg中关于时间的控制即timeout,有两个地方:

if [ "${recordfail}" = 1 ]; then
set timeout=-1
else
set timeout=10
fi

if keystatus; then
if keystatus --shift; then
set timeout=-1
else
set timeout=0
fi
else
if sleep --interruptible 3 ; then
set timeout=0
fi
fi
fi

前者为系统失败或成功的等待时间,后者为启动时按住shift或不按shift的等待时间,在虚拟机中可以在启动时按住shift或者直接把后者的timeout全部改为10.参考资料:http://forum.ubuntu.org.cn/viewtopic.php?f=139&t=323524

你可能感兴趣的:(linux内核)