Chinaunix首页 | 论坛 | 博客
  • 博客访问: 373953
  • 博文数量: 53
  • 博客积分: 1411
  • 博客等级: 上尉
  • 技术积分: 701
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 14:40
文章分类

全部博文(53)

文章存档

2011年(6)

2010年(20)

2009年(18)

2008年(9)

我的朋友

分类: LINUX

2010-09-19 15:38:16

1. 准备工作
(1) 实验平台
Ubuntu 9.10
(2) 相关编译工具
编译linux内核,需要相关的编译工具。如下安装所需的编译链接工具
#apt-get install libncurses5-dev build-essential

2. 获取linux keernel源代码
在网站下载最新的linux kernel源代码。本实验中,版本为最新的2.6.35.4.
#cp linux-2.6.35.4.tar.bz2 /study/
#cd /study
#tar jxvf linux-2.6.35.4.tar.bz2
#cd linux-2.6.35.4

3. 编译内核
(1) 配置内核
#make mrproper
清除所有目录下的配置文件和中间文件

#make menuconfig
或者
#make xconfig
或者
#make config
来配置内核。一般用menuconfig配置最为灵活方便。

(2) 编译内核
#make
生成vmlinux内核文件。
或者
#make zImage
编译产生压缩形式的内核文件。
或者
#make bzImage
需要内核支持较多的外设和功能时,内核可能变得很大,此时可以用此命令编译本内核产生压缩率更高的内核文件。

(3) 编译模块
#make modules
编译可加载的内核模块
#make modules_install
将编译好的内核模块安装进系统,通常会安装在路径/lib/modules/x.y.z下。
x.y.z为内核的版本号。本例中,路径为/lib/modules/2.6.35.4

(4) 安装内核
#make install
运行该命令后,会把编译好的内核安装到路径/boot/下。

#ll /boot/vm*
-rw-r--r-- 1 root root    1196 2009-10-17 02:06 /boot/vmcoreinfo-2.6.31-14-generic
-rw-r--r-- 1 root root    1196 2009-12-11 03:35 /boot/vmcoreinfo-2.6.31-17-generic
-rw-r--r-- 1 root root 3890400 2009-10-17 02:03 /boot/vmlinuz-2.6.31-14-generic
-rw-r--r-- 1 root root 3890560 2009-12-11 03:33 /boot/vmlinuz-2.6.31-17-generic
-rw-r--r-- 1 root root 4085568 2010-09-16 21:50 /boot/vmlinuz-2.6.35.4
可以看到我们新编译的内核vmlinuz-2.6.35.4 在/boot/目录下。

4. 制作ramfs镜像
#mkinitramfs -o /boot/initrd.img-2.6.35.4 2.6.35.4

注意:
这一步很重要,许多童鞋在配置内核的时候选择了可下载模块,而又没有完成这一步,在启动内核的时候,就会出现加载不了/root的问题。

5. 修改启动配置文件
之前的grub版本,启动配置文件为/boot/grub/menu.lst,可以在该文件中添加新的内核并配置默认启动。新版的grub(>=1.9), 启动配置文件是/boot/grub/grub.cfg, 该文件时自动生成的,我们可以手动更改,添加新内核的启动项。不过最好的方式是自动生成。如何自动生成启动配置文件呢?
#mv /boot/grub/grub.cfg /boot/grub/grub.cfg.bk
#grub-mkconfig > /boot/grub/grub.cfg
我们备份了原来的系统启动配置文件,生成新的配置文件。

6. 启动新内核
#reboot

若顺利,系统正常启动,如何知道系统是否启动了我们新的内核呢?
#uname -a
Linux ubuntu 2.6.35.4 #2 SMP Thu Sep 16 21:07:51 CST 2010 i686 GNU/Linux

从这里看到, 系统内核已经是最新的版本 2.6.35.4了。

若启动失败,就需要查看哪里出现的问题了。
常存在的问题,一个就是我们上面提到的,没有制作内核启动的ramfs镜像,这样系统在加载文件系统的时候就出错了。

initrd.img这个镜像是做什么的呢? initrd是在系统引导过程中挂载的一个临时根文件系统,initrd 与内核绑定在一起,并作为内核引导过程的一部分进行加载。随后,内核会将这个 initrd 文件作为其下一阶段引导过程的一部分来加载模块,这样才能稍后使用真正的文件系统,并挂载实际的根文件系统。

另外需要注意,在配置内核的时候,确保本机实际的相关硬件驱动编译进了内核,否则可能硬件无法正常工作。




阅读(2404) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~