1. 程式人生 > >如何通過編譯Linux核心開啟IPVS(LVS)的debug模式

如何通過編譯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