How-to: Update the Linux kernel

上周有同学问我Linux 如何升级内核, 后来工作之后接触到的是Debian, 内核基本上都是最新的 3.x.x 升级内核也就很简单了, 直接从源里就更新了。趁周末有空的时候我也搞一下, 以备以后工作之需。

本文适用于CentOS 6.X,亲测可行,估计也适用于其他Linux发行版。

1. 准备工作
1.1 下载源码包

Linux内核版本有两种:稳定版和开发版 ,Linux内核版本号由3个数字组成:r.x.y

r: 主版本号
x: 次版本号,偶数表示稳定版本;奇数表示开发中版本。
y: 修订版本号 , 表示修改的次数

去 http://www.kernel.org 首页,可以看到有stable, longterm等版本,longterm是比stable更稳定的版本,会长时间更新,因此我选择 3.18.20,
wget  https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.20.tar.xz

1.2 解压
tar -xf linux-3.18.20.tar.xz

1.3 更新当前系统
sudo yum update
sudo yum upgrade

1.4 安装编译内核所需要的软件包
sudo yum groupinstall “Development Tools” # 一口气安装编译时所需的一切工具
sudo yum install ncurses-devel #必须这样才能让 make *config 这个指令正确地执行。
sudo yum install qt-devel #如果你没有 X 环境,这一条可以不用
sudo yum install hmaccalc zlib-devel binutils-devel elfutils-libelf-devel #创建 CentOS-6 内核时需要它们

2 配置文件
2.1 查看当前系统内核
uname -r
2.6.32-431.el6.x86_64

2.2 将当前系统的配置文件拷贝到当前目录
cp /boot/config-2.6.32-431.el6.x86_64 .config

2.3 使用旧内核配置,并自动接受每个新增选项的默认设置
sh -c ‘yes “” | make oldconfig’

make
oldconfig会读取当前目录下的.config文件,在.config文件里没有找到的选项则提示用户填写,然后备份.config文件
为.config.old,并生成新的.config文件,参考
http://stackoverflow.com/questions/4178526/what-does-make-oldconfig-do-exactly-linux-kernel-makefile

3 编译
sudo make -j8 bzImage #生成内核文件
sudo make -j8 modules #编译模块
sudo make -j8 modules_install #编译安装模块

要严格按照这个顺序进行编译
不能合并成一句,sudo make -j8 bzImage modules modules_install。

-j 后面的数字是线程数,用于加快编译速度,一般的经验是有几个核心-j 后面的数字是几

4 安装
sudo make install

如果出现了 ERROR: modinfo: could not find module xxx,数量少的话,可以忽略。

5 修改Grub引导顺序

安装完成后,需要修改Grub引导顺序,让新安装的内核作为默认内核
编辑 grub.conf文件, sudo vim /etc/grub.conf

数一下刚刚新安装的内核在哪个位置,从0开始,然后设置default为那个数字,一般新安装的内核在第一个位置,所以设置default=0。
^_^[22:16:23][[email protected] ~]#cat /etc/grub.conf | grep -v ^#
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (3.18.20)
root (hd0,0)
kernel /vmlinuz-3.18.20 ro root=/dev/mapper/vg_master01-lv_root
rd_NO_LUKS rd_LVM_LV=vg_master01/lv_root LANG=en_US.UTF-8 rd_NO_MD
SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us
rd_LVM_LV=vg_master01/lv_swap rd_NO_DM rhgb quiet
initrd /initramfs-3.18.20.img

6 重启
sudo reboot
重启后,看一下当前内核版本号,
#uname -r
^_^[22:18:49][[email protected] ~]#uname  -a
Linux suzf.net 3.18.20 #1 SMP Sun Aug 16 21:28:29 CST 2015 x86_64 x86_64 x86_64 GNU/Linux

成功啦!! 哇哈哈 !!

7 如果失败,则重新循环
如果失败,重新开始的话,要清理上次编译的现场
make mrproper #清理上次编译的现场
然后转到第2步,重新开始。

FAQ:

ERROR: modinfo: could not find module xxx

原因分析:在make
install时,为了让新内核中不缺少所需module,会先检查当前系统已经加载了的module(lsmod命令可查看),然后对比新安装的内核模
块,如果新的内核模块中缺少一些module(和当前lsmod命令的输出做对比),就会报“ERROR: modinfo: could not
find module power_meter”这样的错误信息。

