A-A+
linux内核编译
下载指定版本内核源代码
1、linux的核心原始码一般放置在/usr/src/kernels 目录下,所以将下载的源代码压缩包解压到该目录
[root@www ~]# tar -jxvf linux-2.6.32.3.tar.bz2 -C /usr/src/kernels/
之后会在/usr/src/kernels 下生成新的目录,该目录下就是接下来需要编译的新的内核原始码。
[root@www ~]# cd /usr/src/kernels/
[root@www kernels]# ls
2.6.32-431.el6.x86_64
[root@www kernels]# cd 2.6.32-431.el6.x86_64/
[root@www 2.6.32-431.el6.x86_64]# ls
arch drivers include kernel Makefile.common net security tools
block firmware init lib mm samples sound usr
crypto fs ipc Makefile Module.symvers scripts System.map virt
在编译之前要确定服务器的硬件环境,可利用/proc/cpuinfo 和lspci 获取cpu信息和各个硬件信息,查看之后就可以开始编译工作。
2、保持干净的原始码:make mrproper(不知道是清理啥)
[root@www 2.6.32-431.el6.x86_64]# make mrproper
上面命令只需在第一次执行编译工作时执行,之后的编译可以用make clean
接下来最重要的就是对核心功能的选择,选择的方式有多种,在命令行下面通常需要的是make menuconfig
这里面选项比较多,具体的可以自行查阅,鸟哥的私房菜基础篇的最后章节中有比较详细的介绍。
选定好相应的模块和功能,保存退出,就可以开始编译,基本步骤是:
[root@www 2.6.32-431.el6.x86_64]# make bzImage #编译经过压缩的核心文件
[root@www 2.6.32-431.el6.x86_64]# make modules #编译模块
执行完命令会在当前目录下生成arck/x86_64/boot/bzImage,这个文件就是启动时需要的核心了。
最后执行make modules_install 安装模块到/lib/modules目录下
[root@www 2.6.32-431.el6.x86_64]# make modules_install
3、上面几步已经完成了编译工作,接下来就是把核心cp到boot目录,并修改grub文件。
[root@www 2.6.32-431.el6.x86_64]#cp /usr/src/kernels/2.6.32-431.el6.x86_64/arch/x86_64/boot/bzImage /boot/vmlinux-2.6.32 #核心
[root@www 2.6.32-431.el6.x86_64]#cp /usr/src/kernels/2.6.32-431.el6.x86_64/.config /boot/config-2.6.32 #此部为了备份编译之后的配置文件,可不用执行
要想启动系统还需要一个initrd文件,这个文件挺难说清楚的以后在做介绍
(linux刚开始启动是从boot分区开始启动,首先挂在boot分区,加载boot分区里的内核,此时还没有挂在根目录,所以无法执行根目录上的任何脚本和驱动模块,如果我们的硬盘采用scsi或网络硬盘等,而编译内核时又把相应驱动程序按模块方式加载,那么在跟分区加载前无法使用这些驱动,而不加载这些驱动又无法挂载根分区,这就产生了矛盾,为了解决这个问题就产生了initred,把部分必要驱动放在initred映像文件中,作为ram disk载入内存,待挂载根分区后,执行其余步骤。)
该文件可以由mkinitrd命令生成
[root@www boot]# mkinitrd -v /boot/initrd-2.6.32.img
修改grub文件
[root@www boot]#vim grub/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
#title CentOS (2.6.32-431.el6.x86_64)
# root (hd0,0)
# kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS rd_NO_MD rd_LVM_LV=VolGroup/lv_swap crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
# initrd /initramfs-2.6.32-431.el6.x86_64.img
title Centos test kernel
root (hd0,0)
kernel /boot/vmlinux-2.6.32 ro root=/dev/mapper/VolGroup-lv_root rhgb
initrd /boot/initrd-2.6.32.img
红色部分为添加内容,注释掉原来的核心(可以保留,防止编译失败无法启动,但是核心模块的目录名需要不一样才可,在升级内核时不用担心,编译相同内核是就要做更改,在make menuconfig时,那个general setup内的local version 修改成不一样的即可 )。
重新以新内核开机,测试。
(执行完make modules_install 命令,可直接通过make install 自动完成新内核文件的移动和启动菜单的添加,可防止手动添加时出错。)