Linux bonding網卡與其slave共同使用

在昨天的一文中,我吐槽了Linux各種虛擬網卡設計的不完備,也只是吐槽,其實我並沒有別的意思,我也懶得去做一些hack型的配置去規避這些不完備,我只是吐槽而已。

昨晚,有網友要求我給出一些解法,因爲他也遇到了這個問題:

  • 他希望被bonding的eth0可以獨立工作,是的,作爲管理口。

於是,這位朋友要求我給出一個解法,我意識到這個需求的普遍性,而且不是每個人都想去配置什麼macvlan,ipvlan的,於是,我就想再寫點。

在我的環境中:

  • enp0s9被bonding到bond0。
  • 我希望bond0處理2.0.0.0/8的流量。
  • 我希望enp0s9處理1.0.0.0/8的流量。
  • 我不希望以上通信受制於bonding的mode。

那麼開始吧。

先看下爲什麼在enp0s9被bonding之後不通,stap一下子就看出來了,先看下現象:

[root@localhost bond]# arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.56.1             ether   0a:00:27:00:00:00   C                     enp0s8
[root@localhost bond]# ping 1.1.1.2
PING 1.1.1.2 (1.1.1.2) 56(84) bytes of data.
From 1.1.1.1 icmp_seq=1 Destination Host Unreachable
From 1.1.1.1 icmp_seq=2 Destination Host Unreachable
From 1.1.1.1 icmp_seq=3 Destination Host Unreachable
From 1.1.1.1 icmp_seq=4 Destination Host Unreachable
^C
--- 1.1.1.2 ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 2999ms
pipe 4
[root@localhost bond]# arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
1.1.1.2                          (incomplete)                              enp0s9
192.168.56.1             ether   0a:00:27:00:00:00   C                     enp0s8

很清晰是不是?

再看下stap的輸出:

[root@localhost bond]# stap -e 'probe kernel.function("arp_process"){name = kernel_string($skb->dev->name); printf("%s\n", name);}'
bond0
bond0
bond0

Oh,yes!arp被bond0接管了,enp0s9作爲slave不再呈現獨立的網卡。

怎麼辦?改了便是!

這裏我覺得就是bonding本身以及其rx_handler實現有問題!!用MAC地址區分一下不就得了??
master把slave屏蔽本身就不合理!!

好,我就按照我的使用場景,改了它,首先,我把作爲master的bond0和作爲slave的enp0s9的MAC地址區分開,分別設置,然後再修改arp_process的處理邏輯:

%{
#include <linux/module.h>
#include <net/bonding.h>
%}

function change_indev:long(skb:long)
%{
	struct sk_buff *_skb = (struct sk_buff *)STAP_ARG_skb;

	STAP_PRINTF(" aa :%s\n", _skb->dev->name);
	if (!strcmp(_skb->dev->name, "bond0")) {
		struct bonding *bond = netdev_priv(_skb->dev);
		struct slave *curr = bond->curr_active_slave;
		STAP_PRINTF(" aa :%s\n", curr->dev->name);
		// 更換一下接收device即可
		_skb->dev = curr->dev; 

	}
%}

probe kernel.function("arp_process")
{
	change_indev($skb);
}

probe begin
{
}

OK,再來一次:

[root@localhost bond]# stap -g ./probe.stp
WARNING: side-effect-free probe: keyword at ./probe.stp:27:1
 source: probe begin
         ^
 aa :bond0
 aa :enp0s9
^C^[[A[

開始ping吧:

[root@localhost bond]# ping 1.1.1.2
PING 1.1.1.2 (1.1.1.2) 56(84) bytes of data.
64 bytes from 1.1.1.2: icmp_seq=1 ttl=64 time=0.480 ms
64 bytes from 1.1.1.2: icmp_seq=2 ttl=64 time=0.417 ms
^C
--- 1.1.1.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.417/0.448/0.480/0.037 ms

通了。

這種問題都是小問題,很容易就能解決,有人可能會說,配置一個macvlan不香嗎?呵呵,我覺得這根本就不是一個問題。

我只管痛則不通,通則不痛,不通的給整通了就行,別的什麼,我纔不關心。

你能說出1000個理由證明這麼做不合理,你也能說出1000個理由維護這麼做的合理性,怎麼說呢?都歸於皮鞋吧。


浙江溫州皮鞋溼,下雨進水不會胖!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章