您好,欢迎来到花生壳b2b外贸网信息发布平台!
18951535724

Bonding启动流程全解析:系统初始化详细指南

   2026-11-15 网络整理佚名670
核心提示:bond0模块的加载 Bonding原理 为方便理解bonding的配置及实现,顺便阐述一下Linux的网络接口及其配置文件。在 Linux 中

系统设置

kernel support:

#cat /boot/config-4.9.151-015.xxx.xxxx.x86_64  | grep -i BONDING
CONFIG_BONDING=m

设置开机加载:

以使系统在启动时加载bonding模块,对外虚拟网络接口设备为 bond0

[root@localhost /data/sandbox/dpdk-17.11/usertools]
#cat /etc/modprobe.d/bonding.conf
alias netdev-bond0 bonding

[root@localhost /data/sandbox/dpdk-17.11/usertools]
#lsmod  | grep bond
bonding               151552  0

bond0 配置文件

[root@localhost /etc/sysconfig/network-scripts]
#cat ifcfg-eth0
DEVICE=eth0
TYPE="Ethernet"
HWADDR=28:31:52:AA:9E:4A
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
PEERDNS=no
ETHTOOL_OPTS="speed 1000 duplex full autoneg on"
RX_MAX=`ethtool -g "$DEVICE" | grep 'Pre-set' -A1 | awk '/RX/{print $2}'`
RX_CURRENT=`ethtool -g "$DEVICE" | grep "Current" -A1 | awk '/RX/{print $2}'`
[[ "$RX_CURRENT" -lt "$RX_MAX" ]] && ethtool -G "$DEVICE" rx "$RX_MAX"

说明:这里使用了BONDING_OPTS选项,则不需要再使用 /etc/modprobe.conf 配置文件对绑定设备进行配置。参数mode=0,指负载均衡模式,详见下文。miimon是用来进行链路监测的,其原理是检测网上的链路状态,一般将miimon值设为100,表示系统每100ms监测一次链路连接状态,如果有一条线路不通就转入另一条线路。

说明:修改单个网卡配置,主要是去掉IP 地址、子网掩码等信息。同时添加MASTER及SLAVE两项参数。

MASTER=: 的值是以太网卡连接到的通道绑定接口的名称,这个指令与 SLAVE 指令配合使用。

SLAVE=:yes - 表示此设备可以由 MASTER 指令中配置的通道绑定接口进行控制。 no - 表示此设备不能由 MASTER 指令中配置的通道绑定接口进行控制。

[root@localhost /etc/sysconfig/network-scripts]
#cat ifcfg-eth1
DEVICE=eth1
TYPE="Ethernet"
HWADDR=28:31:52:AA:9E:4B
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
PEERDNS=no
ETHTOOL_OPTS="speed 1000 duplex full autoneg on"
RX_MAX=`ethtool -g "$DEVICE" | grep 'Pre-set' -A1 | awk '/RX/{print $2}'`
RX_CURRENT=`ethtool -g "$DEVICE" | grep "Current" -A1 | awk '/RX/{print $2}'`
[[ "$RX_CURRENT" -lt "$RX_MAX" ]] && ethtool -G "$DEVICE" rx "$RX_MAX"

[root@localhost /etc/sysconfig/network-scripts]
#cat ifcfg-bond0
DEVICE=bond0
BOOTPROTO=static
TYPE="ethernet"
IPADDR=10.137.16.5
NETMASK=255.255.255.0
ONBOOT=yes
USERCTL=no
PEERDNS=no
BONDING_OPTS="miimon=100 mode=4 xmit_hash_policy=layer3+4"

[root@localhost /etc/sysconfig/network-scripts]
#ethtool -g eth1
Ring parameters for eth1:
Pre-set maximums:
RX:		4096
RX Mini:	0
RX Jumbo:	0
TX:		4096
Current hardware settings:
RX:		4096
RX Mini:	0
RX Jumbo:	0
TX:		256

[root@localhost /etc/sysconfig/network-scripts]
#ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc mq master bond0 state UP qlen 1000
    link/ether 28:31:52:aa:9e:4a brd ff:ff:ff:ff:ff:ff
3: eth1:  mtu 1500 qdisc mq master bond0 state UP qlen 1000
    link/ether 28:31:52:aa:9e:4a brd ff:ff:ff:ff:ff:ff
4: ens6f0:  mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether d8:49:0b:8c:d1:3c brd ff:ff:ff:ff:ff:ff
5: ens6f1:  mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether d8:49:0b:8c:d1:3d brd ff:ff:ff:ff:ff:ff
6: bond0:  mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether 28:31:52:aa:9e:4a brd ff:ff:ff:ff:ff:ff
    inet 10.137.16.5/24 brd 10.137.16.255 scope global bond0
       valid_lft forever preferred_lft forever

bond0 的生效信息

