Centos 升级内核
Linux 只是个内核。在正常操作期间,内核负责执行两个重要任务:
- 作为硬件和系统上运行的软件之间的接口。
- 尽可能高效地管理系统资源。 为此,内核通过内置的驱动程序或以后可作为模块安装的驱动程序与硬件通信。
随着新的设备和技术定期出来,如果我们想充分利用它们,保持最新的内核就很重要。此外,更新内核将帮助我们利用新的内核函数,并保护自己免受先前版本中发现的漏洞的攻击。
包管理工具升级
检查已安装的内核版本
让我们安装了一个发行版,它包含了一个特定版本的内核。为了展示当前系统中已安装的版本,我们可以:
1 | uname -sr |
1 | s 打印出内核名; |
Linux官网可看到当前最新的内核版本。如果你当前使用的版本接近它的生命周期结束,那么在该日期后将不会提供更多的 bug 修复。关于更多信息,请参阅内核发布页。
在 CentOS 中升级内核
大多数现代发行版提供了一种使用 yum 等包管理系统和官方支持的仓库升级内核的方法。这会使内核升级到仓库中可用的最新版本,而非官网中可用的最新版本。不幸的是,Red Hat 只允许使用前者升级内核。
与 Red Hat 不同,CentOS 允许使用 ELRepo,这是一个第三方仓库,可以将内核升级到最新版本。要在 CentOS 7 上启用 ELRepo 仓库,请运行:
1 | rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org |
1 | 此方法基于ELRepo项目,因此需要导入此项目的KEY; |
仓库启用后,你可以使用下面的命令列出可用的内核相关包:
1 | yum --disablerepo="*" --enablerepo="elrepo-kernel" list available |
1 | 禁用ELRepo项目中所有存储库,之后使能名为“elrepo-kernel”的存储库。 |
接下来,安装最新的主线稳定内核:
1 | yum --enablerepo=elrepo-kernel install kernel-ml |
1 | kernel-ml 指 Linux mainline(主线)分支; |
最后,重启机器并选择最新内核,接着运行下面的命令检查最新内核版本:
1 | uname -sr |
设置 GRUB 默认的内核版本
打开并编辑 /etc/default/grub 并设置 GRUB_DEFAULT=0。意思是 GRUB 初始化页面的第一个内核将作为默认内核。
1 | GRUB_TIMEOUT=5 |
接下来运行命令来重新创建内核配置:
1 | grub2-mkconfig -o /boot/grub2/grub.cfg |
重启并验证最新的内核已作为默认内核。
源码升级
检查已安装的内核版本
1 | uname -sr |
下载内核包并解压
1 | wget -c http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.2.2.tar.bz2 |
配置内核并安装
清除环境变量
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)
- Core netfilter configuration
- 勾中”Netfilter connection tracking support” -m state相关模块是依赖它的,不选则没有。
- 将netbios name service protocal support(new) 编译成模块,不然后面升级iptables后启动时会出错。
- 勾中“Netfilter Xtables support (required for ip_tables)”
- 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” 编译成模块
- 其它模块可以根据自己的需要进行选择,若不懂可以参考内核配置手册。
编译内核
生成内核文件
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)升级
获取源
从下面三个地址从获取想要的内核:
- 官方源
- 香港源
- 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
uname -sr
列出系统所有内核
1
rpm -qa | grep kernel
Debian/ Ubuntu Linux 用户,使用:
1
dpkg --list 'linux-image*'
删除内核
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 | default :启动顺序。内核名称即是以title开始的行,从 0 开始计数。 |
Centos 7.x
系统中的可用内核在 /boot/grub2/grub.cfg 文件中,可使用下面的命令查看:
1 | cat /boot/grub2/grub.cfg |grep menuentry |
利用命令 grub2-set-default 来修改启动顺序 或者 根据命令原理来修改文件 /etc/default/grub。
1 | grub2-set-default 'CentOS Linux (3.10.0-514.26.2.el7.x86_64) 7 (Core)' |
查看是否生效:
1 | grub2-editenv list |
设置生效后需要重启设备才能真正应用。