RHEL6下编译Linux 3.0.1内核


下面简单讲一下在 rhel6 中编译 Linux Kernel 3.0.1 的过程。因为编译内核的过程都差不多,所以理论上下面的过程同时也适用于其他发行版(比如大便系列的 Ubuntu 11.04,下面我会同时注出使用大便系列编译的异同),因为如果编译后的内核有问题可能使用自己编译的新内核启动不了计算机,所以要保留当前使用的内核。

1、下载并解压缩 Linux Kernel 3.0.1 源代码
到官方 http://kernel.org/ 下载,得到 linux-3.0.1.tar.bz2 文件,把它移动到任何你有读写权限的文件夹,运行下面命令解压缩并进入解压后的文件夹:
$ tar jxvf linux-3.0.1.tar.bz2
$ cd linux-3.0.1

2、配置内核编译参数
先安装 ncurses 工具,这是字符版配置工具所依赖的:
$ sudo yum install ncurses ncurses-devel #(红帽系列环境)
$ apt-get install libncurses5 libncurses5-dev #(大便系列环境)

我已经在本机手动配置了 sudoers 所以如何提示当前用户不是 sudoer 请配置 sudoers 或可用root(我没测试过)
添加用户到sudo执行权限 :
1. chmod u+w /etc/sudoers
2. vim /etc/sudoers
3. 在 root ALL=(ALL) ALL 下添加 [user] ALL=(ALL) ALL ([user] 为赋予权限的用户)
4. chmod 440 /etc/sudoers

新版本配置工具会自动寻找当前系统环境的配置信息(即位于 /boot 下以 config-XXX 开头的文件),所以接下来可以直接运行字符版的配置工具:
$ make menuconfig

这里有很多配置选项,如果是尝试性的心态,则可不必理会它,直接选中菜单下面的“Save”然后退出,配置工具会生成一个“.config”文件。

3、开始编译
$ make

编译过程从十几分钟到1、2个小时不等,视乎你计算机运行的速度。如果CPU是4核的,可以在 make 命令后面加上“-j4”参数让编译程序同时使用4核编译,这样编译所需要的时间能减倍。

如果编译中途意外中断,然后想重新开始编译,需要先执行下面命令清理一下编译现场然后再编译:
$ make mrproper

(这里是漫长的等待过程)

4、安装编译好的模块和内核
内核编译好之后,使用下面命令安装 modules:
$ sudo make modules_install

上面的命令会将编译好的 modules 复制到 “/lib/modules/3.0.1” 文件夹,其中“3.0.1”是内核的版本号,你会在“/lib/modules”文件夹中看到其他版本内核的 modules,包括当前系统环境的。这是个很重要的文件夹,不要手痒把这些文件夹删除了。

然后安装编译好的内核映像文件:
$ sudo make install

上面的命令会把编译文件夹里面的“arch/x86/boot/bzImage”文件复制到“/boot”,同时还会复制 init 和 System.map 文件,最终在“/boot”会多出如下3个文件:

/boot/initramfs-3.0.1.img
/boot/System.map-3.0.1
/boot/vmlinuz-3.0.1
现在重启机器就可以选择3.0.1的内核来启动Linux

但网上还有一说安装时少 initrd.img 文件(初始ram磁盘文件)?使用下面命令创建一个即可:
$ sudo mkinitrd initramfs-3.0.1.img 3.0.1 #(红帽系列环境)
$ sudo mkinitramfs 3.0.1 -o /boot/initrd.img-3.0.1 #(大便系列环境)

5、修改 GRUB 启动菜单,增加使用新内核启动的项目
这一步可以使用 GRUB2 的自动生成工具完成
$ sudo grub2-mkconfig #(红帽系列环境)
$ sudo update-grub2 #(大便系列环境)

假如你(对新内核没什么把握)不希望修改 GRUB 启动菜单,则可以直接在启动 Linux 时手动指定新内核,方法如下:
重启计算机,在 GRUB 菜单界面(假如没有看到的话则重启计算机时按下ESC键)按“c”进入命令模式,先设置启动文件的分区,下面假设 “/boot”位于第一块硬盘第一个分区,如果在其他分区则把下面的数字“1”改成“2,3,5,6,7……”等:
set root=(hd0, 1)

指定内核映像和虚拟ram磁盘文件位置:
linux /boot/vmlinuz-3.0.1 root=/dev/sda1
initrd /boot/initrd.img-3.0.1

注意,在 GRUB 命令模式下也可以按“TAB”键自动补完的,不要一个字一个字地敲。最后输入“boot”启动。

相关内容