[daily] 不让NetworkManger自动接管网络设备
一 场景描述
有一个dpdk程序,在运行时使用了rte kni。
它启动的时候,会自动给系统增加一个网卡设备,停止运行的时候又会把它去掉。像这样:
[root@T9 gen-py]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo ... ... 25: kni_vpu: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 96:46:c3:ca:9c:99 brd ff:ff:ff:ff:ff:ff inet 192.168.8.9/24 brd 192.168.8.255 scope global kni_vpn valid_lft forever preferred_lft forever
就是名叫 kni_vpu 的那一个,然后程序还会给它配上一个地址,这里的例子是192.168.8.9
二 问题
然后,运行一小会。问题就来了。192.168.8.9上的地址不见了。消失了。没有了。
是谁搞的鬼呢?
三 分析
分析这个问题,首先从内外两方面入手,对内看一下dmesg,对外tcpdump抓个包。然后重现一下,等待ip消失的那一个瞬间。
dmesg没有任何输出,但是tcpdump发现了dhcp的报文:
11:15:20.192103 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from e2:fc:36:42:6f:71, length 300
这个MAC(e2fc)就是我的那个kni口的mac。
所以一点是网络管理utility,启动了dhcp把我的ip干掉了。
[root@T9 ~]# ps -ef |grep dh root 30337 3566 0 11:04 ? 00:00:00 /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-kni_vpn.pid
-lf /var/lib/NetworkManager/dhclient-ef87da69-b085-309c-969f-8dbab61bce38-kni_vpn.lease -cf /var/lib/NetworkManager/dhclient-kni_vpn.conf kni_vpn
网络管理用了NetworkManager,查看一下配置,果然是这样的:
[root@T9 ~]# ps -ef |grep dh root 30337 3566 0 11:04 ? 00:00:00 /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-kni_vpn.pid -lf /var/lib/NetworkManager/dhclient-ef87da69-b085-309c-969f-8dbab61bce38-kni_vpn.lease -cf /var/lib/NetworkManager/dhclient-kni_vpn.conf kni_vpn [root@T9 ~]# nmcli c show ef87da69-b085-309c-969f-8dbab61bce38 connection.id: Wired connection 1 connection.uuid: ef87da69-b085-309c-969f-8dbab61bce38 ...... ipv4.method: auto ......
NetworkManger这个货真是越来越高级了,着实让人喜爱。
四 处理方案
很显然,这是NetworkManger支持了auto detect,auto plugin之类的功能。查一下手册:
man 5 NetworkManager.conf
用多种方案可以配,总的原则就是配置黑白名单。写到/etc/NetworkManager/NetworkManager.conf 配置文件里。
白名单就这样:
[keyfile] unmanaged-devices=interface-name:kni_vpn
黑名单就这样:
[main] no-auto-default=*
然后,我采用的黑名单的配法,这样配置就等于关闭了auto detect的属性,只有明确的手工配置的网卡,才会被networkmanager管理。
(一) 放在子配置文件中
如果man手册所述, 我们不用修改主配置文件/etc/NetworkManager/NetworkManager.conf, 任何配置都应该以子配置文件的形式,放在以下三个位置之一
/etc/NetworkManager/conf.d/name.conf /run/NetworkManager/conf.d/name.conf /usr/lib/NetworkManager/conf.d/name.conf
如:
[root@vpn103 ~]# cat /etc/NetworkManager/conf.d/tong.conf [keyfile] ummanged-devices=interface-name:kni_vpn
然后, 再发一个SIGHUP给进程,通知它重新load配置