如何通过编译Linux内核打开IPVS(LVS)的debug模式

前言

为了定位keepalived VIP的问题, 一步一步定位到IPVS, IPVS默认是没有打开Debug模式的, 若需要打开Debug模式需要重新编译IPVS模块加载后才行, 最好的方式当然是仅仅编译IPVS模块就行, 但是实践过程中发现单独编译IPVS模块存在诸多问题, 暂且先放一放, 后续再整理整理单独编译IPVS模块的文章.

编译

  • 查看编译机器Linux内核版本

先查看本地主机内核版本, 这一步主要是为了防止应用切换内核版本后不兼容, 故编译的内核尽量确保跟原本内核版本一致


[[email protected] ~]# 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

[[email protected] ~]#

[[email protected] ~]# 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/`目录下
[[email protected] ~]# 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
[[email protected] ~]#

通过 rpm -ivh 安装, 可能会有warning, 可忽略

[[email protected] 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文件夹

[[email protected] ~]# 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
[[email protected] ~]#

进入到/root/rpmbuild/SOURCES目录可以看到linux-3.10.0-693.el7.tar.xz, 解压到当前目录下

[[email protected] SOURCES]# tar -xvf linux-3.10.0-693.el7.tar.xz

依赖安装

  • 编译工具安装
[[email protected] linux-3.10.0-693.el7]# yum groupinstall -y "Development Tools"
  • bc

    千万千万不要漏掉了bc这个小工具, 就因为漏掉了bc, make的时候没有报错, 但是就是编译不出来vmlinux

[[email protected] linux-3.10.0-693.el7]# yum install -y bc
  • 安装内核需要
[[email protected] linux-3.10.0-693.el7]# yum install -y elfutils-libelf-devel
  • 图形展示依赖
[[email protected] linux-3.10.0-693.el7]# yum install ncurses-devel -y

编译配置

进入到解压后的目录/root/rpmbuild/SOURCES/linux-3.10.0-693.el7

  • 开始内核模块配置
[[email protected] 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核数
[[email protected] linux-3.10.0-693.el7]# grep -c processor /proc/cpuinfo
8
[[email protected] linux-3.10.0-693.el7]#
  • 选择CPU核数的2倍线程数进行编译
[[email protected] linux-3.10.0-693.el7]# make -j16

可以看到系统负载已经占满了

接下来就是等待....

  • 安装编译好的内核模块
[[email protected] linux-3.10.0-693.el7]# make modules_install
  • 安装内核
[[email protected] 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"
[[email protected] 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模块已经被加载了

[[email protected] linux-3.10.0-693.el7]# modprobe ip_vs
[[email protected] 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
[[email protected] linux-3.10.0-693.el7]#

可以看到已经有/proc/sys/net/ipv4/vs这个目录了, 我们需要修改的是/proc/sys/net/ipv4/vs/debug_level

默认debug level为0

[[email protected] linux-3.10.0-693.el7]# cat /proc/sys/net/ipv4/vs/debug_level
0
[[email protected] linux-3.10.0-693.el7]#

可以设置的debug level范围为[0-12], 一般设置debug level为8就差不多了, 再往上的话会把具体每个连接的信息都打印出来

[[email protected] linux-3.10.0-693.el7]# echo 8 > /proc/sys/net/ipv4/vs/debug_level
[[email protected] linux-3.10.0-693.el7]# cat /proc/sys/net/ipv4/vs/debug_level
8
[[email protected] linux-3.10.0-693.el7]#

再通过sysctl验证设置是否生效, 可以看到net.ipv4.vs.debug_level已经被设置为8了

[[email protected] 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
[[email protected] 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)

[[email protected] linux-3.10.0-693.el7]# dmesg -Hew

启动keepalived测试一下

[[email protected] linux-3.10.0-693.el7]# systemctl start keepalived
[[email protected] linux-3.10.0-693.el7]#

可以看到debug信息已经多了不少

参考

  1. https://www.linux.com/learn/intro-to-linux/2018/4/how-compile-linux-kernel-0
  2. http://kozlex.blogspot.com/2015/05/build-redhat-7-custom-kernel.html

原文地址:https://www.cnblogs.com/dspace/p/9714936.html

时间: 2024-11-17 07:34:34

如何通过编译Linux内核打开IPVS(LVS)的debug模式的相关文章

学习重新编译Linux内核

一.实验目的学习重新编译Linux内核,理解.掌握Linux内核和发行版本的区别. 二.实验内容在Linux操作系统环境下重新编译内核.实验主要内容:A. 查找并且下载一份内核源代码,本实验使用最新的Linux内核2.6.36.B. 配置内核.C. 编译内核和模块.D. 配置启动文件.本次实验环境是Linux2.6.35内核的环境下,下载并重新编译内核源代码(2.6.36):然后,配置GNU的启动引导工具grub,成功运行编译成功的内核. 三.主要仪器设备(必填)Linux环境:utuntu10

Ubuntu下载编译Linux内核。

1.安装git工具 2.到官网下载linux内核https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git,这个地址不是很好用 在用下面这个 git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git http://vger.kernel.org/vger-lists.html#linux-kernel这个是讨论Linux驱动的邮件组 3.

Vs2012在Linux开发中的应用(8): 编译Linux内核

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在有了UBOOT的编译基础之后,编译Linux内核就简单多了,所不同的只有两个地方,一个是错误信息的转换,另一个是内核需要进行参数配置. 1.1    错误信息转换 UBOOT的错误信息中,文件名是不带路径的,而内核的错误信息中,文件名是带相对路径的,因此我们对转换脚本略做修改: #user code begin classCUBootMake: error=False defBuild(sel

如何解决编译linux内核(解决声卡问题),遭遇fatal error: linux/limits.h: 没有那个文件或目录

最近帮一位上海的朋友搞一块小板,在ubuntu15.04 vivid上已经加载了对应了.ko驱动包 但关键是系统根本就枚举不到该声卡ALC5640,试了OpenSUSE也是一样的结果,看来是内核漏加载了什么模块. 所以准备重新编译Linux内核3.19.3,结果运行: make?menuconfig 得到错误提示: ? ? ? ? local_lim.h:38:26: fatal error: linux/limits.h ? 应该是在linux目录下找不到limits.h文件.有诸多兄弟碰到过

自定义配置编译linux内核

1 编译linux内核原因一般情况下,我们是不需要重新去编译linux内核的,但如果你发现你需要修改内核的某个部分或者说你需要的某个模块并没有编译进内核,那里你可以通过重新编译内核来满足你的需求,比如当我们需要用bcache时,但默认bcache是没有编译进内核的,我们可以通过修改编译配置文件,将bcache编译进内核,以下的编译操作均是在Centos7.3平台上进行的演示. 2 编译前准备工作2.1 编译用户身份选择官方是强调编译linux内核是强烈不建议以root身份来进行编译的,因为这样有

实例:编译Linux内核3.18.25概要

前提: 将CentOS 7上3.10.0-229.el7.x86_64重新编译一个3.18.25内核 自编译安装,按照自己的硬件平台架构编译,能最适合硬件主机的性能 且按照需要编译模块,可以选择自己需要的包编译 [[email protected] tmp]# uname  -a 一.编译前准备工作 1.宿主机系统 本次编译宿主机:VMware Workstation Pro12 上的CentOS 7.0操作系统 2.开发环境(开发工具,开发库),头文件 [[email protected] y

编译Linux内核

这篇文章的目的是帮助理解如何编译一版Linux内核.熟悉Kconfig KBuild工具.无论是自己修改自己正在使用linux内核还是做嵌入式的交叉编译,都会有一些帮助. 内核编译体系 如果大家接触过一些Linux下的开源软件,就会知道它们使用 autotools 来进行配置及编译.通过执行./config --> make --> make install 命令来编译源代码.Linux内核的编译也需要先配置再编译.配置使用 Kconfig , 编译使用 KBuild , 这两个工具支撑起了L

编译 linux 内核及添加系统调用

后面编译的是 4.2.2 在 gcc4.8 上编译4.14.14 时报不支持堆栈保护 反正都差不多就先编译了 4.2.21.下载 linux 内核源码2.解压放到 /usr/src3.创建软连接 (不一定非得打文件放到 /usr/src 看个人我直接放桌面) [email protected]:~# cd /usr/src [email protected]:/usr/src# ls linux-4.14.14 linux-headers-4.2.0-27-generic linux-heade

CentOs下编译linux内核

● centos 7编译高版本内核: linux-3.13.10 过程相对简单: 1. 安装依赖 yum install ncurses-devel 2. 将linux内核解压缩到/usr.src/ 3. make 4. make modules_install 5. make install 6. 重起