如何通过编译Linux内核打开IPVS(LVS)的debug模式
前言
为了定位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上面下载需要注册账号
最官方的方式当然是从kernel.org上面去下载, 但是找了一圈发现kernel.org上面没有3.10.0版本的内核, 好在redhat上面有找到版本一致的内核
* 进入[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
如何通过编译Linux内核打开IPVS(LVS)的debug模式的更多相关文章
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #2 如何编译Linux内核
HACK #2 如何编译Linux内核 本节介绍编译Linux内核的方法.当发现bug而修改源代码或者添加新功能时,就需要对内核进行重新编译,生成二进制映像文件.另外,如果想要使用发布版内核中无效的功 ...
- 如何解决编译linux内核(解决声卡问题),遭遇fatal error: linux/limits.h: 没有那个文件或目录
最近帮一位上海的朋友搞一块小板,在ubuntu15.04 vivid上已经加载了对应了.ko驱动包 但关键是系统根本就枚举不到该声卡ALC5640,试了OpenSUSE也是一样的结果,看来是内核漏加载 ...
- Centos下编译Linux内核
Linux内核编译是一件简单却费事的事.但是独立的编译linux内核会帮助你很好的理解Linux内核的工作机理. 首先编译linux内核我们需要在当前linux操作系统下安装gcc编译器,因为我是Ce ...
- 编译linux内核时出错
在编译linux内核的时候使用make menuconfig 可能出现下面的错误 *** Unable to find the ncurses libraries or the*** required ...
- Mac下重新编译Linux内核
Mac下重新编译Linux内核 操作系统实验,要求添加系统调用并重新编译内核,这里记录一下编译内核的过程 0.下载VirtualBox 博主一直用parallel desk,但因为驱动等问题,在PD上 ...
- 为什么要编译Linux内核?
新的内核修订了旧内核的bug,并增加了许多新的特性.如果用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效,更稳定的内核,就需要重新编译Linux内核. 通常,更新的内核会支持更多的硬件,具 ...
- 编译Linux内核(Mac OS平台)
操作系统第一次实验需要编译Linux内核,我之前在Mac上一直使用的都是Parallels Desktop这个软件,所以这次也将课程网站上提供的Ubuntu安装在了PD上,但是编译完内核后无法进入Ub ...
- 自定义配置编译linux内核
1 编译linux内核原因一般情况下,我们是不需要重新去编译linux内核的,但如果你发现你需要修改内核的某个部分或者说你需要的某个模块并没有编译进内核,那里你可以通过重新编译内核来满足你的需求,比如 ...
- make 编译 linux 内核是单线程的任务 才用-j4命令使用4 线程加速
今天使用 make 编译 linux 内核,发现CPU只用了30%多一点,而我的电脑是4核的,所以如果没有意外的话,make 编译 linux 内核的任务是用单线程做的. 又了解到,使用-j4参数可以 ...
随机推荐
- 自定制Centos7.3系统镜像(ISO)
本文主要介绍如何根据官方的Centos镜像文件,在保留原有默认安装的RPM包的基础下,添加自己所需要的RPM包的,最终生成一个自定制版的ISO,节省了宝贵的时间并确保了安装的定制性.对于其他没有介绍的 ...
- 国内互联网公司UED博客
1,淘宝UED http://ued.taobao.com/blog淘宝网用户体验团队博客,有关用户体验设计和研究的经验分享.UED的本意是用户体验设计,是英文User Experience De ...
- CodeForces - 893D 贪心
http://codeforces.com/problemset/problem/893/D 题意 Recenlty Luba有一张信用卡可用,一开始金额为0,每天早上可以去充任意数量的钱.到了晚上, ...
- Nginx插件之openresty反向代理和日志滚动配置案例
Nginx插件之openresty反向代理和日志滚动配置案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.openresty介绍 1>.Nginx介绍 Nginx是一款 ...
- 安装MACOS操作步骤详解
安装MACOS操作步骤详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于安装MAC的操作系统其实大家都知道可以让客服帮忙提供软件上的支持,而且苹果客服都很有礼貌呢,而且非常的 ...
- System.Runtime.InteropServices.COMException:“服务器出现意外情况。 (异常来自
.Net MVC导出Excel的时候,一直报错,如题.原因是因为福昕阅读器,这样设置 execl->点击文件>选项>加载项,选择com加载项,把祈福阅读器勾掉.
- python---session(最终版)__setitem__和__getitem__方法
一般来说对于其他语言session值一般获取方法为session['name'],赋值使用session['name']=val 对于python类中含有一些魔术方法__setitem__,__get ...
- java的排序类 Collections
场景:比如说有一个List<Student> 里面有许多学生 我们想让这些学生按照年龄的大小排序 我们可以用java自带的 java.util.Collections 工具类来实现 Col ...
- 在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解失效的原因和解决方法
参考原贴地址:https://blog.csdn.net/clementad/article/details/47339519 在同一个类中,一个方法调用另外一个有注解(比如@Async,@Trans ...
- table中表头不动,表体产生滚动条
<div id="elec_table"> 2 <div class="table-head"> 3 <table> 4 & ...