[root@localhost /data/sandbox/dpdk-17.11/usertools]
#cat  /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
Bonding Mode: IEEE 802.3ad Dynamic link aggregation   <<===bonding mode 4
Transmit Hash Policy: layer3+4 (1)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
802.3ad info
LACP rate: slow
Min links: 0
Aggregator selection policy (ad_select): stable
System priority: 65535
System MAC address: 28:31:52:aa:9e:4a
Active Aggregator Info:
	Aggregator ID: 1
	Number of ports: 2
	Actor Key: 9
	Partner Key: 10
	Partner Mac Address: 74:25:8a:bc:2f:1c
Slave Interface: eth0              <<======eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 28:31:52:aa:9e:4a
Slave queue ID: 0
Aggregator ID: 1
Actor Churn State: none
Partner Churn State: none
Actor Churned Count: 0
Partner Churned Count: 0
details actor lacp pdu:
    system priority: 65535
    system mac address: 28:31:52:aa:9e:4a
    port key: 9
    port priority: 255
    port number: 1
    port state: 61
details partner lacp pdu:
    system priority: 32768
    system mac address: 74:25:8a:bc:2f:1c
    oper key: 10
    port priority: 32768
    port number: 10
    port state: 61
Slave Interface: eth1               <<======eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 28:31:52:aa:9e:4b
Slave queue ID: 0
Aggregator ID: 1
Actor Churn State: none
Partner Churn State: none
Actor Churned Count: 0
Partner Churned Count: 0
details actor lacp pdu:
    system priority: 65535
    system mac address: 28:31:52:aa:9e:4a
    port key: 9
    port priority: 255
    port number: 2
    port state: 61
details partner lacp pdu:
    system priority: 32768
    system mac address: 74:25:8a:bc:2f:1c
    oper key: 10
    port priority: 32768
    port number: 117
    port state: 61

查看当前速率


[root@localhost /etc/sysconfig/network-scripts]
#ethtool bond0
Settings for bond0:
	Supported ports: [ ]
	Supported link modes:   Not reported
	Supported pause frame use: No
	Supports auto-negotiation: No
	Advertised link modes:  Not reported
	Advertised pause frame use: No
	Advertised auto-negotiation: No
	Speed: 2000Mb/s
	Duplex: Full
	Port: Other
	PHYAD: 0
	Transceiver: internal
	Auto-negotiation: off
	Link detected: yes

内核网卡接口

[root@localhost /etc/sysconfig/network-scripts]
#ll /sys/class/net/eth0/
total 0
-r--r--r--  1 root root 4096 May  7 14:11 addr_assign_type
-r--r--r--  1 root root 4096 May  7 03:48 address
-r--r--r--  1 root root 4096 May  7 14:11 addr_len
drwxr-xr-x  2 root root    0 May  7 14:11 bonding_slave
-r--r--r--  1 root root 4096 May  7 14:11 broadcast
-rw-r--r--  1 root root 4096 May  7 10:21 carrier
-r--r--r--  1 root root 4096 May  7 14:11 carrier_changes
lrwxrwxrwx  1 root root    0 May  6 17:07 device -> ../../../0000:01:00.0
-r--r--r--  1 root root 4096 May  7 14:11 dev_id
-r--r--r--  1 root root 4096 May  7 10:21 dev_port
-r--r--r--  1 root root 4096 May  7 14:11 dormant
-r--r--r--  1 root root 4096 May  7 14:11 duplex
-rw-r--r--  1 root root 4096 May  7 14:11 flags
-rw-r--r--  1 root root 4096 May  7 14:11 gro_flush_timeout
-rw-r--r--  1 root root 4096 May  7 05:20 ifalias
-r--r--r--  1 root root 4096 May  7 14:11 ifindex
-r--r--r--  1 root root 4096 May  7 14:11 iflink
-r--r--r--  1 root root 4096 May  7 14:11 link_mode
lrwxrwxrwx  1 root root    0 May  7 14:11 master -> ../../../../../virtual/net/bond0
-rw-r--r--  1 root root 4096 May  7 03:48 mtu
-r--r--r--  1 root root 4096 May  7 14:11 name_assign_type
-rw-r--r--  1 root root 4096 May  7 14:11 netdev_group
-r--r--r--  1 root root 4096 May  6 17:07 operstate
-r--r--r--  1 root root 4096 May  7 14:11 phys_port_id
-r--r--r--  1 root root 4096 May  7 14:11 phys_port_name
-r--r--r--  1 root root 4096 May  7 14:11 phys_switch_id
drwxr-xr-x  2 root root    0 May  7 10:38 power
-rw-r--r--  1 root root 4096 May  7 14:11 proto_down
drwxr-xr-x 18 root root    0 May  7 10:38 queues
-r--r--r--  1 root root 4096 May  7 14:11 speed
drwxr-xr-x  2 root root    0 May  7 10:38 statistics
lrwxrwxrwx  1 root root    0 May  7 14:11 subsystem -> ../../../../../../class/net
-rw-r--r--  1 root root 4096 May  7 14:11 tx_queue_len
-r--r--r--  1 root root 4096 May  7 14:11 type
-rw-r--r--  1 root root 4096 May  7 14:11 uevent
lrwxrwxrwx  1 root root    0 May  7 14:11 upper_bond0 -> ../../../../../virtual/net/bond0