具体来说,缺少相应module而报错,大致可分为3种情况:
1. 确实是缺少了某个module,其解决方法是:如果报的module对于你来说是有用,检查编译kernel时的.config文件,加上对应的配置(配为=m),重新编译和安装modules即可;如果你觉得这个module没啥用,大可不必管它了。

2.
新编译的kernel已经将该选项编译进kernel了(.config中选择为=Y),从而不需要生成这个module的.ko文件,系统找不到对应
的.ko文件,但是已经在新内核中了,不必理会这个报错。例如,上面的“ERROR: modinfo: could not find module
ext4”是因为我将EXT4文件系统模块编译为built-in了

3. 模块的名称变了,用当前系统lsmod命令查找的模块名称,在新编译的内核中找不到module了

时间: 2024-10-08 13:05:04

How-to: Update the Linux kernel的相关文章

Linux Kernel - Debug Guide (Linux内核调试指南 )

http://blog.csdn.net/blizmax6/article/details/6747601 linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 建立调试环境 发行版的选择和安装 安装交叉编译工具 bin工具集的使用 qemu的使用 initrd.img的原理与制作 x86虚拟调试环境的建立 arm虚拟调试环境的建立 arm开发板调试环

使用 GIT 获得Linux Kernel的代码并查看,追踪历史记录

Linux kernel  的官方 GIT地址是: http://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git 可以从这个地址拿到 kernel 的 代码仓库. 1. 拿代码仓库 [plain] view plaincopyprint? git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git 2. 查看状态: [pla

2. ubuntu下载编译linux kernel

一. 引言 诚如老罗所言,android源代码里面并没有带linux kernel代码.它使用的是预先编译好的kernel,大家可以使用adb shell cat proc/version就可以查看到,如下: [email protected]:~/working_directory$ adb shell cat proc/version Linux version 2.6.29-00261-g0097074-dirty ([email protected]) (gcc version 4.4.

video : Write and Submit your first Linux kernel Patch

http://v.youku.com/v_show/id_XNDMwNzc3MTI4.html After working with Linux (mostly as an advanced user) for years, I decided to post my first p=linux/kernel/git/x86/linux-2.6-tip.git;a=commitdiff;h=e19e074b1525d11a66c8e3386fec7db248ad3005" style="

How to: Compile Linux kernel 2.6

  Compiling custom kernel has its own advantages and disadvantages. However, new Linux user / admin find it difficult to compile Linux kernel. Compiling kernel needs to understand few things and then just type couple of commands. This step by step ho

redhat 6.4 安装VirtualBox自动增强功能功:unable to find the sources of your current Linux kernel

redhat 6.4 安装VirtualBox自动增强功能功能的时候提示: building the main Guest Additions module FAILED unable to find the sources of your current Linux kernel. Specify KERN_DIR-<directory> and run Make again 这个时候需要检测gcc make kernel-level kernel-header 等文件是否安装.具体使用如下

Linux Kernel 2.6.28 以上有BUG,系统运行第208.5天down机

简介: 业务服务器有一台服务器出现意外down机,服务器ping 不通.无法登陆,本想通过公司KVM系统登陆系统重启解决,登陆KVM后发现系统屏幕打印大量的内核错误,KVM无法使用.无法发送重启服务器.果断联系 机房人员帮助手工重启,手动重启服务器后服务器运行状态回归正常. 在服务器重启前通过KVM管理系统能看到系统屏幕上打印的内核错误,此时做了一个页面截屏,后根据屏幕打印的报错关键字,进行查找追踪发现原来我们的linux服务器内核bug问题导致. 此内核BUG问题会直接导致服务器down机,查

Getting into Linux Kernel Development 【Share】

Ref: https://www.cyphar.com/blog/post/getting-into-linux-kernel-development I don't know about you, but I've always found the idea of operating system kernels to be some mysterious and esoteric programming skill. Its importance cannot be overstated o

关于Linux Kernel 2.6.28 以上有缺陷,在第208.5天自行重啟的问题

    今天看到一转帖如下: Linux Kernel 2.6.28 以上有缺陷,在第208.5天自行重啟 https://access.redhat.com/knowledge/solutions/68466 sched_clock() overflow around 208.5 days in Linux Kernellast modified by Raghu Udiyar on 04/10/12 - 09:12Issue Linux Kernel panics when sched_cl