Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

使用 libteam 取代 bonding
post by tommy @ 15 七月, 2016 09:48

其實在 libteam 剛出來的那時候, 就有意把 bonding 換成 libteam 來使用. 不過... 很奇怪的是在我家的環境下, 使用 libteam 產生的網卡會一直在 DOWN 的狀態, 無法正常使用. 這幾年下來, 每隔一陣子就會用新版的 libteam 試看看, 印象中好像上次最後一次試是 1.19 還是 1.21, 依然無法使用.... 不過... 最近試了 1.24 之後, 發現居然可以正常使用了.

目前 Debian 並沒有在 /etc/network/interfaces 裡頭, 對於 libteam 直接支援, 所以, 必須自己寫一些 script 來跑.

我目前是把相關的設定放在 /etc/network/teamd 這個目錄下, 然後在 interfaces 設定如下:

auto team0
iface team0 inet static
address 192.168.0.1
netmask 255.255.255.0
gateway 192.168.0.254
mtu 8000
pre-up /etc/network/teamd/pre-up.sh
post-up /etc/network/teamd/post-up.sh
post-down /etc/network/teamd/post-down.sh

透過 pre-up 指令來載入 teamd, 然後透過 post-down 指令來釋放 teamd.

pre-up.sh:

#!/bin/bash
 
TEAMD_DIR="/etc/network/teamd"
CONF_FILE="${TEAMD_DIR}/${IFACE}.conf"
 
if [ ! -f ${CONF_FILE} ]; then
echo "file not found: ${CONF_FILE}"
exit 0
fi
 
# remove bonding driver
[ -d /proc/net/bonding ] && rmmod bonding
 
# make sure all slave are down
#ip link set eth0 down
#ip link set eth1 down
 
# create device
teamd -f ${CONF_FILE} -d
 
# make it up
ip link set ${IFACE} up

post-down.sh:

#!/bin/bash
 
TEAMD_DIR="/etc/network/teamd"
CONF_FILE="${TEAMD_DIR}/${IFACE}.conf"
 
if [ ! -f ${CONF_FILE} ]; then
echo "file not found: ${CONF_FILE}"
exit 0
fi
 
teamd -f ${CONF_FILE} -k

post-up.sh (可有可無, 我是為了避免網卡沒跑起來再執行一次 up 的動作):

#!/bin/bash
 
# it might take 10-30 seconds for link up, so try up it by commaind?
ip link set ${IFACE} up

然後是 teamd 的設定 team0.conf:

{
"device": "team0",
"link_watch": {
"name": "ethtool"
},
"ports": {
"eth0": {},
"eth1": {}
},
"runner": {
"active": true,
"fast_rate": true,
"name": "lacp",
"tx_balancer": {
"balancing_interval": 50,
"name": "basic"
},
"tx_hash": [
"eth",
"ipv4",
"ipv6"
]
}
}

這樣子處理後, 就可以正常使用 ifup/ifdown 來操作, 所以在開機時也能正常使用了.

跑了幾天後, 發現 libteam 裡頭對於 debug 訊息似乎沒有控管 (有 debug_level 設定, 不過沒作用), 看了 source, 發現有那個設定, 不過... 幾乎沒用到, 都是直接寫出, 所以, 只好改一下跳過了:

--- libteam-1.24/teamd.orig/teamd.h 2016-04-15 22:41:54.000000000 +0800
+++ libteam-1.24/teamd/teamd.h 2016-07-08 00:45:57.534564733 +0800
@@ -49,7 +49,10 @@
#define teamd_log_err(args...) daemon_log(LOG_ERR, ##args)
#define teamd_log_warn(args...) daemon_log(LOG_WARNING, ##args)
#define teamd_log_info(args...) daemon_log(LOG_INFO, ##args)
+/*
#define teamd_log_dbg(args...) daemon_log(LOG_DEBUG, ##args)
+*/
+static inline void teamd_log_dbg() {}
 
#define teamd_log_dbgx(ctx, val, args...) \
if (val <= ctx->debug) \

看起來應該是使用 teamd_log_dbgx 來產生 debug log 才對, 不過只有不到 10 行是這樣處理, 其它約有四五十行就直接用 teamd_log_dbg 來產生 log.... 改了之後就看不到這些訊息了 (一天近 200MB 的 log, 對多數人來說是垃圾...)

目前跑了一陣子, 其實整體的表現看不出與之前用 bonding 有什麼不同.

Del.icio.us Furl HEMiDEMi Technorati MyShare
迴響
暱稱:
標題:
個人網頁:
電子郵件:
authimage

迴響

  

Bad Behavior 已經阻擋了 52 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS