寄存地

In order to be irreplaceable, one must always be different

0%

Centos 升级内核

Linux 只是个内核。在正常操作期间,内核负责执行两个重要任务:

  1. 作为硬件和系统上运行的软件之间的接口。
  2. 尽可能高效地管理系统资源。 为此,内核通过内置的驱动程序或以后可作为模块安装的驱动程序与硬件通信。

随着新的设备和技术定期出来,如果我们想充分利用它们,保持最新的内核就很重要。此外,更新内核将帮助我们利用新的内核函数,并保护自己免受先前版本中发现的漏洞的攻击。

包管理工具升级

检查已安装的内核版本

让我们安装了一个发行版,它包含了一个特定版本的内核。为了展示当前系统中已安装的版本,我们可以:

1
# uname -sr
1
2
s 打印出内核名;
r 打印出内核release版本;

Linux官网可看到当前最新的内核版本。如果你当前使用的版本接近它的生命周期结束,那么在该日期后将不会提供更多的 bug 修复。关于更多信息,请参阅内核发布页。

在 CentOS 中升级内核

大多数现代发行版提供了一种使用 yum 等包管理系统和官方支持的仓库升级内核的方法。这会使内核升级到仓库中可用的最新版本,而非官网中可用的最新版本。不幸的是,Red Hat 只允许使用前者升级内核。

与 Red Hat 不同,CentOS 允许使用 ELRepo,这是一个第三方仓库,可以将内核升级到最新版本。要在 CentOS 7 上启用 ELRepo 仓库,请运行:

1
2
# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
1
2
此方法基于ELRepo项目,因此需要导入此项目的KEY;
release-7.0 是指 centos7 或 RH7,具体可参考 http://www.elrepo.org。

仓库启用后,你可以使用下面的命令列出可用的内核相关包:

1
# yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
1
2
禁用ELRepo项目中所有存储库,之后使能名为“elrepo-kernel”的存储库。
其他存储库有“elrepo-extras”、“elrepo-testing”。

接下来,安装最新的主线稳定内核:

1
# yum --enablerepo=elrepo-kernel install kernel-ml
1
2
kernel-ml 指 Linux mainline(主线)分支;
kernel-lt 指 Linux longterm(长期维护)分支;

最后,重启机器并选择最新内核,接着运行下面的命令检查最新内核版本:

1
# uname -sr

设置 GRUB 默认的内核版本

打开并编辑 /etc/default/grub 并设置 GRUB_DEFAULT=0。意思是 GRUB 初始化页面的第一个内核将作为默认内核。

1
2
3
4
5
6
7
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=0
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

接下来运行命令来重新创建内核配置:

1
# grub2-mkconfig -o /boot/grub2/grub.cfg

重启并验证最新的内核已作为默认内核。

源码升级

检查已安装的内核版本

1
# uname -sr

下载内核包并解压

1
2
3
# wget -c http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.2.2.tar.bz2
# tar jxvf linux-3.2.2.tar.bz2
# cd linux-3.2.2

配置内核并安装

清除环境变量

1
# make mrproper

删除所有的编译生成文件, 还有内核配置文件, 再加上各种备份文件。或者仅仅使用

1
# make clean

删除大多数的编译生成文件, 但是会保留内核的配置文件.config, 还有足够的编译支持来建立扩展模块。

编译配置表

配置时,以下方式选其一即可。

当前系统拷贝

选取/boot/config-XXX文件,拷贝到代码目录。

1
# cp /boot/config-3.10.0-693.2.2.el7.x86_64  .config
defconfig命令
1
# make defconfig

获取当前系统参数并写入.config文件。之后可使用“make menuconfig”进行定制化。

问答式配置
1
# make localmodconfig

可一直回车选择默认配置。

命令界面配置
1
# make oldconfig

自动载入既有的.config配置文件,并且只有在遇到先前没有设定过的选项时,才会要求手动设定。

交互模式
1
# make menuconfig

找到以下选中选项并选中networking support → networking options → network packet filtering framework(netfilter)

  1. Core netfilter configuration
    • 勾中”Netfilter connection tracking support” -m state相关模块是依赖它的,不选则没有。
    • 将netbios name service protocal support(new) 编译成模块,不然后面升级iptables后启动时会出错。
    • 勾中“Netfilter Xtables support (required for ip_tables)”
  2. IP: Netfilter Configuration
    • 将 “IPv4 connection tracking support (require for NAT)” 编译成模块。
    • 勾中IP tables support (required for filtering/masq/NAT) 。
    • 将 “Full NAT” 下的 “MASQUERADE target support” 和 “REDIRECT target support” 编译成模块
  3. 其它模块可以根据自己的需要进行选择,若不懂可以参考内核配置手册。