从ifup看bond0的初始化过程

ifup eth0
	/etc/sysconfig/network-scripts/ifup-eth ifcfg-eth0
		network-functions
			install_bonding_driver  // 如果 #cat /sys/class/net/bonding_masters 不存在,就执行:modprobe bonding

在 /etc/sysconfig/network-scripts/ifup-eth 文件中, 完成bond 驱动的加载和初始化 :

下面看看对于slave device的处理,比如eth0,如果eth0不在/sys/class/net/bond0/bonding/slaves 文件中,那么需要先down掉(/sbin/ip link set dev ${DEVICE} down)eth0设备,将eth0 写入到bond0的配置/sys/class/net/bond0/bonding/slaves中;

先看对slave设备的处理

# slave device?
if [ "${SLAVE}" = yes -a "${ISALIAS}" = no -a "${MASTER}" != "" ]; then
    install_bonding_driver ${MASTER}
    grep -wq "${DEVICE}" /sys/class/net/${MASTER}/bonding/slaves 2>/dev/null || {
    /sbin/ip link set dev ${DEVICE} down
    echo "+${DEVICE}" > /sys/class/net/${MASTER}/bonding/slaves 2>/dev/null
    }
    ethtool_set  <<<=====这里根据 #cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep ETHTOOL_OPTS 参数,
                 ### 对eth0网卡进行配置,实际执行命令是:`/sbin/ethtool -s eth0 speed 1000 duplex full autoneg on`
    exit 0
fi
[root@localhost /data/sandbox/cyberstar]
#cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep ETHTOOL_OPTS
ETHTOOL_OPTS="speed 1000 duplex full autoneg on"

ethtool_set()
{
    oldifs=$IFS;
    IFS=';';
    [ -n "${ETHTOOL_DELAY}" ] && /bin/usleep ${ETHTOOL_DELAY}
    for opts in $ETHTOOL_OPTS ; do
    IFS=$oldifs;
        if [[ "${opts}" =~ [[:space:]]*- ]]; then
        /sbin/ethtool $opts
        else
        /sbin/ethtool -s ${REALDEVICE} $opts
        fi
    IFS=';';
    done
    IFS=$oldifs;
}

再看对master设备的处理

# Bonding initialization. For DHCP, we need to enslave the devices early,
# so it can actually get an IP.
if [ "$ISALIAS" = no ] && is_bonding_device ${DEVICE} ; then
    install_bonding_driver ${DEVICE}
    /sbin/ip link set dev ${DEVICE} up
    for device in $(LANG=C grep -l "^[[:space:]]*MASTER=\"\?${DEVICE}\"\?\([[:space:]#]\|$\)" /etc/sysconfig/network-scripts/ifcfg-*) ; do
        is_ignored_file "$device" && continue
        /sbin/ifup ${device##*/} || net_log "Unable to start slave device ${device##*/} for master ${DEVICE}." warning
    done
    [ -n "${LINKDELAY}" ] && /bin/sleep ${LINKDELAY}
    # add the bits to setup the needed post enslavement parameters
    for arg in $BONDING_OPTS ; do
        key=${arg%%=*};
        value=${arg##*=};
    if [ "${key}" = "primary" ]; then
            echo $value > /sys/class/net/${DEVICE}/bonding/$key
    fi
    done
fi

判断依据

主要看install_bonding_driver 函数的逻辑,来分析bond的初始化过程:

[root@localhost /data/sandbox/cyberstar]
#cat /sys/class/net/bonding_masters
bond0

如果/sys/class/net/bond0/bonding/slaves 文件少于1行,表示,bonding没有配置好,同样判断一个设备是否是 bonding设备,也可以根据这个文件是否存在来判断:

[root@localhost /data/sandbox/cyberstar]
#cat /sys/class/net/bond0/bonding/slaves
eth1 eth0

如果bond没有配置好,则,继续,配置如下几个kernel 参数:

[root@localhost /data/sandbox/cyberstar]
#cat /sys/class/net/bond0/bonding/mode
802.3ad 4
[root@localhost /data/sandbox/cyberstar]
#cat /sys/class/net/bond0/bonding/miimon
100

 
举报收藏 0打赏 0评论 0
更多>相关评论
暂时没有评论,来说点什么吧
更多>同类百科知识
推荐图文
推荐百科知识