如何通過編譯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資訊已經多了不少
參考
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