Linux下内核编译安装

本文仅为了练习Linux内核源码的编译安装,安装环境为VMWare下的CentOS,现有CentOS版本为2.6.32-358.el6.x86_64
/boot/grub/grub.conf文件内容如下:

1
2
3
4
5
6
7
8
9
# 注释部分去掉
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-358.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/vg_livedvd-lv_root rd_NO_LUKS rd_LVM_LV=vg_livedvd/lv_root rd_NO_MD crashkernel=auto rd_LVM_LV=vg_livedvd/lv_swap KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM LANG=zh_CN.UTF-8 rhgb quiet
initrd /initramfs-2.6.32-358.el6.x86_64.img

获取内核源码

首先从Linux的官方网站下载最新版内核Linux3.13。

执行tar Jxvf linux-3.13.tar.xz -C/usr/src/kernels命令将内核源码解压到内核源代码存放目录/usr/src/kernels/,该源码目录并不固定,但推荐将内核源码存放到该目录下。

为了将上次编译时的目标文件及相关设置文件删除,执行make mrproper

挑选功能

可以采用了多种方式,这里采用make menuconfig的方式来挑选内核功能,该方式不需要X Window(make xconfig方式)的支持,而且要比纯命令行方式(make config)要直观。执行make menuconfig遇到如下错误:

1
2
3
4
5
6
7
8
9
10
11
[root@localhost linux-3.13]# make menuconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
*** Unable to find the ncurses libraries or the
*** required header files.
*** 'make menuconfig' requires the ncurses libraries.
***
*** Install ncurses (ncurses-devel) and try again.
***
make[1]: *** [scripts/kconfig/dochecklxdialog] 错误 1
make: *** [menuconfig] 错误 2

这是因为需要ncurses库的支持,下面采用从源码安装的方式安装ncurses。

从ncurses的官方网站下载最新版的ncurses-5.9.tar.gz。然后分别执行./configure、makemake install`命令安装。

更改内核版本号标识

为了能够在编译完成后的内核版本中通过uname -r看到定义的内核版本号,修改Makefile文件。其中EXTRAVERSION字段值为空,将其赋值为kuring。

编译内核

执行make命令,该过程需要话费很长时间,我在512MB的VM下跑,花费了大约1个半小时时间。

编译内核模块

执行make modules命令。

安装内核模块

执行make modules_install命令,会将内核模块安装到/lib/modules目录下。

安装内核

执行make install命令,产生如下输出:

1
2
3
4
5
6
sh /usr/src/kernels/linux-3.13/arch/x86/boot/install.sh 3.13.0kuring arch/x86/boot/bzImage \
System.map "/boot"
ERROR: modinfo: could not find module vmhgfs
ERROR: modinfo: could not find module vsock
ERROR: modinfo: could not find module vmware_balloon
ERROR: modinfo: could not find module vmci

这个错误跟vmware的vmware tools有关,暂时不去管。

这样再去看/boot/grub/grub.conf文件,会看到文件已经变化,已经将新内核添加到开机启动项中。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 注释部分去掉
default=1
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (3.13.0kuring)
root (hd0,0)
kernel /vmlinuz-3.13.0kuring ro root=/dev/mapper/vg_livedvd-lv_root rd_NO_LUKS rd_LVM_LV=vg_livedvd/lv_root rd_NO_MD crashkernel=auto rd_LVM_LV=vg_livedvd/lv_swap KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM LANG=zh_CN.UTF-8 rhgb quiet
initrd /initramfs-3.13.0kuring.img
title CentOS (2.6.32-358.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/vg_livedvd-lv_root rd_NO_LUKS rd_LVM_LV=vg_livedvd/lv_root rd_NO_MD crashkernel=auto rd_LVM_LV=vg_livedvd/lv_swap KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM LANG=zh_CN.UTF-8 rhgb quiet
initrd /initramfs-2.6.32-358.el6.x86_64.img

同时在/boot目录下已经多出了vmlinuz-3.13.0kuring、System.map-3.13.0kuring、initramfs-3.13.0kuring.img文件。

重启系统后,在启动菜单中多出了新内核选项。进入新内核后,执行uname -r显示3.13.0kuring,说明新内核已经安装完成。