Centos 7内核编译及基础工具升级实践

date
Jul 28, 2021
slug
centos7-kernel-compile-and-basic-tools-upgrade
status
Published
tags
Website
summary
由于业务需要依赖大量内核新特性,而单纯升级内核而不更新工具会导致潜在的问题或功能缺失。 所以本文除了内核更新以外也会更新对应的管理工具,例如iproute2之类的。
type
Post

环境和目的

CentOS 7 最小化安装
由于业务需要依赖大量内核新特性,而单纯升级内核而不更新工具会导致潜在的问题或功能缺失,比如内核支持而iproute不支持mpls,或ss输出的信息非常有限,一些实用的小功能没有等。
同时默认内核编译不支持vrf exec。
故而本文针对性的对于内核更新带来的网络功能,也更新对应的管理工具,iproute2、iptables。

准备

预装包

yum install -y gcc make git ctags ncurses-devel openssl-devel
yum install -y bison flex elfutils-libelf-devel bc
#rpm包编译的依赖
yum install gcc rpm-build rpm-devel rpmlint make python bash coreutils diffutils patch rpmdevtools
mkdir ~/kernelbuild

源码

在这里下载 清华大学镜像站:
安全起见,可以科学上网的话建议从kernel.org下载,或下载后验证gpg
 
tar -xvJf linux-4.19.85.tar.xz
cd linux-4.19.85
make clean && make mrproper

内核配置

初始配置

复制初始配置,我这里使用的是4.19.0的默认配置

高级配置

这里使用新版ncurses配置器
make nconfig

编译和安装

make -j 16
如果是安装到本机,执行
make modules_install install
make install
rpm包编译,网上都说make rpm,不过会报错,用binrpm-pkg编出来会少个devel的rpm?
make rpm-pkg -j16
#make binrpm-pkg -j16
rpm安装和清理
 
#rpm -ivh 安装包
rpm -Uvh 似乎可以直接升级当前内核,安全时使用该方法
rpm -qa | grep kernel
yum remove 多余的包
调节启动顺序
grub2-set-default 0
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
rpm包默认路径/root/rpmbuild/RPMS/x86_64
参考

启动项配置

传统

过时的方法
egrep ^menuentry /boot/grub2/grub.cfg | cut -f 2 -d \' 
CentOS Linux (4.19.12-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-4de75e64d2d54ea49d12a4b730b2e839) 7 (Core)
推荐的方法
#配置
grub2-set-default 0
grub2-mkconfig -o /boot/grub2/grub.cfg
#查看默认启动内核
grubby --default-kernel

UEFI

egrep ^menuentry /etc/grub2-efi.cfg | cut -f 2 -d \'
grub2-set-default 0
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

iproute2

why

只有更新iproute2才能得以配置最新的内核网络特性。
例如所需的xfrm interface的配置能力。其他就是缺陷修正,功能增强(比如ss)等。

环境

#依赖
yum install libmnl-devel libcap-devel libdb-devel bison git libselinux-devel elfutils-libelf-devel libmnl-devel gcc -y
yum install flex 

安装

git clone git://git.kernel.org/pub/scm/linux/kernel/git/shemminger/iproute2.git
cd iproute2
#git tag查看标签
git checkout v4.19.0
./configure

make 
#make DESTDIR=`pwd`/dist install
#上面这么装貌似有问题
make install
打包安装很简单,将编译目录打个tar压缩包,拷贝到其他相同系统上解压,进去执行安装命令即可。

iptables

why

为什么不使用firewalld替代iptables?
因为firewalld的机制在单机管理时易用性较好(如果不熟悉iptables的话),但当需要一系列高级功能时,组件或功能缺失非常严重。
例如geo模块,ipset,u32 string匹配等等。
对于复杂的需求,暂时无法完全用firewalld替代。

特性支持

1.6以上
  1. 高版本支持原子提交
  1. 批量规则设置更新只发一条netlink message

nftables

why?

统一框架,iptables用了四套类似的框架实现,nftables将其统一。
容易混淆,比如ebtables和iptables之间的关系等。
iptables没有api支持,程序控制起来比较蛋疼
nftables可以保证原子操作,多个修改同时执行不会导致问题。
v4和v6双栈管理在一套东西里面,不需要分iptables, ip6tables这种奇怪的用法。
原生支持集合、字典和映射,集成ipset的能力,不需要再单独管理ipset,比如常见的问题是忘记存ipset规则导致ipset组名重启后没有创建,iptables的规则整个加载出问题。
没有预置大量的默认链,按需使用,据称性能损耗比iptables小。

环境

我们的目标是编译安装最新版本的nftables而非yum内的0.8,因为0.8是17年的版本了,怕项目需要的特性当时没加上去,导致白费力气。
依赖libmnllibnftnl,centos7带的版本老,老老实实编译吧。
yum -y install gcc libtool
git clone https://git.netfilter.org/libmnl/
cd libmnl/
git checkout libmnl-1.0.4
./autogen.sh
./configure
make
make install
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
cd ..
git clone https://git.netfilter.org/libnftnl/
./autogen.sh
./configure
make 
make install
如果提示libmnl版本不对
notion image
解决方法
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

安装

编译
yum -y install asciidoc gmp-devel
git clone https://git.netfilter.org/nftables/
git checkout v0.9.8
./autogen.sh
./configure
make
make install
检查nft命令是否存在,并测试 nft list ruleset
 

Btrfs-progs

#依赖安装
yum install xz-devel lz4-devel gcc
wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/libzstd-1.5.0-1.el7.x86_64.rpm
wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/libzstd-devel-1.5.0-1.el7.x86_64.rpm
rpm -Uvh libzstd-1.5.0-1.el7.x86_64.rpm
rpm -Uvh libzstd-devel-1.5.0-1.el7.x86_64.rpm
yum install libuuid-devel libblkid-devel zlib-devel libzstd-devel e2fsprogs reiserfs-utils xmlto source-highlight libattr-devel lzo-devel
yum install asciidoc e2fsprogs-devel python3 python3-devel autoconf automake
#安装本体
wget https://git.kernel.org/pub/scm/linux/kernel/git/kdave/btrfs-progs.git/snapshot/btrfs-progs-5.13.tar.gz
tar xzvf btrfs-progs-5.13.tar.gz
cd btrfs-progs-5.13.tar.gz
./autogen.sh
./configure
make & make install

GCC升级

yum install centos-release-scl scl-utils-build
#列出
yum install devtoolset-9-gcc

© WooDragon 2018 - 2021