编译内核

生成内核文件

1
# make bzImage

编译模块

1
# make modules

或者直接 make 。 make = make bzImage + make modules。

安装模块

1
# make modules_install

安装内核

1
# make install

此步会:

  • 重新制作内核映像文件,mkinitramfs -o /boot/initrd.img-XXX
  • 更新制作的内核映像文件,update-initramfs -c -k XXX
  • 自动修改系统引导配置,产生或更新boot/grub/grub.cfg启动文件,文件中增加了新内核版本号的启动项,update-grub2

之后重启即可。

重启之后内核未改变,则编辑 /etc/grub.conf 文件,将 default=1 改为 default=0。

内核包(YUM)升级

获取源

从下面三个地址从获取想要的内核:

  1. 官方源
  2. 香港源
  3. scientific源,根据需要选择不同的源,例如,http://ftp.scientificlinux.org/linux/scientific/7.0/x86_64/updates/security/。

安装

可下载到本地或者直接在线安装:

1
# yum install -y http://hkg.mirror.rackspace.com/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-4.5.2-1.el7.elrepo.x86_64.rpm

修改文件

升级完内核,自动按最新内核启动,修改/etc/default/grub,GRUB_DEFAULT=0。

重新编译内核启动文件,以后升级完内核也要执行一次。

1
# grub2-mkconfig -o /boot/grub2/grub.cfg
1
Tip: Centos 6.x 仅修改 /etc/grub.conf文件 default 即可。此文件中列出了所有的内核(title),顺序由 0 开始。

删除旧内核

  1. 列出当前所用内核

    1
    # uname -sr
  2. 列出系统所有内核

    1
    # rpm -qa | grep kernel

    Debian/ Ubuntu Linux 用户,使用:

    1
    # dpkg --list 'linux-image*' 
  3. 删除内核

    1
    # rpm -e kernel-XXX

    1
    # yum autoremove kernel-XXX

    Debian/ Ubuntu Linux 用户,使用:

    1
    # apt-get remove kernel-XXX

更改内核启动顺序

Centos 6.x 和 Centos 7.x的不同在于:前者使用grub引导,而后者使用grub2引导。关于内核升级请查看 《Centos 内核升级》

Centos 6.x

修改 /etc/grub.conf 文件即可。

1
2
3
default :启动顺序。内核名称即是以title开始的行,从 0 开始计数。
timeout :系统启动时的等待时间。此时间段内可更改内核。
title :内核的标题名(启动时显示),可更改。

Centos 7.x

系统中的可用内核在 /boot/grub2/grub.cfg 文件中,可使用下面的命令查看:

1
2
3
4
5
6
7
8
9
10
# cat /boot/grub2/grub.cfg |grep menuentry
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
menuentry_id_option=""
export menuentry_id_option
menuentry 'CentOS Linux (3.10.0-693.5.2.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-693.5.2.el7.x86_64-advanced-3e109aa3-f171-4614-ad07-c856f20f9d25' {
menuentry 'CentOS Linux (3.10.0-693.2.2.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-693.2.2.el7.x86_64-advanced-3e109aa3-f171-4614-ad07-c856f20f9d25' {
menuentry 'CentOS Linux (3.10.0-514.26.2.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-514.26.2.el7.x86_64-advanced-3e109aa3-f171-4614-ad07-c856f20f9d25' {
menuentry 'CentOS Linux (3.10.0-514.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-514.el7.x86_64-advanced-3e109aa3-f171-4614-ad07-c856f20f9d25' {
menuentry 'CentOS Linux (0-rescue-b7ab9add9a761df2e33b16b2038dbf9c) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-b7ab9add9a761df2e33b16b2038dbf9c-advanced-3e109aa3-f171-4614-ad07-c856f20f9d25' {

利用命令 grub2-set-default 来修改启动顺序 或者 根据命令原理来修改文件 /etc/default/grub。

1
# grub2-set-default 'CentOS Linux (3.10.0-514.26.2.el7.x86_64) 7 (Core)' 

查看是否生效:

1
2
# grub2-editenv list
saved_entry=CentOS Linux (3.10.0-514.26.2.el7.x86_64) 7 (Core)

设置生效后需要重启设备才能真正应用。

参考资料

Debian、CentOS 升级内核至当前最新稳定版

如何在 CentOS 7 中安装或升级最新的内核

CentOS Linux 升级内核步骤、方法

安全删除linux旧内核的方法

KernelBuild