zoukankan      html  css  js  c++  java
  • 如何通过编译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信息已经多了不少

    参考

    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

  • 相关阅读:
    Jmeter之参数化(4种设置方法)
    Pytest+allure安装和框架搭建
    Xshell~工作中访问Linux服务器
    Jmeter之梯度式加压(Stepping Thread Group)
    Jmeter之压测探索和结果分析
    Jmeter之Linux安装(Xshell),分布式运行Linux作为slave机
    Jmeter之Plugin插件,服务器监控
    Jmeter之分布式测试/压测
    傅立叶
    触发器
  • 原文地址:https://www.cnblogs.com/dspace/p/9714936.html
Copyright © 2011-2022 走看看