一、下载kernel
源码
先查看一下目前的内核
uname -r 2.6.32-431.el6.i686
下载地址:
https://www.kernel.org/pub/linux/kernel/v2.6/
下载2.X最高版本的一个
linux-2.6.39.tar.xz
进入内核编译目录,有一个默认的
cd /usr/src/kernel wget https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.tar.xz tar xvf linux-2.6.39.tar.xz
二、清除旧目标文件和配置
如果是第一次就不需要了
make mrproper
三、配置内核选项
文本交互模式:make config
文本菜单模式:make menuconfig
图形菜单模式:make xconfig
在这里使用 文本菜单模式
输入
make menuconfig
会在终端出现一个 文本菜单,里面有非常多的选项。
由于是初次 编译 练习 就不面面俱到了 事实上是没那个能力
方向键 选中 Enter键进入 Genral setup ---> 选项
Local version - append to kernel release
在内核版本后面加上自定义的版本字符串(小于64字符),可以用"uname -a
"命令看到
Automatically append version information to the version string
自动在版本字符串后面添加版本信息,编译时需要有perl以及git仓库支持
上面两个选项任选其一,其目的是可以加上自定义版本字符串
按空格选择,被选中的前面有*
号
接着看
进入这个选项 Processor type and features --->
选中这个 Symmetric multi-processing support
启用对多处理器的支持,现在基本都是双核以上的CPU了吧?必选!
选中这个 Generic x86 support
通用 X86 支持,找不到我的CPU,只能选择这个了
由于初次编译内核,其它的就不选了,就按默认的来。
四、编译内核
make
遇见一个错误
arch/x86/include/asm/ptrace.h:147:13
上网搜索需要打一个补丁
补丁下载地址
https://patchwork.kernel.org/patch/1301031/
下载之后,放在 linux-2.6.39 目录之下 命名为:
x86-fix-ptrace.o-compile-error.patch
编辑第一行
vim x86-fix-ptrace.o-compile-error.patch
改
--- linux-2.6.32.59/arch/x86/include/asm/ptrace.h
为
--- linux-2.6.39/arch/x86/include/asm/ptrace.h
这个是指定需要补丁的位置
保存之后在linux-2.6.39目录下执行
patch -p1 <x86-fix-ptrace.o-compile-error.patch
然后重新编译
make
耐心的等待10几分钟就编译完成了,具体看个人电脑的配置
echo $?
看看有没有成功?
五、编译内核模块
make modules
输出:
[root@one linux-2.6.39]# make modules CHK include/linux/version.h CHK include/generated/utsrelease.h CALL scripts/checksyscalls.sh Building modules, stage 2. MODPOST 1950 modules [root@one linux-2.6.39]# echo $? 0
同样是成功的
六、安装内核模块
make modules_install
[root@one linux-2.6.39]# echo $?
0
编译之后的模块文件在 /lib/modules
查看一下
[root@one linux-2.6.39]# ls /lib/modules/ 2.6.32-431.el6.i686 2.6.39
放着不同的内核模块文件
七、安装新内核
先看一下 /etc/grub.conf
文件
less /etc/grub.conf
输出
default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.32-431.el6.i686) root (hd0,0) kernel /vmlinuz-2.6.32-431.el6.i686 ro root=/dev/mapper/vg_one-lv_root rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us LANG=en_US.UTF-8 rd_LVM_LV=vg_one/lv_root rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg_one/lv_swap rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-431.el6.i686.img
默认只有一个内核,待会儿安装成功之后这里会多出来一个 linux-2.6.39 版本的新内核 我们就可以用它来启动了
执行
make install
这是最后一步了,它会拷贝一些文件,还会修改一些配置,都是自动完成任务的。
出现了一个错误
ERROR: modinfo: could not find module i2c_core
没关系可以暂时先忽略,如果介意的话可以
make menuconfig
Device Drivers ---> -*- I2C support ---> 把里面所有I2C的功能开启
再重新编译试试,我没做过。
再次查看 /etc/grub.conf
!less
会发现我们的新内核已经已经添加进去了
default=1 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.39) root (hd0,0) kernel /vmlinuz-2.6.39 ro root=/dev/mapper/vg_one-lv_root rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us LANG=en_US.UTF-8 rd_LVM_LV=vg_one/lv_root rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg_one/lv_swap rd_NO_DM rhgb quiet initrd /initramfs-2.6.39.img title CentOS (2.6.32-431.el6.i686)
但是我们发现,default=1,也就说它默认会启动第二个内核,原来的就内核,计算机从0开始计数嘛,编辑它改为 0
vim /etc/gurb.conf
找到
default=1
改为
default=0
[root@one linux-2.6.39]# ls /boot/ -l
lrwxrwxrwx. 1 root root 23 7月 19 09:07 System.map -> /boot/System.map-2.6.39
lrwxrwxrwx. 1 root root 20 7月 19 09:07 vmlinuz -> /boot/vmlinuz-2.6.39
System.map
和 vmlinuz
已经指向了,新的内核文件。
备份 内核配置文件
内核配置文件在 linux-2.6.39 目录下
它记录了我们的内核配置的详细信息,如果我们下次还想接着用这个配置文件,那么可以把它备份。
cp .config /root
定制内核版本号,这一步应该在 make 之前做
编辑当前目录的 Makefile
找到 EXTRAVERSION
后面加上 自定义字符
最后重启启动看没有问题
没有问题
查看内核
uname -r
已经显示2.6.39了