前言
为了定位 keepalived VIP 的问题, 一步一步定位到 IPVS, IPVS 默认是没有打开 Debug 模式的, 若需要打开 Debug 模式需要重新编译 IPVS 模块加载后才行, 最好的方式当然是仅仅编译 IPVS 模块就行, 但是实践过程中发现单独编译 IPVS 模块存在诸多问题, 暂且先放一放, 后续再整理整理单独编译 IPVS 模块的文章.
编译
查看编译机器 Linux 内核版本
先查看本地主机内核版本, 这一步主要是为了防止应用切换内核版本后不兼容, 故编译的内核尽量确保跟原本内核版本一致
- [root@10-10-88-195 ~]# uname -a
- Linux 10-10-88-195 3.10.0-693.el7.x86_64 #1 SMP Thu Jul 6 19:56:57 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux
- [root@10-10-88-195 ~]#
- [root@10-10-88-195 ~]# cat /etc/RedHat-release
- Red Hat Enterprise Linux Server release 7.4 (Maipo)
下载解压
下载 Linux 源码
注: 从 RedHat 上面下载需要注册账号
最官方的方式当然是从上面去下载, 但是找了一圈发现上面没有 3.10.0 版本的内核, 好在上面有找到版本一致的内核
* 进入 [RedHat](https://access.RedHat.com/downloads/content/RHEL---7/x86_64/2456/kernel/3.10.0-693.el7/x86_64/fd431d51/package) 选择 693 版本
* 下载 Source Package
* 将 rpm 包下载到 `~/root/` 目录下
- [root@10-10-88-195 ~]# ls -lh
- total 89M
- -rw-------. 1 root root 1.6K Jun 13 11:48 anaconda-ks.cfg
- -rw-r--r-- 1 root root 89M Jul 13 2017 kernel-3.10.0-693.el7.src.rpm
- [root@10-10-88-195 ~]#
通过 rpm -ivh 安装, 可能会有 warning, 可忽略
- [root@10-10-88-195 kernels]# rpm -ivh kernel-3.10.0-693.el7.src.rpm
- warning: kernel-3.10.0-693.el7.src.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
- Updating / installing...
- 1:kernel-3.10.0-693.el7 ################################# [100%]
安装完成之后默认会在~/root 目录下生成一个 rpmbuild 文件夹
- [root@10-10-88-195 ~]# ls -lh
- total 89M
- -rw-------. 1 root root 1.6K Jun 13 11:48 anaconda-ks.cfg
- -rw-r--r-- 1 root root 89M Jul 13 2017 kernel-3.10.0-693.el7.src.rpm
- drwxr-xr-x 4 root root 34 Sep 26 17:37 rpmbuild
- [root@10-10-88-195 ~]#
进入到 / root/rpmbuild/SOURCES 目录可以看到 Linux-3.10.0-693.el7.tar.xz, 解压到当前目录下
[root@10-10-88-195 SOURCES]# tar -xvf Linux-3.10.0-693.el7.tar.xz
依赖安装
编译工具安装
- [root@10-10-40-97 Linux-3.10.0-693.el7]# yum groupinstall -y "Development Tools"
- bc
千万千万不要漏掉了 bc 这个小工具, 就因为漏掉了 bc, make 的时候没有报错, 但是就是编译不出来 vmlinux
[root@10-10-40-98 Linux-3.10.0-693.el7]# yum install -y bc
安装内核需要
[root@10-10-88-195 Linux-3.10.0-693.el7]# yum install -y elfutils-libelf-devel
图形展示依赖
[root@10-10-88-195 Linux-3.10.0-693.el7]# yum install ncurses-devel -y
编译配置
进入到解压后的目录 / root/rpmbuild/SOURCES/Linux-3.10.0-693.el7
开始内核模块配置
[root@10-10-88-195 Linux-3.10.0-693.el7]# make menuconfig
成功后可以看到如下界面
进入 Networking support> Networking options> Network packet filtering framework (Netfilter)> IP virtual server support
选中 IP virtual server debugging, 按 y 勾选打开 IPVS 的 Debug 支持
选中 save
对于内核编译的配置到这一步就够了, 但是为了方便校验或者区别自己编译的内核, 最好给自己的编译的内核打上一个本地的版本号
进入 General setup ->
选中 Local version - append to kernel release, 按 enter 进入
比如添加一个 icebug 的本地版本号
保存退出即可
编译
接下来就是编译内核了, 为了编译能够快一些, 可以选择多开几个线程进行编译
查看 CPU 核数
- [root@10-10-88-195 Linux-3.10.0-693.el7]# grep -c processor /proc/cpuinfo
- 8
- [root@10-10-88-195 Linux-3.10.0-693.el7]#
选择 CPU 核数的 2 倍线程数进行编译
[root@10-10-88-195 Linux-3.10.0-693.el7]# make -j16
可以看到系统负载已经占满了
接下来就是等待....
安装编译好的内核模块
[root@10-10-88-195 Linux-3.10.0-693.el7]# make modules_install
安装内核
- [root@10-10-88-195 Linux-3.10.0-693.el7]# make install
- sh ./arch/x86/boot/install.sh 3.10.0-icebug arch/x86/boot/bzImage \
- System.map "/boot"
- [root@10-10-88-195 Linux-3.10.0-693.el7]#
一般到这一步内核的编译安装就可以结束来, 通过 VNC 选择要启动的内核即可
由于测试机器是跑在一台物理机上的虚拟机, 这里通过 virsh vncdisplay 查看虚拟机的 VNC 连接, 前提是已经安装 VNC server
continue
登陆并 reboot
按 ESC 进入到启动菜单选择
选择自己编译的内核
进入通过运行 uname -a 发现已经是新内核了
设置 IPVS debug level, 先确保 ip_vs 模块已经被加载了, 没加载的话是没有 / proc/sys.NET/ipv4/vs 这个目录的
加载 ip_vs 模块, 可以直接通过 modprobe, 也可以直接通过运行 ipvsadm 加载, 通过 lsmod 可以发现 ip_vs 模块已经被加载了
- [root@10-10-88-195 Linux-3.10.0-693.el7]# modprobe ip_vs
- [root@10-10-88-195 Linux-3.10.0-693.el7]# lsmod | grep ip_vs
- ip_vs 181385 0
- nf_conntrack 133387 6 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4
- libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack
- [root@10-10-88-195 Linux-3.10.0-693.el7]#
可以看到已经有 / proc/sys.NET/ipv4/vs 这个目录了, 我们需要修改的是 / proc/sys.NET/ipv4/vs/debug_level
默认 debug level 为 0
- [root@10-10-88-195 Linux-3.10.0-693.el7]# cat /proc/sys.NET/ipv4/vs/debug_level
- 0
- [root@10-10-88-195 Linux-3.10.0-693.el7]#
可以设置的 debug level 范围为 [0-12], 一般设置 debug level 为 8 就差不多了, 再往上的话会把具体每个连接的信息都打印出来
- [root@10-10-88-195 Linux-3.10.0-693.el7]# echo 8> /proc/sys.NET/ipv4/vs/debug_level
- [root@10-10-88-195 Linux-3.10.0-693.el7]# cat /proc/sys.NET/ipv4/vs/debug_level
- 8
- [root@10-10-88-195 Linux-3.10.0-693.el7]#
再通过 sysctl 验证设置是否生效, 可以看到 net.ipv4.vs.debug_level 已经被设置为 8 了
- [root@10-10-88-195 Linux-3.10.0-693.el7]# sysctl -a | grep debug_level
- sysctl: reading key "net.ipv6.conf.all.stable_secret"
- sysctl: reading key "net.ipv6.conf.default.stable_secret"
- sysctl: reading key "net.ipv6.conf.docker0.stable_secret"
- sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
- sysctl: reading key "net.ipv6.conf.eth1.stable_secret"
- sysctl: reading key "net.ipv6.conf.lo.stable_secret"
- net.ipv4.vs.debug_level = 8
- [root@10-10-88-195 Linux-3.10.0-693.el7]#
通过 dmesg 查看内核输出信息 (IPVS 日志)
dmesg 具体参数用法可以通过 dmesg -h 查看, 示例为 -H (human readable) -e (show local time and time delta in readable format) -w (follow / wait for new message)
[root@10-10-88-195 Linux-3.10.0-693.el7]# dmesg -Hew
启动 keepalived 测试一下
- [root@10-10-88-195 Linux-3.10.0-693.el7]# systemctl start keepalived
- [root@10-10-88-195 Linux-3.10.0-693.el7]#
可以看到 debug 信息已经多了不少
参考
- https://www.Linux.com/learn/intro-to-Linux/2018/4/how-compile-Linux-kernel-0
- http://kozlex.blogspot.com/2015/05/build-RedHat-7-custom-kernel.html
来源: https://www.cnblogs.com/dspace/p/9714936.html