How to manage linux bonding without ifenslave using sysfs
While working with a vyatta linux system I encountered a situation where bonded network interfaces were configured but the server didn’t have the ifenslave tool installed. As it turns out, linux bonded interfaces are easily managed directly through a simple sysfs interface. Here’s a quick run down of how to manage linux bonding without ifenslave using sysfs.
Create a new bond interface called bond0 using eth0 and eth1
#modprobe bond echo "+bond0" > /sys/class/net/bonding_masters echo "+eth0" > /sys/class/net/bond0/bonding/slaves echo "+eth1" > /sys/class/net/bond0/bonding/slaves |
Remove a slave interface from bond0
echo "-eth0" > /sys/class/net/bond0/bonding/slaves |
Delete a bond interface
echo "-bond0" > /sys/class/net/bonding_masters |
Additional documentation
If you’re looking for more info here is the complete sysfs interface documentation from the linux kernel bonding driver
3.4 Configuring Bonding Manually via Sysfs ------------------------------------------ Starting with version 3.0.0, Channel Bonding may be configured via the sysfs interface. This interface allows dynamic configuration of all bonds in the system without unloading the module. It also allows for adding and removing bonds at runtime. Ifenslave is no longer required, though it is still supported. Use of the sysfs interface allows you to use multiple bonds with different configurations without having to reload the module. It also allows you to use multiple, differently configured bonds when bonding is compiled into the kernel. You must have the sysfs filesystem mounted to configure bonding this way. The examples in this document assume that you are using the standard mount point for sysfs, e.g. /sys. If your sysfs filesystem is mounted elsewhere, you will need to adjust the example paths accordingly. Creating and Destroying Bonds ----------------------------- To add a new bond foo: # echo +foo > /sys/class/net/bonding_masters To remove an existing bond bar: # echo -bar > /sys/class/net/bonding_masters To show all existing bonds: # cat /sys/class/net/bonding_masters NOTE: due to 4K size limitation of sysfs files, this list may be truncated if you have more than a few hundred bonds. This is unlikely to occur under normal operating conditions. Adding and Removing Slaves -------------------------- Interfaces may be enslaved to a bond using the file /sys/class/net/<bond>/bonding/slaves. The semantics for this file are the same as for the bonding_masters file. To enslave interface eth0 to bond bond0: # ifconfig bond0 up # echo +eth0 > /sys/class/net/bond0/bonding/slaves To free slave eth0 from bond bond0: # echo -eth0 > /sys/class/net/bond0/bonding/slaves When an interface is enslaved to a bond, symlinks between the two are created in the sysfs filesystem. In this case, you would get /sys/class/net/bond0/slave_eth0 pointing to /sys/class/net/eth0, and /sys/class/net/eth0/master pointing to /sys/class/net/bond0. This means that you can tell quickly whether or not an interface is enslaved by looking for the master symlink. Thus: # echo -eth0 > /sys/class/net/eth0/master/bonding/slaves will free eth0 from whatever bond it is enslaved to, regardless of the name of the bond interface. Changing a Bond's Configuration ------------------------------- Each bond may be configured individually by manipulating the files located in /sys/class/net/<bond name>/bonding The names of these files correspond directly with the command- line parameters described elsewhere in this file, and, with the exception of arp_ip_target, they accept the same values. To see the current setting, simply cat the appropriate file. A few examples will be given here; for specific usage guidelines for each parameter, see the appropriate section in this document. To configure bond0 for balance-alb mode: # ifconfig bond0 down # echo 6 > /sys/class/net/bond0/bonding/mode - or - # echo balance-alb > /sys/class/net/bond0/bonding/mode NOTE: The bond interface must be down before the mode can be changed. To enable MII monitoring on bond0 with a 1 second interval: # echo 1000 > /sys/class/net/bond0/bonding/miimon NOTE: If ARP monitoring is enabled, it will disabled when MII monitoring is enabled, and vice-versa. To add ARP targets: # echo +192.168.0.100 > /sys/class/net/bond0/bonding/arp_ip_target # echo +192.168.0.101 > /sys/class/net/bond0/bonding/arp_ip_target NOTE: up to 16 target addresses may be specified. To remove an ARP target: # echo -192.168.0.100 > /sys/class/net/bond0/bonding/arp_ip_target To configure the interval between learning packet transmits: # echo 12 > /sys/class/net/bond0/bonding/lp_interval NOTE: the lp_inteval is the number of seconds between instances where the bonding driver sends learning packets to each slaves peer switch. The default interval is 1 second. Example Configuration --------------------- We begin with the same example that is shown in section 3.3, executed with sysfs, and without using ifenslave. To make a simple bond of two e100 devices (presumed to be eth0 and eth1), and have it persist across reboots, edit the appropriate file (/etc/init.d/boot.local or /etc/rc.d/rc.local), and add the following: modprobe bonding modprobe e100 echo balance-alb > /sys/class/net/bond0/bonding/mode ifconfig bond0 192.168.1.1 netmask 255.255.255.0 up echo 100 > /sys/class/net/bond0/bonding/miimon echo +eth0 > /sys/class/net/bond0/bonding/slaves echo +eth1 > /sys/class/net/bond0/bonding/slaves To add a second bond, with two e1000 interfaces in active-backup mode, using ARP monitoring, add the following lines to your init script: modprobe e1000 echo +bond1 > /sys/class/net/bonding_masters echo active-backup > /sys/class/net/bond1/bonding/mode ifconfig bond1 192.168.2.1 netmask 255.255.255.0 up echo +192.168.2.100 /sys/class/net/bond1/bonding/arp_ip_target echo 2000 > /sys/class/net/bond1/bonding/arp_interval echo +eth2 > /sys/class/net/bond1/bonding/slaves echo +eth3 > /sys/class/net/bond1/bonding/slaves |
https://www.kernel.org/doc/Documentation/networking/bonding.txt